Java - 상속

wlsdnboy·2022년 3월 1일
0

상속이란?

  • 부모클래스와 자식클래스가 존재하고 그 부모의 멤버를 상속받아 쓸 수 있게 된다.
  • 접근 제어자가 private인 경우 상속 받을 수 없다.
  • 부모와 자식 클래스가 서로 다른 패키지 일 경우 부모의 default 접근 제한을 갖는 필드 및 메소드도 자식이 물려받을 수 없다 (default는 같은 패키지만 접근 가능하다)

기존코드를 재활용한 코드 예제이다.

//menu class
public class Menu {
      
	
	static void Menu() { 
		System.out.println("데이터입력");
        System.out.println("데이터검색");
        System.out.println("데이터삭제");
        System.out.println("데이터 전체 출력");
        System.out.println("프로그램 종료");
	}
	
	
}

//PhoneBook class
public class PhoneBook {
	public static void main(String[] args) {
		PhoneBookManager pbm = new PhoneBookManager();

		Scanner sc = new Scanner(System.in);
		

		while (true) {
			Menu.Menu();
			int x = sc.nextInt();
			if (x == 1) {
                System.out.println("1.일반,2.대학,3.회사");
                int y = sc.nextInt();
                if ( y == 1) {
                	pbm.read();
                } 
                else if(y == 2 ) {
                	pbm.readStudent();
                }
                else if (y == 3) {
                	pbm.readCompany();
                }
                
				

			} else if (x == 2) {

				pbm.search();
			} else if (x == 3) {

				pbm.deleteData();
			} else if (x == 4) {
				pbm.Data();
			}
			else if (x == 5) {
				System.out.println("프로그램을 종료 합니다");
				break;
			}

		}

	}
}
//PhoneBookManager class

public class PhoneBookManager {

	final int MAX = 100;

	PhoneInfo[] info = new PhoneInfo[MAX];
	int cnt = 0;

	Scanner sc = new Scanner(System.in);
	void read() {

		System.out.println("이름");
		String name = sc.next();
		System.out.println("전화번호");
		String number = sc.next();
		System.out.println("생년월일");
		String birth = sc.next();
		info[cnt] = new PhoneInfo(name, number, birth);
		cnt++;
	}
	
	void readStudent() {
		System.out.println("이름");
		String name = sc.next();
		System.out.println("전화번호");
		String number = sc.next();
		System.out.println("전공");
		String major = sc.next();
		System.out.println("학년");
		int year = sc.nextInt();
		
		info[cnt] = new PhoneUnivInfo(name, number, major, year);
		cnt++;
		
	}
	
	void readCompany() {
		System.out.println("이름");
		String name = sc.next();
		System.out.println("전화번호");
		String number = sc.next();
		System.out.println("전공");
		String company = sc.next();
		
		info[cnt] = new PhoneCompanyInfo(name, number, company);
		cnt++;
		
	}
	
	void search() {
		System.out.println("이름을 입력하세요");
		String name = sc.next();
		
		for (int i = 0; i < cnt; i++) {
			if(info[i].name.equals(name)) {
				info[i].showPhoneInfo();
			}
		}
	}
	
	void deleteData() {
		
		System.out.println("이름을 입력하세요");
		String name = sc.next();
		for (int i = 0; i < cnt; i++) {
			if(info[i].name.equals(name)) {
				info[i] = null;
				cnt--;
				info[i] = info[i+1];
			}
			
		}
		
		for (int i = 0; i < cnt; i++) {
			System.out.println(info[i].name);
		}
		
	}
	
	void Data() {
		for (int i = 0; i < cnt; i++) {
			
			info[i].showPhoneInfo();
			System.out.println("---------------");
		}
	}

}
//Phone Info class

public class PhoneInfo {
	String name;
	String number;
	String birth;

	public PhoneInfo(String name, String number, String birth) {
		this.name = name;
		this.number = number;
		this.birth = birth;
	}

	public PhoneInfo(String name2, String phoneNum) {
		this.name = name2;
		this.number = phoneNum;
	}

	public void showPhoneInfo() {
		System.out.println("name : " + this.name);
		System.out.println("number : " + this.number);
		System.out.println("birth : " + this.birth);
	}

}

class PhoneUnivInfo extends PhoneInfo { // PhoneInfo 클래스를 상속받는다.
	String name;
	String PhoneNum;
	String major;
	int year;

	public PhoneUnivInfo(String name, String PhoneNum, String major, int year) {
		super(name, PhoneNum); //super란 부모클래스의 생성자를 불러주는것이다 
		this.name = name;
		this.PhoneNum = PhoneNum; 
		this.major = major;
		this.year = year;

	}

	@Override
	public void showPhoneInfo() {
		// TODO Auto-generated method stub
		super.showPhoneInfo();
		System.out.println("전공 : " + this.major);
		System.out.println("학년 : " + this.year); //
	}
	
	

}

class PhoneCompanyInfo extends PhoneInfo {
	String name;
	String PhoneNum;
	String company;
	
	public PhoneCompanyInfo(String name, String PhoneNum, String company) {
		super(name, PhoneNum);
		this.company = company;
	}

	@Override
	public void showPhoneInfo() {
		// TODO Auto-generated method stub
		super.showPhoneInfo();
		System.out.println("회사 : " + this.company);
	}
	
	
}

super란?

자식 클래스를 생성할때 부모클래스의 생성자도 무조건 불러와야한다. 부모 생성자는 자식의 생성자의 맨 첫 줄에서 호출된다.


public class PhoneInfo {
	String name;
	String number;
	String birth;

	public PhoneInfo(String name, String number, String birth) {
		this.name = name;
		this.number = number;
		this.birth = birth;
	}

	public PhoneInfo(String name2, String phoneNum) {
		this.name = name2;
		this.number = phoneNum;
	}

}

class PhoneUnivInfo extends PhoneInfo { // PhoneInfo 클래스를 상속받는다.
	String name;
	String PhoneNum;
	String major;
	int year;

	public PhoneUnivInfo(String name, String PhoneNum, String major, int year) {
		super(name, PhoneNum); //super란 부모클래스의 생성자를 불러주는것이다 
		this.major = major;
		this.year = year;

	}
}

PhoneUnivInfo 4개의 매개변수를 가진 생성자가 호출이 되면 super메소드로 부모클래스의 name,PhoneNum이 해당하는 생성자를 실행한다

오버라이딩이란?

부모클래스에서 상속받은 메소드를 재정의하는것이다. 오버라이딩 된 메소드는 부모의 동일메소드 보다 우선한다.


@Override
	public void showPhoneInfo() {
		// TODO Auto-generated method stub
		super.showPhoneInfo(); // 기존의 부모클래스에 메소드를 가져오고
		System.out.println("전공 : " + this.major); // 새로운 메소드를 추가한다.
		System.out.println("학년 : " + this.year);  
	}


	@Override
	public void showPhoneInfo() {
		// TODO Auto-generated method stub
		super.showPhoneInfo();
		System.out.println("회사 : " + this.company);
	}

기존 부모클래스에 메소드를 가져오고 새로운 메소드를 추가한다

오버라이딩의 규칙

  • 부모의 메소드와 동일한 메소드 이름과 매개변수 리스트 조합 리턴타입이다.
  • 접근제한을 더 축소 할 수 없다 예를 들어, public -> private
  • 새로운 예외를 throws 할 수 없다

참고사이트
https://chanhuiseok.github.io/posts/java-1/
https://scshim.tistory.com/210
https://sundrystore.tistory.com/16

profile
초보 개발자

0개의 댓글