15. 메소드 오버라이딩
15-1. 상속을 위한 두 클래스의 관계
-> 언제 두 클래스의 상속 관계로 맺어야 할까 ? : ‘IS-A’ 관계가 성립해야함.
A is a B -> A는 일종의 B이다. ( ex. 사과 is a 과일 )
* ‘ 이런 관계가 있을 때만 상속을 고려해라 ! ‘

@ ‘IS-A관계 ’ -> Life is a journey. / 노트북은 컴퓨터이다. / 전기자동차는 자동차이다.
@ ‘IS-A관계’를 갖지 않는 두 클래스가 상속으로 연결되어 있다면, 적절한 상속인지 의심해야 한다! (잘못된 상속이라고 생각 해야 함)
< MobileSmartPhone >
class MobilePhone {
protected String number; // 전화번호
public MobilePhone(String num) {
number = num;
}
public void answer() { // 전화를 응답받는 즉, 수화기를 드는 액션(통화 버튼을 누르는 액션)
System.out.println(" Hi~ from " + number);
}
}
class SmartPhone extends MobilePhone {
private String androidVer; // 안드로이드 운영체제 네임(버전)
public SmartPhone(String num, String ver) {
super(num); // 상위 클래스에서 인자 num을 받을 수 있는 생성자 호출
androidVer = ver;
}
public void playApp() { // 앱 실행
System.out.println("App is running in " + androidVer);
}
}
public class MoblieSmartPhone {
public static void main(String args[]) {
SmartPhone phone = new SmartPhone("010-555-777", "Nougat");
phone.answer(); // 전화를 받는다.
phone.playApp(); // 앱을 선택하고 실행한다.
}
}

- 모바일폰은 상위 클래스
- 스마트폰은 이를 상속하는 하위 클래스
15-2. 메소드 오바라이딩
-> ‘상위 클래스에 정의된 메소드를 하위 클래스에서 다시 정의하는 것 ‘
- 조상이 쓰던 메소드를 좀 더 변경해서 쓰고 싶을 때 아예 똑같이 내용을 빼고 선언문만 똑같이 하여 똑같이 해서 자손에서 쓰는 것.
상속은 조상이 자손한테 생성자나 이런 것들은 주지 않는다.
- Super( ) : 조상의 생성자 참조.
-> super(x, y)하면, 조상의 생성자 중 매개 변수가 int x, int y 이런 것들
* super : x하면 조상의 멤버 변수 중 x인 것을 참조하게 된다.
* this( )는 같은 클래스 내의 생성자 참조
* this. 은 인스턴스를 가리킴 à 인스턴스 변수
l 상위 클래스의 참조변수가 참조할 수 있는 대상의 범위
new SmartPhone(“010-555-777”, “Nought”);
: SmartPhone 인스턴스이면서 동시에 MobilePhone 인스턴스
SmartPhone phone = new SmartPhone(“010-555-777”, ”Nougat” ) ;
Or
- MobilePhone형 참조변수가 SmartPhone 인스턴스 참조
MobilePhone phone = new SmartPhone(“010-555-777”, “Nought” ) ;
-> SmartPhone phone = new Mobilephone < 역은 성립하지 X >
-> ‘ 상위 클래스의 참조변수는 하위 클래스의 인스턴스 참조 가능’
- 모바일폰을 상속하는 스마트폰도 일종의 모바일폰이다.
: MobilePhone을 상속하는 SmartPhone 인스턴스는 MobilePhone 인스턴스이기도 함.
- 따라서 MobilePhone형 참조변수는 SmartPhone 인스턴스 참조 가능.
- 상속 관계가 형성이 되면 ( class SmartPhone extends MobilePhone { … }
: 다음 인스턴스는 SmartPhone 인스턴스인 동시에 MobilePhone 인스턴스가 된다.
< MobileSmartPhoneRef >
class MobilePhone {
protected String number;
public MobilePhone(String num) {
number = num;
}
public void answer() {
System.out.println("Hi~ from " + number);
}
}
class SmartPhone extends MobilePhone {
private String androidVer;
public SmartPhone(String num, String ver) {
super(num);
// this.number = num; 이거 사용하려면 MobilePhone 생성자 주석 처리
androidVer = ver;
}
public void playApp() {
System.out.println("App is running in " + androidVer);
}
}
public class MobileSmartPhoneRef { // SmartPhone 인스턴스 2개 생성
public static void main(String[] args) {
SmartPhone ph1 = new SmartPhone("010-555-777", "Nougat"); // SmartPhone형 참조변수(안에 있는 인스턴스 멤버 다 호출가능)
MobilePhone ph2 = new SmartPhone("010-999-333", "Nougat"); // SmartPhone이 상속하는 MobilePhone 클래스의 참조변수로 참조
// 비록 스마트폰 메소드도 다 가지고 있음에도 불구하고
// 호출할 수 있는 메소드의 범위는 모바일폰에 정의된 메소드로 제한
ph1.answer(); // 모바일폰 기능
ph1.playApp(); // 스마트폰 기능
System.out.println();
ph2.answer();
// ph2.playApp(); // 모바일폰형 참조변수 -> 모바일 폰 클래스에 정의되어 있는 메소드만 호출 가능
}
}

15-2) 메소드 오버라이딩 -> ‘상위 클래스에 정의된 메소드를 하위 클래스에서 다시 정의’
--> 조상이 쓰던 메소드를 좀 더 변경해서 쓰고 싶을 때 아예 똑같이 내용을 빼고 선언문만 똑같이 하여 자손에서 쓰는 것. 상속은 조상이 자손한테 생성자나 이런 것들은 주지 않는다.
--> Super() 이런 조상의 생성자 참조 super(x,y)하면, 조상의 생성자 중 매개변수가 int x, int y 이런것들!
- Super.x하면 조상의 멤버 변수 중 x인 것을 참조하게 된다.
- This()는 같은 클래스 내의 생성자 참조.
- This. 은 인스턴스를 가리킴
'Java' 카테고리의 다른 글
| ch22.제네릭(2) - 2 (0) | 2022.03.10 |
|---|---|
| ch22. 제네릭(2) -1 (0) | 2022.03.10 |
| JAVA Programming(Ch 14. 상속) (0) | 2021.08.09 |
| JAVA Programming(Ch 13. 배열) (0) | 2021.08.09 |
| JAVA Programming(Ch 12.콘솔 출력) (0) | 2021.08.09 |