반응형

상속 (Inheritance)

  • 기존의 클래스로 새로운 클래스를 작성하는 것(코드의 재사용)
  • 두 크래스를 부모와 자식으로 관계를 맺어주는 것

상속으로 클래스를 작성하는 방법은 아래와 같다.

어떤 클래스를 만들 때, 'extends'라는 키워드를 쓰고, 어떤 클래스를 이 클래스의 부모클래스로 할 것인지를 적어주면 된다.

이 클래스를 보면, 기존에 Parent라는 클래스가 있다. 그리고 Child라는 클래스를 만들 때, Parent라는 클래스를 부모로 했다.
이 두 클래스 Chld와 Parent를 상속관계에 있다고 한다.

 

  • 자손은 조상의 모든 멤버를 상속받는다. (생성자, 초기화 블럭 제외)

자손, 조상 이라고 쓴 이유는, 부모의 보모가 있을 수도 있기 때문이다.
바로 위의 부모것만 상속받는 것이 아니라, 부모의 부모것도 같이 상속받는 것이다. 

선택의 여지 없이, 맘에 들든 안들든, 전부 상속받는다. 그리고 이때, 생성자와 초기화블럭은 제외다.

 

  • 자손의 멤버 개수가 조상보다 적을 수 없다.(같거나 많다)

여기 Parent클래스를 보면, 멤버가 age 1개가 있다. 이것을 다이어그램으로 그린 것인데,
Child라는 클래스는 Parent라는 클래스로부터 상속을 받았다.
Child클래스에는 멤버가 없다. 0개이다.
Child클래스의 부모클래스인 Parent클래스에는 멤버가 1개있다.
따라서 Child클래스의 멤버는 총 1개이다.

자손은 조상의 모든 멤버를 상속 받기 때문에 자손의 멤버 개수가 조상보다 적을 수 없다. 
따라서, Child클래스는 상속받은 멤버가 1개이므로 총 1개이다.

 

  • 자손의 변경은 조상에 영향을 미치지 않는다.
  • 부모의 변경은 자손에 영향을 미친다.

상속의 또다른 특징은, 자손의 변경이 조상에 영향을 미치지 않는다는 것이다.

Parent클래스와 자식인 Child클래스가 있는데, 
이 자식클래스 Child클래스에  play()메서드를 추가했다. 즉, 새로운 멤버를 추가했다.
자식에 멤버를 새로 추가해도, 조상클래스는  영향을 받지 않는다.

그래서 이때, Parent클래스는 멤버1개이고, Child클래스는 멤버가 2개이다.

 

상속을 하면 할 수록, 자식 클래스가 확장(extend)된다.

 

이번에는 예제를 통해서 상속을 받는 경우와, 안받는 경우의 차이점이 대해 알아보자.

이처럼 Point클래스가 있을 때, 이 Point클래스가 뭐냐면, 2차원 좌표의 한 점(x, y)을 나타내기 위한 클래스다.
그래서 x, y를 두개의 정수형 멤버로 선언했다.

 

그런데 이때, 3차원 좌표의 한점을 나타내기 위해서 Point3D라는 클래스를 작성하려고 하는데,
3차원 좌표에서 한 점은 (x, y, z)이렇게 된다.
그러면 이 Point3D라는 클래스를 어떻게 작성해야 할까?

좌측은 기존의 Point하고는 관계없는 클래스이고,
우측은,  Point클래스를 상속받아서 작성한 것이다.

이 2가지 방법의 차이가 뭘까?
첫번째 방법은 Point클래스와 전혀 관계가 없는 것이고, 오른쪽은 Point와 상속관계에 있는 것이다.

좌측의 Point3D클래스는 Point클래스와 전혀 관계가 없기 떄문에 Point클래스를 변경해도 영향을 받지 않는다.

그러나,  오른쪽에 있는 Point3D클래스는 Point를 상속받고 있기 때문에 Point클래스의 변경에 영향을 받는다.
만약에 Point클래스의 y를 제거하면, 우측의 Point3D클래스는 멤버가3개였다가 2개가 된다.

부모클래스의 변경은 자손에 영향을 미친다.

 

예를 들어서, Point3D객체를 생성했다고 가정해보자.1번의 경우와 2번의 경우를 나누어 그림을 그려보면, 

1번의 경우 참조변수p가 만들어지고 p가 가리키는 주소의 객체에 멤버가 총 3개 있다.

2번의 경우 참조변수 p가 만들어지고 p가 가리키는 주소의 객체에 멤버가 총 3개 저장된다.

상속을 받던 안받던 결과는 똑같다.

 

[Ex7_1]

 class Tv { // 멤버 5개
    boolean power;      // 전원상태(on/off)
    int channel;        // 채널

     void power()   {power = !power;}
     void channelUp() {channel = channel + 1;}
     void channelDown() {channel = channel - 1;}
 }

 class SmartTv extends Tv { // SmartTv는 Tv에 캡션(자막)을 보여주는 기능을 제공 // 멤버 5개 + 2개 = 7개
    boolean caption;        // 캡션상태(on/off)
     void displayCaption(String text) {
         if (caption) {     // 캡션 상태가 on(true)일 때만 text를 보여준다)
             System.out.println(text);
         }
     }
 }

public class Ex7_1 {
    public static void main(String[] args) {
        SmartTv stv = new SmartTv();
        stv.channel = 10;       // 조상 클래스로부터 상속받은 멤버
        stv.channelUp();        // 조상 클래스로부터 상속받은 멤버
        System.out.println(stv.channel);
//        stv.displayCaption("Hello, world");
        stv.caption = true;     // 캡션(자막) 기능을 켠다.
        stv.displayCaption("Hello, world");
    }
}

[실행 결과]

11
Hello, world
반응형

'JAVA' 카테고리의 다른 글

단일 상속, Object 클래스  (0) 2022.03.30
클래스 간의 관계, 상속과 포함  (0) 2022.03.30
변수의 초기화, 멤버 변수의 초기화  (0) 2022.03.29
생성자 this(), 참조변수 this  (0) 2022.03.29
생성자, 기본 생성자  (0) 2022.03.29