[35] 문제 풀이 상속 및 오버라이딩

9045 단어 Java문제Java

1. 전화번호관리 및 회사, 학교 저장

  • public class PhoneInfo
package kosta.phone;

public class PhoneInfo {
	
//	전화번호부 관리프로그램 구현하자 (1명의 전화번호부 )
//	상태 : 이름, 전화번호, 생년월일
//	기능 : 1명의 전화내역을 출력
	
	// Company(dept, position)
	// Universe(major, year)
	
	// 1. 각각의 상태에 따른 필드(속성)을 선언한다.
	private String name;     // 이름
	private String phoneNo;  // 전화번호
	private String birth;    // 생년월일
	
	// 2. 사용할 생성자를 생성한다. (생성자는 리턴형이 존재하지 않는다.)
	public PhoneInfo() {}  // 디폴트 생성자(기본 생성자) : 입력매개변수(파라미터)가 아무것도 없을 때를 항상 생각한다.

	// 3. Source 메뉴에서 필드를 통해서 만들어준다. (직접 입력도 가능하다.)
	public PhoneInfo(String name, String phoneNo, String birth) {
		super();
		this.name = name;
		this.phoneNo = phoneNo;
		this.birth = birth;
	}
	
	// 4. 전화내역을 출력할 메서드를 생성한다.
	public void show() { // 출력은 리턴값이 필요하지 않기 때문에, void를 사용한다. -> void의 사용은 입력매개변수(파라미터)가 없음과도 같다.
		System.out.println("이름 : "+name);
		System.out.println("전화번호 : "+phoneNo);
		System.out.println("생년월일 : "+birth);
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPhoneNo() {
		return phoneNo;
	}

	public void setPhoneNo(String phoneNo) {
		this.phoneNo = phoneNo;
	}

	public String getBirth() {
		return birth;
	}

	public void setBirth(String birth) {
		this.birth = birth;
	}

	// -> 상태와 기능을 구현했으면, maim() 영역으로 가자~

}

- public class Company extends PhoneInfo

package kosta.phone;

public class Company extends PhoneInfo {
	
	// 기존의 PhoneInfo 내용을 사용할 수 있는 Company 클래스를 생성했다.
	
	private String dept;          // 부서
	private String position;      // 직위
	
	public Company() {}

	// 
	public Company(String name, String phoneNo, String birth, String dept, String position) {
		super(name, phoneNo, birth); // PhoneInfo 파라미터 초기화
		this.dept = dept;
		this.position = position;
	}
	
	// 그냥 쇼우 하지마 제발..
	
	// 오버라이딩을 통하여, 부모 클래스인 PhoneInfo의 show() 메서드와 자식 클래스인 Company에 필요한 것을 호출한다.
	// 오버라이딩은 기본적인 것에 + 필요한 속성을 더하는 것이다.
	@Override
	public void show() {
		super.show(); // phoneInfo에 대한 show() 메서드를 불러왔다. (이름,전화번호,생년월일)
		System.out.println("부서 : "+dept);
		System.out.println("직책 : "+position);
	}
	

	// set(), get() 메서드
	public String getDept() {
		return dept;
	}
	
	public void setDept(String dept) {
		this.dept = dept;
	}

	public String getPosition() {
		return position;
	}

	public void setPosition(String position) {
		this.position = position;
	}
}

- public class Universe extends PhoneInfo

package kosta.phone;

public class Universe extends PhoneInfo {

	private String major;          // 전공
	private String year;           // 학번
	
	public Universe() {}

	public Universe(String name, String phoneNo, String birth, String major, String year) {
		super(name, phoneNo, birth);
		this.major = major;
		this.year = year;
	}

	// 오버라이딩으로 상속하자!!!
	@Override
	public void show() {
		super.show(); // phoneInfo에 대한 show() 메서드를 불러왔다. (이름,전화번호,생년월일)
		System.out.println("전공 : "+major);
		System.out.println("학번  : "+year);
	}
	
	public String getMajor() {
		return major;
	}

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

	public String getYear() {
		return year;
	}

	public void setYear(String year) {
		this.year = year;
	}
}

- public class Manager

package kosta.phone;

import java.util.Scanner;

public class Manager {
//	Scanner sc = new Scanner(System.in);
	PhoneInfo[] arr = new PhoneInfo[5]; // PhoneInfo 클래스에 대한 10개의 객체를 만들었다.
	int count = 0;

	
	// 1. 프로그램을 구동할 세부적인 메서드(기능적인 부분)를 만들어준다.
	// 기능 : 전화번호 추가, 전화번호 출력, 전화번호 검색
	// 추가 기능 : 전화번호 수정, 전화번호 삭제
	public void addPhone() {
		
		System.out.println("1.전체      2.동창      3.직장");
		System.out.print("선택 : ");
		String menu = DataInput.sc.nextLine();
		
		System.out.print("이름 : "); 
		String name = DataInput.sc.nextLine();
		System.out.print("전화번호 : ");
		String phoneNo = DataInput.sc.nextLine();
		System.out.print("생년월일 : ");
		String birth = DataInput.sc.nextLine();

		
		switch (menu) {
		   case "1":
			   arr[this.count++] = new PhoneInfo(name, phoneNo, birth); // 전화번호를 추가할 때마다 각각의 객체에 데이터를 추가한다.
				break;
				
		   case "2":
			   System.out.print("전공 : ");
			   String major = DataInput.sc.nextLine();
			   System.out.print("학번 : ");
			   String year = DataInput.sc.nextLine();
			   
			   // 상속받았으므로, 배열로 사용할 수 있다.
			   arr[this.count++] = new Universe(name, phoneNo, birth, major, year);
				break;
				
		   case "3":
			   System.out.print("부서 : ");
			   String dept = DataInput.sc.nextLine();
			   System.out.print("직책 : ");
			   String position = DataInput.sc.nextLine();
			   
			   // 상속받았으므로, 배열로 사용할 수 있다.
			   arr[this.count++] = new Company(name, phoneNo, birth, dept, position);
			    break;
			}
		System.out.println("전화번호가 등록되었습니다.");
	}    // 전화번호 추가
	
	
	// instanceof를 사용하여, 각각의 PhoneInfo와 Universe, Company으로 형변환 가능한지 물어보고 show()로 출력한다.
	public void listPhoneInfo() {
		System.out.println("1.전체         2.동창        3.직장");
		System.out.print("선택 : ");
				String menu = DataInput.sc.nextLine();
				
				switch (menu) {
				case "1":
					for (int i = 0; i < count; i++) {
						if (arr[i] instanceof PhoneInfo) {
							arr[i].show();
						}
					}
					break;
					
				case "2":
					for (int i = 0; i < count; i++) {
						if (arr[i] instanceof Universe) {
							arr[i].show();
						}
					}
					break;
					
				case "3":
					for (int i = 0; i < count; i++) {
						if (arr[i] instanceof Company) {
							arr[i].show();
						}
					}
					break;
			}
	}  // 전화번호 출력
	
	
	public void searchPhone() {
		System.out.print("이름 : ");
		String name = DataInput.sc.nextLine(); // 찾고자하는 변수를 만들고, 입력한다.
		int idx = -1; // 문자열의 위치를 알기 위해서 만든 변수이다.
		
		// name 내가 쓴 문자열이 어디 있는지 모르기 때문에 하나씩 비교한다. for문으로..
		for(int i = 0; i < this.count; i++) {
			PhoneInfo info = arr[i]; // 이미 생성된 객체를 변수에 넣는 것이므로, new 연산자를 사용하지 않아도 된다.
			if(name.equals(info.getName())) {  // i값은 배열의 위치를 알려준다.
				info.show();
				idx = i; // 문자열의 존재여부를 확인 - 임시 변수! (0~9)
				break; // 나간다!
			}
		}
		
		if (idx == -1) {
			System.out.println("해당하는 정보를 찾을 수 없습니다.");
		}
		
	} // 전화번호 검색
	
	public void updatePhoneInfo() {
		System.out.print("전화번호를 수정할 이름 : ");
		String name = DataInput.sc.nextLine();
		
		for(int i = 0; i < this.count; i++) {
			PhoneInfo info = arr[i]; // info 객체에 arr[i]에 대한 name의 값을 넣고 빼면서 info.name의 값과 비교한다.
			if(name.equals(info.getName())) {  // name이 info.name과 같다면 {} 수행
				System.out.print("수정할 전화번호 : ");
				String phoneNo = DataInput.sc.nextLine(); // 수정할 번호 입력.
//				info.phoneNo = phoneNo;  // 정보 은닉
				info.setPhoneNo(phoneNo);  // 수정할 번호를 info.phoneNo에 덮어쓴다.
				System.out.println("전화번호가 수정되었습니다.");
				break; // 나간다!
			}
		}
		
	} // 전화번호 수정
	
	public void deletePhoneInfo() {
		System.out.print("삭제할 전화번호 이름 : ");
		String name = DataInput.sc.nextLine();
		int idx = -1; // 삭제할 전화번호가 없으면 없다는 메세지를 출력하는 용도.
		
		for(int i = 0; i < this.count; i++) {
			PhoneInfo info = arr[i]; // info 객체에 arr[i]에 대한 name의 값을 넣고 빼면서 info.name의 값과 비교한다.
			if(name.equals(info.getName())) { // 해당하는 이름을 찾았다면, if문을 실행한다.
				idx = i; // 삭제를 하고자하는 idx값을 i에 의해서 알았다. 
			}
		}
		
		if(idx == -1) { // 이름이 배열에 존재하지 않으면 실행
			System.out.println("찾을 수 없습니다.");
			}
		
		if(idx != -1) { // 이름이 배열에 존재하면 실행
			for (int i = idx; i < this.count; i++) {
				if(i == arr.length - 1) { // 마지막 위치. 배열의 크기는 5이므로 arr.length - 1 해서 4로 만든다. 배열은 0부터 시작하므로.
					arr[i] = null; // 마지막 위치의 경우, 이동시킬 배열이 없으므로 null 값을 사용한다.
				} else {
					arr[i] = arr[i + 1]; // 마지막을 제외한 위치. "해당하는 전화번호 = 그 뒤쪽에 있는 위치." 오른쪽에 있는 것을 왼쪽으로 한 칸씩 이동시킨다. 이렇게 안하면 "널 포인트 익셉션" 발생한다.
				}
			}
		}
		count--; // 하나가 삭제된 배열의 개수를 count--로 빼준다.
	} // 전화번호 삭제

- public class Main

package kosta.phone;

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// 1. 자바 입력 API Scanner을 만든다.
//		Scanner sc = new Scanner(System.in);
		Manager m = new Manager(); // Manager 클래스에 대한 객체를 하나 생성한다.
		
		// 2. 구현할 시스템의 뼈대를 만든다.
		// -> 뼈대 : 눈에 보이는 글씨와 사용자가 직접 입력하는 값
		while (true) {
			System.out.println("1.추가      2.전체 출력     3.검색   4.수정   5.삭제    6.종료");
			System.out.print("메뉴의 번호 선택 : ");
			String menu = DataInput.sc.nextLine();  // String 데이터형으로 받으면, 문자열을 선택하는 조건이 있어야한다.
			
			switch (menu) {  // switch (menu) 입력되는 값에 따라서, case를 찾아간다.
			case "1":  // 1.추가
				m.addPhone();
				break;
				
			case "2":  // 2.전체출력
				m.listPhoneInfo();
				break;
				
			case "3":  // 3.검색
				m.searchPhone();
				break;
				
			case "4":  // 4.수정
				m.updatePhoneInfo();
				break;
				
			case "5":  // 5.삭제
				m.deletePhoneInfo();
				break;
				
			case "6":  // 6.종료
				System.out.println("프로그램이 종료되었습니다.");
				return;  // 값을 반환하지 않으면, 종료의 역할을 수행한다.
			}
		}
		
		// -> 뼈대(눈에 보이는 글씨와 사용자가 직접 입력하는 값)를 구현했으면, Manager() 영역으로 가자~
		
	}
}

좋은 웹페이지 즐겨찾기