상속(Inheritance) - 정의

  • 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것

  • 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있음

  • 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이

  • 장점

    • 코드의 재사용성을 높임

    • 코드의 중복 제거



상속 - 구현

  • 새로 작성하고자 하는 클래스 이름 뒤에 키워드 ‘extends’와 함께 상속받고자 하는 클래스 이름 명시

  • 클래스의 관계는 상속(Inheritance) 관계

  • 예시) class KoreanWeather extends Weather { }

    • KoreanWeather클래스와 Weather 클래스는 서로 상속 관계에 있음

    • KoreanWeather - 자식 클래스(Child Class)

    • Weather - 부모 클래스(Parent Class)



상속 - 부모클래스와 자식클래스

  • 부모클래스(Parent Class)

    • 상속해주는 클래스

    • super class, base class라고도 함

  • 자식클래스(Child Class)

    • 상속 받는 클래스

    • 부모클래스의 멤버(변수+메소드)를 모두 상속받음

    • sub class, derived class라고도 함



상속 - 특징

  • 생성자와 초기화 블럭은 상속되지 않음

  • 멤버(전체)만 상속됨 → 자식클래스의 멤버 수는 부모클래스의 멤버 수 보다 항상 많거나 같음

  • 자식 클래스의 인스턴스를 생성하면 부모 클래스의 멤버도 같이 생성되기 때문에 따로 부모 클래스의 인스턴스를 생성하지 않아도 됨

  • 공통된 부분을 부모클래스로 정의하면, 해당 부분 수정시 부모클래스만 수정해주면 되기때문에 관리가 용이



클래스간의 관계 - 포함(Composite) 관계

  • 상속이외에 클래스를 재사용하는 또 다른 방법

  • 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것

    • 클래스명 참조변수명 = new 클래스명(매개변수);
  • 매개변수로 중첩도 가능함

    • 클래스명A 참조변수명A = new 클래스명A(new 클래스명B(매개변수B), 매개변수A);

    • 클래스명B 참조변수명B = new 클래스명B(매개변수B);

    • 클래스명A 참조변수명A = new 클래스명A(참조변수명B, 매개변수);

  • 한 클래스를 작성하는데 다른 클래스를 멤버변수로 선언하여 포함시키는 것은 좋은 생각

    • 단위별로 클래스를 작성한 후, 단위 클래스들을 포함관계로 재사용

    • 보다 간결하고 손쉽게 클래스 작성

    • 다른 클래스를 사용하는데도 재사용할 수 있음

    • 코드가 나누어져 있기 때문에 코드 관리가 수월



클래스간의 관계 결정하는 법

  • 상속관계(has -a)

    • ~은(는) ~(의 요소)을(를) 가지고 있음

    • 슈크림붕어빵은 붕어빵(의 요소)를 가지고 있음

  • 포함관계(is-a)

    • ~은(는) ~(의 요소)임

    • 슈크림붕어빵은 붕어빵(의 요소)임

  • 나름의 이해(?)

    • 상속관계는 상속받을 클래스꺼를 내가 다 포함할 때(?)

    • 포함관계는 포함한 클래스꺼를 내가 일부나 전부를 사용할 때(?)



단일 상속(Single Inheritance)

  • 자바에서는 단일 상속만을 허용

    • 다른 객체지향언어인 C++은 다중 상속(Multiple Inheritance)을 허용

    • 둘 이상의 클래스로부터 상속은 불가능

  • 다중 상속의 특징

    • 여러 클래스로부터 상속받을 수 있기 때문에 복합적인 기능을 가진 클래스를 쉽게 만들 수 있음

    • 클래스간의 관계가 매우 복잡함

    • 서로 다른 클래스로부터 상속받은 멤버간의 이름이 같은 경우 구별하기가 어려움 → 자바에선 비허용

  • 단일 상속의 특징

    • 하나의 조상 클래스만 가질 수 있기 때문에 다중 상속보다 불편한 점이 있음

    • 클래스 간의 관계가 보다 명확해지고 코드를 다중 상속보다 신뢰할 수 있음

    • 포함관계를 적절히 이용할 것



Object 클래스 - 모든 클래스의 부모(를 넘어선 조상? 시조!) 클래스

  • 모든 클래스 상속계층도의 최상위에 있는 부모(조상)클래스

  • 컴파일러 : 다른 클래스로부터 상속을 받지 않는 모든 클래스들은 자동적으로 Object 클래스로부터 상속받게 함

    • extends Object;
  • 다른 클래스로부터 상속을 받더라도, 그 상속해주는 클래스의 부모클래스, 또는 그 위의 클래스의 부모 클래스는 Object

  • 자바의 모든 클래스들은 Object 클래스의 멤버들을 상속받기 때문에 Object 클래스에 정의된 멤버들을 사용할 수 있음

    • 예) toString(), equals() 등