Backend/JAVA-자바
JAVA 8. 상속과 다형성
사랑짱
2021. 6. 12. 01:43
◆ 상속이란?
* 현실 세계에서의 의미
- 부모가 자식에게 물려주는 행위
- 부모가 자식을 선책하여 물려줌
* 객체지향 프로그램에서의 의미
- 자식 클래스(하위, 파생)가 부모 클래스(상위)의 멤버를 물려 받는 것
- 자식이 부모를 선택하여 물려받음
- 상속 대상 : 부모의 인스턴스 필드와 인스턴스 메소드
(정적멤버는 클래스 소속이기 때문에 상속의 개념에 소속되지 않음!)
※ extends : 자식클래스가 상속할 부모클래스를 지정하는 키워드
◆ 상속의 특징
- 상속의 대상 : 부모클래스의 인스턴스 멤버(static은 클래스 객체 소속이므로 상속 X)
- 자바는 하나의 부모클래스만 상속 가능(단일상속)
- 부모클래스의 private 접근 갖는 필드와 메소드 제외
◆ 상속의 효과
- 같은 종류의 객체들의 규격을 명시하는 효과
- 부모클래스를 재 사용하여 시간 절약
- 반복된 코드 중복 제거
- 유지보수 편리성
◆ 부모 생성자 호출 super(...)
- 생성자 내 첫줄에 super( ) 키워드를 통해 부모 생성자가 호출/생성
- 자식 객체를 생성할 때는 부모 객체부터 생성 후 자식 객체가 생성
- 컴파일러가 자동적으로 super()키워드는 넣지만 명시적으로 넣어주는 것이 안정성이 있다.
(특히, 매개변수가 있는 부모 생성자를 사용하는 경우 super키워드로 값을 명시적으로 작성해야한다!)
◆ 메소드 재정의(Override)
- 부모 클래스에서 상속받은 메소드를 수정하여 자식 클래스에서 재정의하는 것
- 재정의된 자식클래스의 메소드가 실행됨으로써 부모 메소드는 숨겨지는 효과 발생
- @Override 어노테이션 사용을 통해 컴파일러 검사를 실시
※ Override의 조건
- 부모클래스의 메소드와 동일한 시그니처를 가져야 한다.
- 접근제한을 더 강하게 변경할 수 없다.
- 새로운 예외처리는 불가하다.
◆ 부모 메소드 사용 super(...)
- 자식클래스에서 수정되기 이전의 부모 메소드 호출하려면 super( ) 사용
super.부모메소드( ) : 여기서 super( )의 의미는 부모 객체를 참조한다는 의미
◆ final 클래스와 final 메소드
- final 필드 : 수정 불가 필드
- final 클래스 : 상속 불가한 클래스
- final 메소드 : 자식이 재정의할 수 없는 메소드
※ final 키워드가 붙으면 마지막이라는 뜻!!!
◆ 상속과 다형성
- 다형성이란? 같은 타입이지만 실행 결과가 다양한 객체 대입 가능한 성질을 의미
- 상속에서의 다형성 : 타입변환을 통해 / Override를 통해 가능 ★★★★★
결과적으로 OOP에서의 다형성 구현을 위해서는 상속이 전제되어야 한다!!!
1. 자동타입변환(Promotion)
- 프로그램 실행 도중에 자동 타입 변환이 일어나는 것 => Promotion
- 부모타입변수에 자식객체를 대입하면 자동타입 변환(Promotion)이 발생
(타입 간 상속 계층의 상위면 자동타입 변환도 가능)
※ 이때, 부모클래스 안에 자식타입이 포함되어 숨기 때문에
겉으로 보이는 부모클래스에 선언된 필드와 메소드만 사용가능하다!
(예외 : 자식타입에서 재정의된 메소드는 호출 가능하다!!)
2. 강제타입변환(Casting)
- 큰 타입을 작은 타입으로 강제로 변환하는 것 => Casting
- 조건 : 자식타입이 부모 타입으로 자동 변환되어 있는 경우!!!
- 용도 : 부모타입에 선언된 필드와 메소드만 필요할 때
자식 타입에 선언된 필드와 메소드가 필요할 때
다시 말해, 부모타입으로 형변환되어있는 자식 타입으로 다시 강제 형변환하는 것!
※ 객체타입 확인 (instanceof)
- 강제 타입 변환 하기 전, 해당 자식 타입이 맞는지 확인하기 위해서 사용