상속 및 다형성
클래스의 상속(inheritance)
- 상속
부모 클래스의 멤버를 자식 클래스 내부에 포함시키는 것(생성자는 상속되지 않는다.)
- private 접근제한자를 가진 멤버는 상속되지 않는다.
- final이 붙은 클래스는 상속되지 않는다.
- final 클래스를 사용하는 목적: 비공개 정보에 접근하거나 시스템을 파괴하는 것을 방지하기 위해서..
- JVM은 자식 클래스 생성 시 부모 클래스의 객체를 생성하고 자식 클래스에서 추가한 필드, 메소드를 객체에 추가한다.
- 상속의 장점: 코드 중복성을 제거하고 클래스의 다형적 표현이 가능해진다.
※주의: 자바는 다중상속이 불가능
- 다형성(polymorphism)
- 1개의 객체를 여러 모양으로 표현할 수 있는 특성
- 자식 타입으로도 객체를 담을 수 있고, 부모/조상 타입으로도 자식의 객체를 담을 수 있다.
public class Parent { ~ }
public class Child extends Parent { ~ }
Parent parent = new Child( ); //(O)
Child child = new Parent( ); //(Error)
객체의 타입 변환
- 업 캐스팅(up casting)
- 범위가 좁은 쪽에서 넓은 쪽으로 캐스팅하는 것
- 객체는 항상 업캐스팅할 수 있으므로 명시적으로 적지 않아도 컴파일러가 대신 넣어준다.
- 다운 캐스팅(down casting)
- 업 캐스팅의 반대(넓은 쪽에서 좁은 쪽으로)
- 다운 캐스팅은 개발자가 직접 넣어주어야 한다.
- 캐스팅 가능여부 확인: instanceof 키워드
//jdk 12버전 이전
참조변수 instanceof 타입
타입 참조변수 = new 타입( );
//true - 참조변수가 해당 타입으로 캐스팅 가능
//false - 캐스팅 불가능
//------------------------------
//jdk 12버전 이후
참조변수 instance of 타입 참조변수
- 메소드 오버라이딩(overriding)
동일한 이름의 메소드를 재정의하는 것(자식에 맞게 고쳐 사용하는 것)
- 부모 클래스의 메소드와 시그니처 및 리턴 타입이 동일해야 한다.
- 부모 클래스의 메소드보다 접근지정자의 범위가 같거나 넓어야 한다.
※주의사항
- 인스턴스 필드는 객체 내에 존재하므로 저장공간이 달라 오버라이딩 되지 않는다.
- 정적(static) 필드, 정적 메소드는 클래스 내부에 존재하므로 역시 저장공간이 분리되어 있어 오버라이딩 되지 않는다.
- 동일한 필드나 동일한 메소드가 있을 때 참조변수가 가리키는 객체의 바깥쪽부터 안쪽으로 들어가며 만나는 첫번째 멤버가 실행
- @: 어노테이션
컴파일러가 문법 오류를 미리 점검하거나 실행시간 도중에 특정 기능 수행하도록 정보 제공
@Override: 컴파일러에게 뒤의 메소드를 미리 점검하게 함.
super 키워드와 super( ) 메소드
- super
- 부모의 객체
- super.부모필드명, super.부모메소드명( )
- super( )
- 부모의 생성자
- 반드시 생성자 첫줄에 위치, 생략 시 컴파일러가 자동 삽입
- super( ): 부모의 기본 생성자 호출
- super(매개값, ~): 부모의 매개변수 있는 생성자 호출