Java 상속
상속이란?
- 상위(부모) 클래스의 멤버를 하위(자식, 파생) 클래스에게 물려줌
- 이미 잘 개발된 클래스를 재사용해서 새 클래스를 만들어 코드 중복 줄여줌
- 접근 제한자가 private면 상속받기 불가능
- 다른 패키지의 클래스를 상속받으려면 접근 제한자가 default면 상속받기 불가
- 다중 상속 불가
클래스 상속
- 하위 클래스를 선언할 때, 어떤 상위 클래스를 상속받을지 결정
class 하위클래스 extends 상위클래스 {}
- 상위 클래스는 하위 클래스 보다 더 일반적인 개념과 기능을 가짐
- 하위 클래스는 상위 클래스 보다 더 구체적인 개념과 기능을 가짐
부모 생성자 호출 super()
- 모든 객체는 클래스의 생성자를 호출해야만 생성됨
- 하위 객체를 생성하면 상위 객체가 먼저 생성됨
메서드 재정의(오버라이딩)
- 상속된 일부 메서드를 하위 클래스에서 수정해서 사용
메서드 재정의
- 하위 클래스에서 동일한 메서드를 재정의하는 것
- 상위 클래스의 메서드와 동일한 리턴 타입, 메서드명, 매개 변수를 가져야 함
- 접근 제한을 더 강하게 할 수 없음
- 상위 클래스의 메서드가 public이면 하위 클래스의 메서드도 public
- 새로운 예외를 throws 할 수 없음
부모 메서드 호출
- 오버라이딩되면 상위 클래스의 메서드는 숨겨짐
- 하위 클래스 내부에서 오버라이딩된 상위 클래스의 메서드를 호출해야 되면 super 키워드 사용
final클래스와 final메서드
- final 키워드는 클래스, 필드, 메서드 선언에 사용 가능
- 결코 수정할 수 없음
final 클래스
- 최종적인 클래스로 상속할 수 없음
- final 클래스는 상위 클래스가 될 수 없음
final 메서드
- 최종적인 메서드
- 오버라이딩 할 수 없는 메서드
타입 변환과 다형성
다형성
- 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질
- 상위 클래스로 타입변환을 허용
- 상위 타입에 모든 하위 객체가 대입될 수 있음
타입 변환
- 데이터 타입을 다른 데이터 타입으로 변환
- 클래스의 타입 변환은 상속관계에 있는 클래스 사이에서 발생
- 하위 타입은 상위 타입으로 자동 타입 변환이 가능
자동 타입 변환
- 프로그램 실행 중에 자동적으로 타입 변환이 일어남
- 하위 -> 상위
- 상위 타입으로 자동 타입 변환이 되면 상위 클래스에 선언된 필드와 메서드만 접근 가능
- 하위 클래스에서 오버라이딩되었다면 하위 클래스의 메서드가 호출됨
배열로 객체 관리
- 동일한 타입의 값들은 배열로 관리하는 것이 유리
매개변수의 다형성
- 메서드를 호출할 때, 매개 변수의 타입과 동일한 매개값을 지정하는 것이 정석
- 매개값을 다양화하기 위해 매개 변수에 자식 타입 객체를 지정할 수도 있음
- 매개 변수의 타입이 클래스일 경우, 해당 클래스의 객체뿐만 아니라 하위 객체까지도 매개값으로 사용 가능(자동 타입 변환)
- 하위 객체가 메서드를 오버라이딩(재정의) 했다면 실행 결과가 다양해짐
강제 타입 변환(Casting)
- 상위 -> 하위
- 하위 타입이 상위로 자동 변환한 후, 다시 하위로 변환할 때 사용 가능
- 모든 상위 타입을 하위로 변환되지는 않음
하위클래스 변수명 = (하위클래스)상위클래스타입;
객체 타입 확인(instanceof)
- 강제 타입 변환은 하위 -> 상위 -> 하위의 형태만 가능
- 어떤 객체가 어떤 클래스의 인스턴스(객체)인지 확인하려면 instanceof연산자를 사용
boolean result = 변수명 instanceof 타입
추상 클래스
- 객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 함
- 클래스들의 공통적인 특성을 추출해 선언한 클래스를 추상 클래스라고 함
- 추상 클래스가 상위이고 실체 클래스가 하위의 관계(상속의 관계)
- 추상 클래스는 객체를 직접 생성할 수 없음
- 추상 클래스는 new 연산자를 사용해 인스턴스를 생성할 수 없음
- 실체 클래스를 만들기 위한 상위 클래스로만 사용됨
- extends 뒤에만 올 수 있는 클래스
추상 클래스의 용도
- 실체 클래스들의 공통된 필드와 메서드의 이름 통일
- 실체 클래스를 작성할 시간 절약
추상 클래스의 선언
- 클래스 선언에 abstract 키워드를 사용
- abstract 키워드를 사용하면 객체를 만들지 못하고 상속으로 하위 클래스만 만듬
- 필드, 생성자, 메서드를 선언 가능
- 하위 객체가 super()를 통해 추상 클래스 객체를 생성하므로 생성자가 반드시 필요
추상 메서드와 오버라이딩
- 메서드의 선언만 통일하고 실행 내용은 실체 클래스마다 달라야 할 경우
- 추상 클래스에선 추상 메서드를 선언 가능
- 메서드의 선언부만 있고 실행 내용이 없는 메서드
- 메서드 선언에 abstract 키워드를 사용하고 중괄호가 없음