리셋 되지 말자

상속 본문

Java(폐지)/Java 공부

상속

kyeongjun-dev 2020. 7. 16. 13:52

상속 : 재사용 + 확장

  • 객체 지향에서의 상속은 '상속'이 아닌 '재사용과 확장'으로 이해해야 한다.

객체 지향에서의 상속

  • 상위 클래스의 특성을 하위 클래스에서 상속(특성 상속)하고 거기에 더해 필요한 특성을 추가, 즉 확장해서 사용할 수 있다는 의미이다.

  • 이를 고려하여 앞으로는 부모 클래스, 자식 클래스로 부르기보다는 상위 클래스, 하위 클래스 또는 슈퍼 클래스, 서브 ㅡㄹ래스라고 표현하기로 한다.

  • 상위 클래스로 갈수록 추상화, 일반화 되었다고 하며 하위 클래스로 갈수록 구체화, 특수화 됐다고 말한다.

상속 관계에서 반드시 만족해야 하는 문장

  • 하위 클래스는 상위 클래스다.
    -> 포유류는 동물이다.
    -> 고래는 포유류다.
    -> 고래는 동물이다.
  • 나중에 학습할 객체 지향 설계 5원칙 가운데 LSP(리스코프 치환 원칙)을 나타내는 말이다.

자바에서의 상속 키워드

  • 자바 언어에는 상속이라는 키워드 'inheritance'가 존재하지 않는다. 대신 extends(확장)이 존재한다.

상속 사용하기

  • 객체 참조 변수의 이름은 신중히 결정해야 한다. 왜냐면 객체의 특성은 유일무이하기 때문에 이때문에 유일무이한 이름을 지어야 한다.(그렇다고 한다.)
  • 동물
package inheritance01;

public class 동물 {
    String myClass;

    동물(){
        myClass="동물";
    }
    void showMe() {
        System.out.println(myClass);
    }
}
  • 포유류
package inheritance01;

public class 포유류 extends 동물{    
    포유류(){
        myClass="포유류";
    }
}
  • 조류
package inheritance01;

public class 조류 extends 동물{
    조류(){
        myClass="조류";
    }
}
  • 고래
package inheritance01;

public class 고래 extends 포유류 {
    고래(){
        myClass="고래";
    }
}
  • 박쥐
package inheritance01;

public class 박쥐 extends 포유류{
    박쥐()
        myClass = "박쥐";
    }
}
  • 참새
package inheritance01;

public class 참새 extends 조류 {
    참새(){
        myClass = "참새";
    }
}
  • 펭귄
package inheritance01;

public class 펭귄 extends 조류{
    펭귄(){
        myClass="펭귄";
    }
}
  • main
package inheritance01;

public class Main {

    public static void main(String[] args) {
        동물 animal = new 동물();
        포유류 mammalia = new 포유류();
        조류 bird = new 조류();
        고래 whale = new 고래();
        박쥐 bat = new 박쥐();
        참새 sparrow = new 참새();
        펭귄 penguin = new 펭귄();

        animal.showMe();
        mammalia.showMe();
        bird.showMe();
        whale.showMe();
        bat.showMe();
        sparrow.showMe();
        penguin.showMe();

    }

}
  • 결과

-> 상위 클래스에서만 showMe() 메서드를 구현하고, 모든 하위 클래스에서 showMe() 메서드를 사용할 수 있다.

"하위클래스는 상위클래스다"를 보여주는 main 코드

package inheritance01;

public class Main2 {

    public static void main(String[] args) {
        동물 animal = new 동물();
        동물 mammalia = new 포유류();
        동물 bird = new 조류();
        동물 whale = new 고래();
        동물 bat = new 박쥐();
        동물 sparrow = new 참새();
        동물 penguin = new 펭귄();

        animal.showMe();
        mammalia.showMe();
        bird.showMe();
        whale.showMe();
        bat.showMe();
        sparrow.showMe();
        penguin.showMe();

    }

}
  • 위에서 "하위 클래스는 상위 클래스이다"라는 문장을 소개했는데, 위의 코드가 그것을 보여주는 예시이다.
    -> 위 코드의 결과는 Main 클래스의 main 함수 결과와 같다.
  • 포유류는 동물이다. -> 맞는말
  • 조류는 동물이다. -> 맞는말

상위클래스 배열로 여러 객체를 담는 코드

package inheritance01;

public class Main3 {

    public static void main(String[] args) {
        동물[] animals = new 동물[7];
        animals[0] = new 동물();
        animals[1] = new 포유류();
        animals[2] = new 조류();
        animals[3] = new 고래();
        animals[4] = new 박쥐();
        animals[5] = new 참새();
        animals[6] = new 펭귄();

        for(int i=0; i<animals.length; i++) {
            animals[i].showMe();
        }

    }

}

클래스 상속 구조의 최상위 클래스인 Object

  • 최상위 클래스가 Object이므로 모든 클래스는 결국 Object의 특성을 물려받는다. 그래서 어떤 클래스의 인스턴스이든 상관없이 우리는 toString() 메서드를 사용할 수 있다.

is a (x) is a kind of (o)

  • 상속이 'is a'관계를 만족해야한다고 어디선가 주워들은 적이 있다. 이를 적용하면 '펭귄 is a 동물'인데 '펭귄은 한 마리의 동물이다.'가 된다.
  • 위의 is a 보다는 is a kind of 를 적용하여, '펭귄은 동물의 한 분류다'로 이해하자.

중간 정리

  1. 객체 지향의 상속은 상위 클래스의 특성을 재사용하는 것이다.
  2. 객체 지향의 상속은 상위 클래스의 특성을 확장하는 것이다.
  3. 객체 지향의 상속은 is a kind of 관계를 만족해야 한다.

'Java(폐지) > Java 공부' 카테고리의 다른 글

상속과 T 메모리  (0) 2020.07.16
상속과 인터페이스  (0) 2020.07.16
5일차-클래스 멤버 vs 객체 멤버 = static 멤버 vs 인스턴스 멤버  (0) 2020.07.15
4일차 - 자바와 객체 지향  (0) 2020.07.14
3일차  (0) 2020.07.14
Comments