[35] 문제 풀이 상속 및 오버라이딩
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() 영역으로 가자~
}
}
Author And Source
이 문제에 관하여([35] 문제 풀이 상속 및 오버라이딩), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sanggeun/35-문제-풀이-상속-및-오버라이딩저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)