전화번호부 - 상속과 다형성 이용

전화번호부를 일반, 대학, 회사 전화번호부로 나눈 프로그램

package ex03.inheritance.phoneInfo14;
/*
입력시 
1. 일반, 2. 대학, 3. 회사 
다양한 사람을 입력하도록 수정 
*/
public class PhoneMain {
	public static void main(String[] args) {
		PhoneBookManager pbm = new PhoneBookManager();
		pbm.mainRun();
	}
}
내용을 입력하세요.

package ex03.inheritance.phoneInfo14;

import java.util.Scanner;

public class PhoneBookManager {

	final int PHONE_NUM = 100;  	
	PhoneInfo[] infoStorage = new PhoneInfo[PHONE_NUM]; // 자기 자신 또는 자식들의 객체 저장 
    int curCnt = 0;		
    
    public PhoneInfo readGeneralPhoneInfo() {
    	Scanner sc = MenuViewer.inputKeyboard();
    	System.out.print("이름 입력 : "); String name = sc.next();
    	System.out.print("전화 입력 : "); String phone = sc.next();
    	System.out.print("생일 입력 : "); String birth = sc.next();

    	
    	//자식 객체니까 부모변수로 넣을 수 있고, 리턴할 수 있다 
    	PhoneInfo pi = new PhoneInfo(name, phone, birth);
    	return pi;
    }
    
    public PhoneInfo readUnivPhoneInfo() {
    	Scanner sc = MenuViewer.inputKeyboard();
    	System.out.print("이름 입력 : "); String name = sc.next();
    	System.out.print("전화 입력 : "); String phone = sc.next();
    	System.out.print("생일 입력 : "); String birth = sc.next();
    	System.out.print("학과 입력 : "); String major = sc.next();
    	System.out.print("학년 입력 : "); int year = sc.nextInt();
    
    	PhoneInfo pi = new PhoneUnivInfo(name, phone, birth, major, year);
    	return pi;
    	
    }
    
    public PhoneInfo readCompanyPhoneInfo() {
    	Scanner sc = MenuViewer.inputKeyboard();
    	System.out.print("이름 입력 : "); String name = sc.next();
    	System.out.print("전화 입력 : "); String phone = sc.next();
    	System.out.print("생일 입력 : "); String birth = sc.next();
    	System.out.print("회사 입력 : "); String company = sc.next();
    	
    	PhoneInfo pi = new PhoneCompanyInfo(name, phone, birth, company);
    	return pi;
    }
    
    
    
    public void inputData() {
       	Scanner sc = MenuViewer.inputKeyboard();
    	System.out.println("데이터 입력을 시작합니다....");
    	System.out.println("1. 일반 2. 대학 3. 회사");
    	System.out.println("선택 >> ");
    	PhoneInfo pi;
    	int choice = sc. nextInt();
    	
    	switch(choice) {
    	case 1: pi = readGeneralPhoneInfo(); break;
    	case 2:pi = readUnivPhoneInfo(); break;
    	case 3: pi = readCompanyPhoneInfo(); break;
    	default: System.out.println("Invalid Number!!!"); return;
    	}
    	
    	// 배열이 다 차면 저장 중지 
    	if(curCnt >= PHONE_NUM) {
    		System.out.println("Full Storage!!");
    		return;
    	}
    	
    	// 저장 객체 생성 
    	infoStorage[curCnt] = pi; 	//배열에 저장  
    	curCnt++;			//저장 개수 증가, 다음 저장 인덱스 
    }
    
 // 전화정보 검색
    public void searchData() {
    	Scanner sc = MenuViewer.inputKeyboard();
    	System.out.print("이름 입력 : "); String name = sc.next();
    	
    	int idx = search(name);
    	if(idx != -1) {
//    		infoStorage[idx].showPhoneInfo();
    		PhoneInfo pi = infoStorage[idx];
    		pi.showPhoneInfo();
    	}
    }
    
 // 전화정보 삭제
    public void deleteData() {
    	Scanner sc = MenuViewer.inputKeyboard();
    	System.out.print("이름 입력 : "); String name = sc.next();
    	int idx = search(name);
    	if(idx != -1) {
    		// 삭제할 자리가 생겨서 삭제할 자리부터 앞으로 한칸씩 당긴다.
    		for (int i = idx; i < curCnt-1; i++) {		//마지막번째는 이미 앞으로 당겨져서 없기 때문에 curCnt-1
    			infoStorage[i] = infoStorage[i+1];
    		}
    		curCnt--;	// 삭제한 1명을 줄여준다  
				
		}
    	
    }
    
    public PhoneInfo updateGeneralPhoneInfo(PhoneInfo pi){ 
    	Scanner sc = MenuViewer.inputKeyboard();
		System.out.print("이름 입력 : "); String _name = sc.next();
		System.out.print("전화 입력 : "); String _phone = sc.next();
		System.out.print("생일 입력 : "); String _birth = sc.next();

		pi.setName(_name);
		pi.setPhoneNumber(_phone);
		pi.setBirth(_birth);
		return pi;   // 사실 return 안해도 무방.
	}
    
    
    public PhoneInfo updateUnivPhoneInfo(PhoneUnivInfo pi) {
    	Scanner sc = MenuViewer.inputKeyboard();
		System.out.print("이름 입력 : "); String _name = sc.next();
		System.out.print("전화 입력 : "); String _phone = sc.next();
		System.out.print("생일 입력 : "); String _birth = sc.next();
		System.out.print("학과 입력 : "); String _major = sc.next();
    	System.out.print("학년 입력 : "); int _year = sc.nextInt();
    
		pi.setName(_name);
		pi.setPhoneNumber(_phone);
		pi.setBirth(_birth);
		pi.setMajor(_major);
		pi.setYear(_year);
		return pi;
    }
    
    public PhoneInfo updateCompanyPhoneInfo(PhoneCompanyInfo pi) {
    	Scanner sc = MenuViewer.inputKeyboard();
		System.out.print("이름 입력 : "); String _name = sc.next();
		System.out.print("전화 입력 : "); String _phone = sc.next();
		System.out.print("생일 입력 : "); String _birth = sc.next();
	 	System.out.print("회사 입력 : "); String _company = sc.next();
		pi.setName(_name);
		pi.setPhoneNumber(_phone);
		pi.setBirth(_birth);
		pi.setCompany(_company);  
		return pi;
    }
 
    public void updateData() {	//새로 객체를 만들어 덮어 써도 된다 
    	Scanner sc = MenuViewer.inputKeyboard();
    	System.out.print("이름 입력 : "); 
    	String name = sc.next();
    	int idx = search(name);
    	if(idx != -1) {
    		PhoneInfo pi = infoStorage[idx];
    		
    		//pi 변수에 담긴 객체가 PhoneInfo 클래스 객체일 때 
    		if(pi.getClass().equals(PhoneInfo.class)) {
    		//	pi = updateGeneralPhoneInfo(pi); 이렇게 안해도 됨
                    updateGeneralPhoneInfo(pi);  
    		} 
    		//pi 변수에 담긴 객체가 PhoneUnivInfo 클래스 객체일 때 
    		else if(pi.getClass().equals(PhoneUnivInfo.class)) {
    			pi = updateUnivPhoneInfo((PhoneUnivInfo)pi);	//자식 객체로 형변환 
    		}
    		
    		//pi 변수에 담긴 객체가 PhoneCompanyInfo 클래스 객체일 때 
    		else if (pi.getClass().equals(PhoneCompanyInfo.class)) {
    			pi =  updateCompanyPhoneInfo((PhoneCompanyInfo)pi);
    		}
    		infoStorage[idx] = pi;  //안써도 되지만 명시적으로 써줌.
		}
    }
    
    public void viewAllData() {
    	for (int i = 0; i < curCnt; i++) {	 // 저장된 개수만큼 돌린다 
			PhoneInfo pi = infoStorage[i];
			pi.showPhoneInfo();
			System.out.println("-----------------------");
		}
    	
    }
    
    public int search(String name) {
    	// 이름으로 검색, searchData(), deleteData()내에서 사용
    	for (int i = 0; i < curCnt; i++) {
			PhoneInfo pi = infoStorage[i];
			if(pi.isEqualName(name))
					return i;	//찾은 위치 인덱스 반환 
		}
    	return -1;	//못찾았다 
    	
    }
    
    
    
    public void mainRun() {
    	boolean isRun = true;
    	int select=0;
    	
    	// 반복 루프, main함수에서 호출
    	while(isRun) {
    		
    		MenuViewer.showMenu();
    		select = MenuViewer.getSelMenu();
    		
    		switch(select) {
    		case 1:	inputData();
    			break;
    		case 2: searchData();
    			break;
    		case 3:	deleteData();
    			break;
    		case 4:	updateData();
    			break;
    		case 5: viewAllData();
    			break;
    		case 6: isRun = false;
    				System.out.println("프로그램 종료~");
    			break;
    		default : System.out.println("잘 못 선택!!!");
    			break;
    		}
    		
    	}
    }
}
package ex03.inheritance.phoneInfo14;


//일반 아는 사람 
public class PhoneInfo {
	// 필드
	protected String name;			//자식이 있을 때 주로 protected를 준다. 
	protected String phoneNumber;
	protected String birth;
	
	//setter (필드에 값을 set하는 메서드) 
	public void setName(String name) {
		this.name = name;
	}
	public void setPhoneNumber(String phoneNumber) {
		this.phoneNumber = phoneNumber;
	}
	public void setBirth(String birth) {
		this.birth = birth;
	}

	
	// 메서드
	public PhoneInfo(String name, String num, String birth) {
		this.name = name;
		this.phoneNumber = num;
		this.birth = birth;
	}

	public void showPhoneInfo() {
		System.out.println("name : " + name);
		System.out.println("phone : " + phoneNumber);
		System.out.println("birth : " + birth);
		
	}
	
	
	boolean isEqualName(String name) {
		if(this.name.equals(name))
			return true;
		else
			return false;
	}
}
package ex03.inheritance.phoneInfo14;

/*
class의 접근 권한
1) public : 누구나 
2) default : 같은 패키지 

2. field/ method의 접근 권한 
1) private : 본인 class 내에서만 (성격 , 기술) 상속하면 필드도 상속되지만 private하면 접근이 안되는 것.
2) protected : 본인 class + 자식 (돈, 토지) 남은 안되고 자식은 되는..
		   		상속일 때만 쓰이는 접근 권한자..
3) default : 같은 패키지 
4) public : 누구나 

*/
public class PhoneUnivInfo extends PhoneInfo {

	protected String major;
	protected int year;
	
	public void setMajor(String major) {
		this.major = major;
	}

	public void setYear(int year) {
		this.year = year;
	}
	
	
	public PhoneUnivInfo(String name, String num, String birth, String major, int year) {
		super(name, num, birth);
		this.major = major;
		this.year = year;
	
	}

	@Override
	public void showPhoneInfo() {
		super.showPhoneInfo();
		System.out.println("학과 : " + major );
		System.out.println("학년 : " + year );
	}
}
package ex03.inheritance.phoneInfo14;
/*
Overloading : 여러개 , 많이 있다 
			메서드의 이름은 같고, 매개변수가 다른 메서드 선언을 허용
Overriding : 부모가 물려준 메서드를 덮어쓴다 
*/

public class PhoneCompanyInfo extends PhoneInfo {
	
	protected String company;
	
	public void setCompany(String company) {
		this.company = company;
	}


	public PhoneCompanyInfo(String name, String num, String birth,
							String company) {
		super(name, num, birth);	
		this.company = company;
	}


	@Override
	public void showPhoneInfo() {
		super.showPhoneInfo();
		System.out.println("회사 : " + company);
	}
}

좋은 웹페이지 즐겨찾기