Java 기초 상속(7) - 전화번호부
728x90
기본 환경
JDK : 1.8.0_261 버전 JRE : 1.8.0_261 버전 JAVA VERSION : 8 업데이트 261 Eclipse IDE VERSION : 2020-06버전 |
목표
상속과 오버라이딩을 이용하여 효율적인 친구관리 프로그램을 만들어본다.
코드
package ex12inheritance; import java.util.Scanner; /* 친구를 표현한 최상위 클래스로 해당 프로그램에서는 Friend 클래스로 객체생성은 하지 않는다. 상속의 목적으로면 정의된 클래스이다. */ class Friend { // 멤버변수 String name; // 이름 String phone; // 번호 String addr; // 주소 // 생성자 public Friend(String name, String phone, String addr) { this.name = name; this.phone = phone; this.addr = addr; } // 멤버메소드 /* * 맴버변수 전체 정보를 출력하는 메소드 */ public void showAllData() { System.out.println("이름 : " + name); System.out.println("전화번호 : " + phone); System.out.println("주소 : " + addr); } /* * 간략한 정보만 출력하는 멤버메소드로, 현재 실행부가 없는 상태로 정의되었다. 해당 프로그램에서는 오버라이딩의 목적으로 정의되었다. */ public void showBasicInfo() { } } class HighFriend extends Friend { String nickname; // 자식에서 확장한 멤버변수 public HighFriend(String name, String phone, String addr, String nickname) { super(name, phone, addr); this.nickname = nickname; } /* * 고딩친구의 전체정보를 출력하기 위해 부모에서 정의된 메소드를 super를 통해 호출하고, 자식에서 확장한 변수를 별도의 print문을 통해 * 출력하고 있다. */ @Override public void showAllData() { System.out.println("==고딩친구(전체정보)=="); super.showAllData(); System.out.println("별명 : " + nickname); } /* * 자식에서 오버라이딩 하여 재정의한 메소드로 고딩친구의 간략한 정보를 출력한다. */ @Override public void showBasicInfo() { System.out.println("==고딩친구=="); System.out.println("별명 : " + nickname); System.out.println("전번 : " + phone); } } class UnivFriend extends Friend { String major; // 자식에서 확장한 멤버변수 public UnivFriend(String name, String phone, String addr, String major) { super(name, phone, addr); this.major = major; } @Override public void showAllData() { System.out.println("==대딩친구(전체정보)=="); super.showAllData(); System.out.println("전공 : " + major); }////end of showAllData @Override public void showBasicInfo() { System.out.println("==대딩친구=="); System.out.println("이름 : " + name); System.out.println("전화번호 : " + phone); } } public class E10MyFriendInfoBook { public static void menuShow() { System.out.println("***메뉴를 선택하세요***"); System.out.println("1. 고딩친구 입력"); System.out.println("2. 대딩친구 입력"); System.out.println("3. 전체정보 출력"); System.out.println("4. 간략정보 출력"); System.out.println("5. 검색"); System.out.println("6. 삭제"); System.out.println("7. 프로그램 종료"); System.out.print("메뉴 선택 >>>"); } // 프로그램 전반의 흐름에 대해서만 기술하고 관련 함수를 호출하는 정도로만 구성. public static void main(String[] args) { // 프로그램의 비지니스 로직을 가진 핸들러 객체를 생성 FriendInfoHandler handler = new FriendInfoHandler(100); /* * 연락처 정보를 저장할 객체배열의 크기를 100으로 초기화함 */ // 무한 루프로 구성하여 사용자가 종료하는 시점에 프로그램 종료됨. while (true) { // 메뉴출력을 위한 메소드 호출 menuShow(); Scanner scan = new Scanner(System.in); int choice = scan.nextInt(); switch (choice) { // 친구 정보 출력 case 1: case 2: handler.addFriend(choice); break; // 전체 정보 출력 case 3: handler.showAllData(); break; // 간략 정보 출력 case 4: handler.showSimpleData(); break; // 정보 검색 case 5: handler.searchInfo(); break; // 정보 삭제 case 6: handler.deleteInfo(); break; // 프로그램종료 case 7: System.out.println("프로그램을 종료합니다."); //main함수의 종료는 프로그램의 종료와 동일한다. return; } } } } /* 프로그램 흐름을 제어할 목적으로 생성한 클래스로 주로 컨트롤클래스 혹은 핸들러 클래스라고 칭한다. 해당 프로그램에서 전반적인 기능을 담당하게 된다. */ class FriendInfoHandler { //맴버변수 /* Friend타입의 객체배열을 선언하여 하위클래스인 High, Univ객체를 모두 저장한다. 부모타입의 배열에는 하위객체 전체를 저장할 수 있으므로 여러개의 객체를 하나의 타입으로 관리 할 수 있다는 장점이 있다. */ private Friend[] myFriends; private int numOfFriends; //정보추가시 +1증가 //생성자 : 인자로 전달되는 num크기의 객체 배열을 생성한다. public FriendInfoHandler(int num) { this.myFriends = new Friend[num]; numOfFriends = 0; } //새로운 친구(고딩, 대딩) 연락처추가 public void addFriend(int choice) { Scanner scan = new Scanner(System.in); String iName, iPhone, iAddr, iNickname, iMagor; //공통사항 입력받기 System.out.print("이름 : "); iName = scan.nextLine(); System.out.print("전화번호 : "); iPhone = scan.nextLine(); System.out.print("주소 : "); iAddr = scan.nextLine(); /* 1. 친구정보를 입력받은후.... 2. 객체배열 0번방에 객체를 저장하고 3. numOfFriends 변수를 1 증가시킨다.(후위증가) */ if (choice == 1) { //고딩친구 입력 후 추가 System.out.print("별명 :"); iNickname = scan.nextLine(); HighFriend high = new HighFriend(iName, iPhone, iAddr, iNickname); myFriends[numOfFriends++] = high; } else if (choice == 2) { //대딩 친구 입력 후 추가 System.out.print("전공 : "); iMagor = scan.nextLine(); myFriends[numOfFriends++] = new UnivFriend(iName, iPhone, iAddr, iMagor); } System.out.println("친구 정보 입력이 완료되었습니다."); }////end of addFriend public void showAllData() { for(int i = 0; i< numOfFriends; i ++) { myFriends[i].showAllData(); } System.out.println("==전체 정보가 출력되었습니다."); }////end of showAllData //친구정보 간략 보기 /* 1.고딩친구 정보를 Friend 객체 배열에 추가 2. High객체가 Friend형으로 자동형변환되어 저장됨 3. 객체 배열에 저장된 객체들은 for문을 통해 순차적으로 정보출력. 이때 오버라이딩된 메소드를 통해 항상 해당 객체의 정보를 출력할 수 있음. 참조변수의 타입에 영향을 받지 않음. */ public void showSimpleData() { for(int i = 0; i< numOfFriends; i ++) { myFriends[i].showBasicInfo(); } System.out.println("==전체 정보가 출력되었습니다."); }////end of showSimpleData //주소록 검색 public void searchInfo() { boolean isFind = false; //검색한 정보가 있는지 확인을 위한 변수 Scanner scan = new Scanner(System.in); System.out.print("검색할 이름을 입력하세요 : "); String searchName = scan.nextLine(); //객체배열에 저장된 친구정보의 갯수만큼 반복 for(int i = 0; i < numOfFriends; i++) { if(searchName.compareTo(myFriends[i].name) == 0) { myFriends[i].showAllData(); System.out.println("**귀하가 요청하는 정보를 찾았습니다. **"); isFind = true; //찾는 정보가 있다면 true로 변경 } } if(isFind == false) System.out.println("***찾는정보가 없습니다.***"); }////end of searchInfo //주소록 항목 삭제 public void deleteInfo() { Scanner scan = new Scanner(System.in); System.out.print("삭제할 이름을 입력하세요 :"); String deleteName = scan.nextLine(); /* 배열의 요소중 삭제된 요소의 인덱스 값을 저장할 용도의 변수. 요소를 삭제한 후 빈자리를 채워넣을 때 사용할 것임. */ int deleteIndex = -1;//배열의 index이므로 초기값은 -1로 설정 for(int i = 0; i < numOfFriends; i++) { if(deleteName.compareTo(myFriends[i].name) == 0) { //요소를 삭제하기 위해 null값으로 변경 myFriends[i] = null; //삭제된 요소의 index를 저장 deleteIndex = i; //전체 카운트를 -1 차감 numOfFriends--; } } if(deleteIndex == -1) { //검색된 데이터가 없어 삭제되지 않았을때 System.out.println("==삭제된 데이터가 없습니다.=="); } else { /* 객체배열에서 검색된 요소를 삭제한 후 입력된 위치의 바로뒤 요소를 앞으로 하나씩 교환한다. */ for(int i = deleteIndex; i < numOfFriends; i++) { myFriends[i] = myFriends[i + 1]; } System.out.println(" ==데이터(" + deleteIndex + "번)가 삭제되었습니다."); } }////end of deleteInfo }////end of FriendInfoHandler
그래도 이제 프로그램다운 프로그램(기초중의 기초지만)을 만들어봤습니다. 이질화의 이유도 여기에서 나옵니다.
코드에서 보면 친구는 두가지 종류로 나눠집니다. 고등학교 친구와 대학교 친구입니다. 이때 이 둘을 따로 나누어서 입력받고, 출력하고, 저장하게 되면 위에 코드도 긴데 2배 정도는 더 긴 코드가 나올것입니다. 효율도 떨어지고 자원도 많이 사용하게 됩니다. 이를 위해 이질화를 하는겁니다. highHighFriend와 UnivFriend 모두 Friend을 상속받았기 때문에 Friend자료형에 두 클래스를 보두 초기화 할 수 있습니다. 이렇게 되면 관리와 효율 모두 올라가게 됩니다. 물론 접근 범위는 friend클래스에 선언된 변수와 메소드 그리고 오버라이딩 된 함수이지만 이정도 프로그램을 돌리는데는 문제가 없습니다. 나중에 혹시 사용하고 싶다면 형변환만 해주면 됩니다. 그건 나중에 다루도록 하겠습니다.
결과




'Java > Java_기초부터 _끝까지' 카테고리의 다른 글
Java 기초 상속 - 연습문제(1) (0) | 2020.12.14 |
---|---|
Java 기초 상속(8) - 다형성(이질화) (0) | 2020.11.30 |
Java 기초 상속(6) - overriding (0) | 2020.11.26 |
Java 기초 상속(5) - 경찰과 총의 소유관계 (0) | 2020.11.24 |
Java 기초 상속(4) - 컴퓨터 상속 구조 (0) | 2020.11.24 |
댓글을 사용할 수 없습니다.