본문 바로가기

JAVA

[Java] Inheritance : 상속

상속

기존(상위) 클래스의 자산(멤버)을 자식(하위)클래스에서 재사용하기 위한 것

장점

코드의 절감 : 상위 클래스의 멤버를 물려받기 때문에 중복 코드가 줄어든다.
유지보수성 향상 : 상위 클래스의 변경이 상속받은 클래스들에게도 적용된다.

적용

extends 사용

Object Class

모든 클래스의 조상 클래스
별도의 extends 선언이 없는 클래스들은 extends Object가 생략됨.
-> extends로 상속받는 부모클래스에는 Object를 상속받을 것이므로 결국 모든 클래스들은 Object를 상속함

상속의 관계

상속의 관계는 is a (kind of) 관계라고 함
자식클래스 is a 부모 클래스
부모 클래스의 모든 멤버들을 가지고 있기 때문

단일 상속

자바의 경우 단일 상속만 지원
다중 상속의 경우 여러 클래스의 기능을 물려받을 수 있으나 관계가 매우 복잡해짐
(두 상위 클래스에서 같은 이름의 메서드가 있을때 어떻게 처리할 것인가?)
대신 interface와 포함 관계(has a)로 단일 상속의 단점 극복

포함 관계

상속 이외에 클래스를 재활용 하는 방법
2개 이상의 클래스에서 특성을 가져올 때 하나는 상속, 나머지는 멤버 변수로 처리
ChildClass extends ParentClass{
    OtherClass c;
    boolean hasC;
    void sameMethod(){
        if(hasC){
            c.sameMethod();
        }
        else{
            System.out.println("사용하려면 따로 구현하거나 예외처리");
        }
    }

}

오버라이드

조상 클래스에 선언된 메서드를 자식 클래스에 맞게 수정하는것
매서드 이름, 매개변수, 리턴 타입이 같아야 한다.
접근 제한자는 범위가 넓거나 같아야 한다.

super 키워드

조상 키워드에 접근하기 위해서는 super 사용
this()가 해당 클래스의 다른 생성자를 호출하듯 super()는 조상 클래스의 생성자 호출
명시적으로 super()를 호출하지 않는 경우 컴파일러가 자동으로 삽입

annotation

@Deprecated
컴파일러에게 해당 메서드가 deprecated 되었다고 알려줌
@Override
override 됐다고 알려줌
선언된 경우 반드시 super class에 선언되어 있어야 함
@SuppressWarnings
사소한 warning의 경우 무시하도록 알려줌

실수 할 수 있는 부분

생성자(this(), super()) 등을 호출하지 않으면 묵시적으로 해당 생성자를 호출한다
상속 받았을 경우 super()를 호출하지 않으면 super()를 자동으로 추가하는데, 부모 클래스에서 생성자를 작성하여 super()생성자가 없을 경우 에러가 날 수 있다.

'JAVA' 카테고리의 다른 글

[Java] Encapculation  (0) 2024.01.18
[Java] Package  (0) 2024.01.17
[Java] Constructor : 생성자  (0) 2024.01.17
[Java] Abstraction  (0) 2024.01.16
[Java] 객체지향  (0) 2024.01.15