본문 바로가기

Java

JAVA Programming(Ch 15. 메소드 오버라이딩)

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