1.상속의 기본
부모클래스( parent/상위 )
자식클래스( child/하위 )
자식이 extends를 통해 부모를 결정한다.
<화살표는 실선처리하고 방향은 부모로 한다.>
객체 다형성 구현이 가능하기 때문에 중요한 개념이다.
상속 대상 제한
부모 클래스의 private 접근 갖는 필드와 메소드는 제외한다.
부모 클래스가 다른 패키지에 있을 경우, default 접근 갖는 필드와 메소드도 제외한다.
자식 클래스 한 개가 여러 부모 클래스를 상속받을 수 없다. 따라서 인터페이스를 더 지향해야 한다.
생성자를 통해 자식 클래스를 만들 경우
힙영역에 자동으로 부모 객체와 자식 객체 두 개를 생성한다.
코드로 표현하면 super();가 자동으로 생성된다.
반드시 자식 클래스에서 super를 가장 먼저 넣어주어야 한다.
하지만 부모 클래스에 매개변수가 없다면 super를 안넣어도 된다.
예시를 통해 확인해보자.
ex)매개변수가 없는 상위 클래스
CellPhone(상위 클래스) - DmbCellPhone(하위 클래스) - DmbCellPhoneExample(메인 클래스)
DmbCellPhone 메소드에 있는 필드를 주목해라.
super 대신에 this를 사용해도 된다.
이유는 하위 클래스는 이미 부모필드를 상속받았기 때문에 this를 사용해도 무방하다.
그리고 상위 클래스에 매개변수가 없기 때문에 super를 선언 안해도 된다.
메인 클래스까지 생성한 후 돌려보면 잘 작동된다.
ex)매개변수가 있는 상위 클래스
People(상위 클래스) - Student(하위 클래스) - StudentExample(메인 클래스)
첫번째 예시와 달리 Student 메소드 첫 줄에 반드시 super를 선언해야 한다.
(메인 클래스는 생략한다.)
2.메소드 재정의(Override)
1)재정의 조건
-public을 default나 private로 수정 불가
-반대로는 가능하다.
반대로도 하지말자. 현업에서 그런 경우는 거의 없다.
2)@Override 어노테이션
3)재정의 효과
부모 메소드는 숨겨지는 효과가 발생한다.
재정의된 자식 메소드는 실행된다.
ex)Override
Airplane(상위 클래스) - SupersonicAirplane(하위 클래스) - SupersonicAirplaneExample(메인 클래스)
Console 결과
이륙합니다.
일반비행합니다.
초음속비행합니다.
일반비행합니다.
착륙합니다.
ex)다형성
부모클래스(Parent) - 자식클래스(Child) - 메인클래스(Oop)
부모클래스에서 필드(field1)와 메소드(method1)를 생성한다.
자식클래스에서 extends를 사용하여 상속시킨다. 필드(field2)와 메소드(method2)를 생성한다.
주석에서 설명했듯이 자식이 부모에 상속되면 필드와 메소드는 사용할 수 없다.
parent.field2와 parent.method2();에 오류가 난 이유이다.
부모가 자식을 품었을때 필드와 메소드가 숨겨지는 것을 다형성1 이라 한다.
타이어를 통해 또 다른 예시를 들어보겠다.
부모 클래스 Tire에 HankookTire와 KumhoTire를 상속시켰다.
Tire 클래스의 "Tire::roll() invoked"만 출력 되고
나머지 "사계절용 타이어"와 "스노우 타이어"는 자식클래스의 메소드이므로 출력되지 못한다.(다형성1)
자식 클래스에서 부모 클래스를 넘어서 기능을 확장하기 위해서 생성자를 통해 tire라는 변수를 만들어 새롭게 선언하면
자식 클래스에 있는 메소드 기능을 가져올 수 있다. (반드시 자식 클래스 메스드 이름과 부모 클래스 이름이 같아야 한다.)
즉, 부모 클래스 메소드에 국한되지 않고 자식 클래스에서 기능을 확장하는 것을 다형성2 라고 한다.
3.final 클래스
final 필드 : 수정 불가 필드
final 클래스 : 부모로 사용 불가한 클래스
final 메소드 : 자식이 재정의할 수 없는 메소드
즉, final이 붙으면 최종이라 선언하는 것이며 상속을 막는 것이다.
4.접근 제한자
public과 default만 클래스에 적용가능하다.
5.instanceof(객체 타입 확인)
6.absrtact
댓글