[객체기반SW설계] #Mission 1, JAVA 친구정보 프로그램
문제, 친구정보를 입력하고 기능들을 실행하는 프로그램을 작성하시오.
-시스템 구조도
package의 종류과 class의 종류는 다음과 같습니다. |
|
▶FriendList는 Friend의 head가지고 있는 class입니다. Friend는 name과 phoneNumber의 정보를 가지고 있습니다.
▶전체적인 구조도입니다.
-code 설명
#main 메소드
code |
설명 |
|
main메소드에 작성된 코드내용을 순서로 중요하고 필요한 코드만 설명하겠습니다. |
#Friend클래스 객체 설명
Friend 객체 |
설명 |
|
Friend는 name과 phoneNumber의 정보를 가지고 있고 취미를 SLL로 구현하기 위해 SLLNodeClass의 head를 가지고 있는 SLLClass객체가 생성되어 있습니다. |
#FriendList클래스에서 Friend클래스의 Head설정, Friend클래스 객체 추가
FriendList setHead(Friend newFriend), getHead() |
설명 |
|
친구의 정보를 가지고 있는 클래스 Friend의 head는 FriendList 클래스가 가지고 있습니다. Friend가 아직 들어오지 않았다면 headF는 비어있기 때문에 headF의 초기값은 null로 설정해줍니다. 가장 먼저 Friend 클래스가 들어오면 setHead 메소드를 이용하여 headF를 채워줍니다. getHead 메소드는 head가 비어있는지 채워져있는지 판단을 하기 위해 head를 반환해줍니다. head가 비어있다면 null을 반환하게 됩니다. |
FriendList addFriend(Friend newFriend) |
설명 |
|
FriendList에 처음 Friend를 추가해준다면 setHead 메소드를 이용하면 되지만 head가 채워진 그 이후에 Friend를 추가한다면 SLL형태(next 이용)로 추가가 되는 addFriend 메소드가 필요합니다. addFriend에서는 먼저 Friend에서 시작 역할을 하는 headF의 next가 비어있는지 채워져 있는지 판단이 필요한데 그 판단을 위해서 Friend객체안에 next를 반환해주는 getNext 메소드를 이용합니다. 만약 null이 반환될 경우는 head의 next가 비어있으므로 head.next에 새로운 Friend객체를 추가해줍니다. 만약 null이 아닌 값을 반환하면 head를 가르키는 포인터 temp를 지정해주고 temp를 getNext 메소드를 이용하여 비워있는 자리를 찾을 때 까지 이동시킵니다. 비워있는 자리를 발견하면 그 자리에 새로운 Friend객체를 추가해줍니다. |
==> 현재까지의 코드설명으로 보시면 다음과 같은 SLL이 구현됩니다.
#SLLNodeClass클래스 객체 설명
SLLNodeClass객체 |
설명 |
|
SLLNodeClass는 각 Friend객체들이 가지고 있는 취미들은 SLL로 구현이 될 때 그 SLL들의 node역할을 하는 클래스입니다. SLLNodeClass는 자신만이 접근가능한 private member variable인 data=>취미 정보를 가지고 있고 자신과 연결되어있는 SLLNodeClass 타입의 next를 가지고 있습니다. |
#SLLClass클래스에서 SLLNodeClass클래스의 Head설정, SLLNodeClass클래스 객체 추가
SLLClass setHead(String newdata), getHead() |
설명 |
|
취미의 정보를 가지고 있는 클래스 SLLNodeClass의 head는 SLLClass 클래스가 가지고 있습니다. 취미가 아직 들어오지 않았다면 head는 비어있기 때문에 head의 초기값은 null로 설정해줍니다. 가장 먼저 data가 들어오면 추가된 data를 담는 SLLNodeClass객체를 생성하고 setHead 메소드를 이용하여 head에 채워줍니다. getHead 메소드는 head가 비어있는지 채워져있는지 판단을 하기 위해 head를 반환해줍니다. head가 비어있다면 null을 반환하게 됩니다. |
SLLClass addNewNode(String newdata) |
설명 |
|
SLLClass에 처음으로 data가 들어온다면 setHead 메소드를 이용하면 되지만 head가 채워진 그 이후에 data를 추가한다면 SLL형태(next 이용)로 추가가 되는 addNewNode 메소드가 필요합니다. addNewNode에서는 먼저 새로 추가된 data를 담는 SLLNodeClass 클래스를 생성하고 head의 next가 비어있는지 채워져 있는지 판단이 필요한데 그 판단을 위해서 SLLNodeClass객체안에 next를 반환해주는 getNext 메소드를 이용합니다. 만약 null이 반환될 경우는 head의 next가 비어있으므로 head.setNext로 새로운 data를 담은 addNewNode객체를 추가해줍니다. 만약 null이 아닌 값을 반환하면 head를 가르키는 포인터 temp를 지정해주고 temp를 getNext 메소드를 이용하여 비워있는 자리를 찾을 때 까지 이동시킵니다. 비워있는 자리를 발견하면 그 자리에 새로운 Friend객체를 추가해줍니다. |
#Friend클래스에서의 SLLClass클래스
Friend클래스 <=> SLLClass클래스 관계 |
설명 |
|
Friend클래스 객체 하나당 SLLClass클래스 객체를 하나가집니다. |
==> 현재까지의 코드설명으로 보시면 다음과 같은 완성된 SLL이 구현됩니다.
#Friend클래스의 addHobby메소드
addHobby(String newHobby) |
설명 |
|
hobbyList는 현재 Friend객체에 있는 SLLClass클래스의 객체입니다. |
|
취미를 추가하는 과정입니다. Friend클래스 객체에 있는 SLLClass hobbyList는 취미를 담고있는 node개념인 SLLNodeClass의 head를 가지고 있습니다. hobbyList의 head를 반환해주는 getHead메소드를 이용하여 현재 head가 비어있는지 채워져있는지 구분합니다. 만약 head가 비어있다면 head에 추가해주는 setHead메소드를 이용하여 새로운 취미data를 추가해줍니다. 만약 head가 채워져있다면 빈자리를 찾아서 그 자리에 추가해주는 SLLClass클래스의 메소드인 addNewNode를 사용합니다. |
#SLLClass클래스의 addNewNode메소드
addNewNode(String newHobby) |
설명 |
|
SLLClass클래스의 addNewNode메소드는 받은 String타입의 data를 받아 SLLNodeClass클래스 객체를 생성하여 그 data를 생성한 클래스 객체에 담아줍니다. 만약에 SLLNodeClass의 head의 next를 반환해주는 getNext메소드를 이용하여 현재 head의 next가 비어있는지 채워져있는지 구분합니다. 만약 next가 비어있다면 head.next에 추가해주는 setNext메소드를 이용하여 추가해줍니다. 만약 head가 채워져있다면 head를 가리키고 있는 포인터 temp를 지정해주고 temp를 getNext 메소드를 이용하여 비워있는 자리를 찾을 때 까지 이동시킵니다. 비워있는 자리를 발견하면 그 자리에 새로 만든 SLLNodeClass객체를 setNext메소드를 이용하여 추가해줍니다. |
#FriendList클래스에서 name, phoneNumber의 일부분을 검색하여 해당된 Friend객체들의 정보를 출력
findFriendByName(String searchData) |
설명 |
|
data n을 받아 이름 중에 n을 포함하고 있는 이름을 가진 Friend가 있다면 그 객체의 이름을 출력해주는 메소드입니다. Friend의 head를 가리키는 포인터 temp를 지정해줍니다. temp를 이동시키면서, Friend객체가 가지고 있는 이름을 반납해주는 getName메소드를 이용하여 비교를 해줍니다. na String변수는 그 Friend객체가 반납하는 이름을 받고 String클래스의 포함되어있는지 아닌지 구분하는 contains메소드를 사용하여 true를 반환받으면 출력을 해줍니다. |
findFriendByPhoneNum(String searchData) |
설명 |
|
data p를 받아 전화번호 중에 p을 포함하고 있는 전화번호을 가진 Friend가 있다면 그 객체의 이름을 출력해주는 메소드입니다. Friend의 head를 가리키는 포인터 temp를 지정해줍니다. temp를 이동시키면서, Friend객체가 가지고 있는 이름을 반납해주는 getName메소드를 이용하여 비교를 해줍니다. na String변수는 그 Friend객체가 반납하는 전화번호를 받고 String클래스의 포함되어있는지 아닌지 구분하는 contains메소드를 사용하여 true를 반환받으면 출력을 해줍니다. |
#hobby의 일부분을 검색하여 해당된 Friend객체들의 정보를 출력
findFriendByHobby(String searchData) |
설명 |
|
※ FriendList 클래스 data ho를 받아 취미 중에 ho를 포함하고 있는 취미를 가진 Friend가 있다면 그 객체의 이름을 출력해주는 메소드입니다. Friend의 head를 가리키는 포인터 temp를 지정해줍니다. temp를 이동시키면서, Friend객체가 이 data를 가지고 있는지 없는지 확인해주는 hasHobby메소드를 이용하여 비교를 해줍니다. 이 data가 있다면 true를 반환하고 없다면 false를 반환시켜줍니다. true가 반환되면 해당 Friend객체의 이름을 출력해줍니다. |
|
※ Friend 클래스 Friend클래스에 있는 hasHobby메소드는 SLLClass클래스 객체인 hobbyList에 받은 data를 넘겨줍니다. data를 넘기면 받은 hobbyList객체에서 SLLNodeClass를 모두 검색하여 있는지 없는지 boolean형태로 반환해줍니다. - true를 반환받으면 return true - false를 반환받으면 return false |
|
※ SLLClass 클래스 SLLClass클래스에 있는 includeNode메소드는 실질적으로 취미 data를 검색하는 메소드입니다. SLLNodeClass의 head를 포인터 temp로 지정줍니다. temp를 이동시키면서 연결된 모든 SLLNodeClass객체들의 getData메소드를 이용하여 비교할 d와 비교를 해줍니다. 만약 포함이 되어있으면 해당 Friend는 이 취미를 가지고 있으므로 true를 반환시켜주고 메소드를 빠져나옵니다. |
-전체 code
※ package univ.inu.mgmt
-class Friend
-class FriendList
Friend class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | package univ.inu.mgmt; import univ.inu.utils.SLLClass; import univ.inu.utils.SLLNodeClass; public class Friend { private String name; private String phoneNumber; private Friend nextF=null; private SLLClass hobbyList=new SLLClass(); public Friend(String name_, String phoneNumber_) { name = name_; phoneNumber = phoneNumber_; } public void setNext(Friend n) { nextF=n; } public Friend getNext() { return nextF; } public String getName() { return name; } public String getPhoneNumber() { return phoneNumber; } public void setName(String name_) { name = name_; } public void setPhoneNumber(String phoneNumber_) { phoneNumber = phoneNumber_; } public void addHobby(String h) { if(hobbyList.getHead()==null) { hobbyList.setHead(h); } else { hobbyList.addNewNode(h); } } public void showHobby() { SLLNodeClass temp = hobbyList.getHead(); while(temp != null) { System.out.println(temp.getData()); temp = temp.getNext(); } } public boolean hasHobby(String str) { if(hobbyList.includeNode(str)) { return true; } else { return false; } } } | cs |
FriendList class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | package univ.inu.mgmt; import univ.inu.utils.*; public class FriendList { private Friend headF; public Friend getHead() { return headF; } public void setHead(Friend h) { headF=h; } public void addFriend(Friend F) { if(headF.getNext()==null) { headF.setNext(F); } else { Friend temp=headF; while(temp.getNext()!=null) { temp=temp.getNext(); } temp.setNext(F); } } public void showAllFrieds() { Friend temp = headF; while(temp != null) { System.out.println("이름: "+temp.getName()+", 전화번호: "+temp.getPhoneNumber()); temp = temp.getNext(); } } public void findFriendByName(String n) { Friend temp=headF; System.out.println("이름 중 "+n+" 을 가진 친구는 "); while(temp!=null) { String na=temp.getName(); if(na.contains(n)) { System.out.print(temp.getName()+", "); } temp=temp.getNext(); } System.out.println("입니다."); } public void findFriendByPhoneNum(String p) { Friend temp=headF; System.out.println("전화번호 중 "+p+" 을 포함한 친구는 "); while(temp!=null) { String na=temp.getPhoneNumber(); if(na.contains(p)) { System.out.print(temp.getName()+", "); } temp=temp.getNext(); } System.out.println("입니다."); } public void findFriendByHobby(String ho) { Friend temp=headF; System.out.println("취미 중 "+ho+"를 가진 친구는 "); while(temp!=null) { if(temp.hasHobby(ho)==true) { System.out.print(temp.getName()+", "); } temp=temp.getNext(); } System.out.println("입니다."); } } | cs |
※ package univ.inu.utils
-class SLLClass
-class SLLNodeClass
SLLClass class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | package univ.inu.utils; import univ.inu.mgmt.Friend; public class SLLClass { private SLLNodeClass head; public SLLNodeClass getHead() { return head; } public void setHead(String h) { SLLNodeClass hh = new SLLNodeClass(h); head=hh; } public void addNewNode(String h) { SLLNodeClass hh = new SLLNodeClass(h); if(head.getNext()==null) { head.setNext(hh); } else { SLLNodeClass temp=head; while(temp.getNext()!=null) { temp=temp.getNext(); } temp.setNext(hh); } } public void showAll() { SLLNodeClass temp = head; while(temp != null) { System.out.println(temp.getData()+" "); temp = temp.getNext(); } } public boolean includeNode(String d) { SLLNodeClass temp=head; String na; while(temp!=null) { na=temp.getData(); if(na.contains(d)) { return true; } temp=temp.getNext(); } return false; } } | cs |
SLLNodeClass class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | package univ.inu.utils; import univ.inu.mgmt.Friend; public class SLLNodeClass { private String data; public SLLNodeClass next=null; public SLLNodeClass(String data_) { data = data_; } public String getData() { return data; } public SLLNodeClass getNext() { return next; } public void setData(String data_) { data = data_; } public void setNext(SLLNodeClass next_) { next = next_; } } | cs |
※ package univ.inu.test
-class test
test class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | package univ.inu.test; import univ.inu.mgmt.*; public class test { public static void main(String[] argv) { Friend f1 = new Friend("이상은","010-****-****"); f1.addHobby("자바"); f1.addHobby("공부"); f1.addHobby("당근이랑 놀기"); Friend f2 = new Friend("이원민","010-****-****"); f2.addHobby("운동"); f2.addHobby("공부"); Friend f3 = new Friend("홍길동","010-****-****"); f3.addHobby("자바"); f3.addHobby("당근이랑 놀기"); f3.addHobby("운동"); FriendList fl = new FriendList(); fl.setHead(f1); fl.addFriend(f2); fl.addFriend(f3); fl.showAllFrieds(); System.out.println(); fl.findFriendByName("이"); System.out.println(); fl.findFriendByPhoneNum("****"); fl.findFriendByPhoneNum("****"); System.out.println(); fl.findFriendByHobby("운동"); fl.findFriendByHobby("공부"); System.out.println(); } } | cs |
-결과