자식(하위, 파생) 클래스가 부모 클래스의 멤버를 물려받는 것으로, 자식이 부모를 선택함
상속 대상은 부모의 필드와 메소드
부모 클래스를 재사용함으로써 자식 클래스 빨리 개발 가능하며, 반복된 코드의 중복을 줄여줌
유지보수의 편리성을 제공해주며 객체의 다형성 구현 가능
부모 클래스의 private 접근을 갖는 필드와 메소드는 제외되며, 부모 클래스가 다른 패키지에 있을 경우 default 접근을 갖는 필드와 메소드도 제한됨
자식 클래스가 상속할 부모 클래스를 지정하는 키워드는 extends
public class B extends A{}
다중 상속은 허용되지 않기 때문에 부모 나열 불가능 (Java 8 기준)
자식 객체를 생성하려면 부모 객체 먼저 생성된 후에 자식 객체가 생성된다.
즉, 부모 생성자가 호출 완료된 이후에 자식 생성자가 호출 완료된다.
public class CellPhone{
public CellPhone(){
}
}
public class DmbCellPhone extends CellPhone{
public DmbCellPhone(){
super();
}
}
DmbCellPhone dmbCellPhone = new DmbCellPhone(); // super() 통해서 CellPhone 선 생성 후 DmbCellPhone 생성
부모 객체 생성할 때 부모 생성자를 선택해 호출 가능함
super(매개값,...)
은 매개값과 동일한 타입, 개수, 순서가 맞는 부모 생성자를 호출하므로, 부모 생성자가 없다면 컴파일 오류가 발생함
반드시 자식 생성자의 첫줄에 위치해야하며, 명시하지 않는 경우 기본 생성자가 호출되며, 기본 생성자가 없는 부모 클래스인 경우 필수적으로 명시해야함
부모 클래스의 상속 메소드를 수정해서 자식 클래스에서 재정의하는 것
컴파일러에게 부모 클래스의 메소드와 선언부가 동일한 지 검사하도록 지시하는 것으로 정확한 메소드 재정의를 위해 붙여 주는 것이 좋음
메소드 재정의를 통해서 부모 메소드는 숨겨지는 효과가 발생함
자식 클래스에서 수정되기 전의 부모 메소드를 호출하기 위해서는 super
사용
super.부모메소드();
즉, final 이 붙은 클래스와 메소드는 상속과 관련되어 있음
final과 마찬가지로 상속과 관련된 접근 제한자
같은 타입이지만 실행 결과가 다양한 객체를 대입(이용)할 수 있는 성질로 부모 타입에는 모든 객체가 대입 가능하며 자식 타입은 부모 타입으로 자동 형변환
프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것
상속 계층에서는 어떤 상위 타입이라도 자동 타입 변환 가능
효과
부모 클래스에 선언된 필드와 메소드만 접근가능하며,
메소드가 재정의된 경우 자식 클래스의 재정의된 메소드가 호출됨
이는 다형성과 관련있음
부모 타입으로 자동 변환 가능, 재정의된 메소드 있는 경우 다형성이 구현 가능
class Car{
Tire frontLeftTire = new Tire();
Tire frontRightTire = new Tire();
Tire backLeftTire = new Tire();
Tire backRightTire = new Tire();
void run(){
frontLeftTire.roll();
frontRightTire.roll();
backLeftTire.roll();
backRightTire.roll();
}
Car myCar = new Car();
myCar.frontRightTire = new HankookTire();
myCar.backLeftTire = new KumhoTire();
myCar.run();
}
부모 타입의 배열을 선언한 후, 각 요소에 자식 타입의 객체 저장 가능
매개 변수가 클래스 타입인 경우 해당 클래스 객체 외 자식 객체 대입도 허용
부모 타입을 자식 타입으로 변환시키는 경우
특정 조건에서만 가능
자식 타입이 부모 타입으로 자동 변환될 경우 부모 타입에 선언된 필드와 메소드만 사용 가능하므로 자식 타입의 필드와 메소드 사용할 경우 강제 타입 변환이 필요함
부모타입이라고 무조건 자식 타입 강제 변환 가능한 것이 아님
먼저 해당 객체가 자식타입의 객체인지 확인한 이후에 강제 타입 해야함
boolean result = parent instanceof Child
parent 변수가 참조하는 객체가 Child인지 조사
실체 클래스들의 공통된 특성을 추츨한 클래스로 실제 클래스의 부모 클래스 역할을 할 수 있음
단, 단독 객체 생성은 불가능하고, 부모 클래스로만 사용됨
실체 클래스의 공통된 필드와 메소드의 이름을 통일할 목적
실체 클래스를 작성할 떄 시간을 절약
실체 클래스 설계 규격을 만들고자 할 때
메소드의 이름을 동일하지만 실행 내용은 실체 클래스마다 다를 수 있음
추상 클래스에는 메소드의 선언부만 작성해 추상 메소드 선언
실체 클래스에서 메소드의 실행 내용을 작성해 오버라이딩