상속 (Inheritance)

장원정·2022년 11월 20일
0

Java

목록 보기
2/3

상속 (Inheritance)


  • 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
class Child extends Parents {}
  • 장점
    1. 적은 양의 코드로 새로운 클래스 작성이 가능하다.
    2. 코드를 공통적으로 관리하기 때문에 추가 및 변경이 용이하다.

조상 클래스 : 부모클래스, 상위(super) 클래스, 기반(base) 클래스
자식 클래스 ㅣ 하위(sub) 클래스, 파생된(derived) 클래스

  • 부모 클래스가 변경되면 자식 클래스는 자동적으로 영향을 받지만 자식 클래스가 변경되는 것은 조상 클래스에 아무런 영향을 주지 못한다.
  • 자식 클래스는 부모 클래스보다 같거나 많은 멤버를 갖는다. (상속은 부모클래스를 확장한다는 의미로 해석할 수도 있으며 상속의 키워드가 'extends'인 이유이다.)
  • 생성자와 초기화 블럭은 상속되지 않는다. 멤버만 상속된다.
  • 같은 부모 클래스를 상속받은 2개 이상의 자식 클래스는 아무런 관계도 성립되지 않는다.
  • 같은 내용의 코드를 하나 이상의 클래스에 중복적으로 추가해야하는 경우, 부모 클래스 하나만 변경하여 코드의 중복을 최소화한다.
  • 자식 클래스를 상속받는 클래스를 생성한다면 자식 클래스의 모든 멤버와 부모클래스로부터 상속받은 멤버까지 상속받게 된다.
  • Java에서는 단일 상속(single inheritance)만 지원한다.
  • Object클래스는 모든 클래스의 최상위 조상 클래스이다. 클래스명 뒤에 extends를 작성하지 않아도 컴파일러는 자동으로 'extends Object'를 추가하여 상속받도록 한다.
  • 상속 or 포함?
  • 클래스를 작성할 때 상속관계를 맺어 줄 지, 포함관계를 맺어줄 지는 '은 ~을 가지고 있다(has -a)'를 넣어서 문장을 만들어 보면 클래스 간의 관계가 명확해진다.

~은 ~이다(is -a) : 상속관계 (ex/ SportsCar는 Car이다.)
~은 ~을 가지고 있다(has -a) : 포함관계 (ex/ Circle은 Point를 가지고 있다.)

오버라이딩(overriding)

  • 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다.
  • 조건
    1. 이름이 같아야 한다.
    2. 매개변수가 같아야 한다.
    3. 반환타입이 같아야 한다.
    4. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
      • private || final 메서드는 상속할 수 없다. 이런 이유로 사실상 접근제한자가 바뀔 일은 많지 않다.
    5. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다. (예외를 일부만 던지거나 제거할 수 있다.)

super, super()

super

  • 멤버변수와 지역변수가 같을 때 this를 붙여서 구별했듯이 상속받은 멤버와 자신의 멤버가 이름이 같을 때 super를 붙여서 구별할 수 있다.
  • 조상 클래스로부터 상속받은 멤버도 자손 클래스의 멤버이므로 super대신 this를 사용할 수 있지만 멤버가 중복되어 구별해야하는 경우에만 super를 사용하는 것이 좋다.
  • super와 this는 static메서드에서는 사용할 수 없고 인스턴스 메서드에서만 사용할 수 있다.
  • 변수만이 아니라 메서드 역시 super를 이용해서 호출할 수 있다. 특히 오버라이딩한 경우에 사용한다.

super()

  • this()와 마찬가지로 super() 역시 생성자이다.
  • 조상 클래스의 생성자이다.
profile
개발자 지망생입니다.

0개의 댓글