상속 : 부모 클래스의 필드와 메서드를 자식 클래스에게 물려주는 것
extends
키워드로 정의상속 관계 : is-a
포함 관계 : has-a
⚠️ JAVA는 다중 상속을 허용하지 않음
final
final 클래스 : 최종 클래스가 되므로 상속 불가
final 메서드 : 최종 메서드가 되므로 오버라이딩 불가
JAVA 내 모든 클래스들의 최상위 부모 클래스
모든 클래스는 Object의 메서드 사용 가능
부모 클래스가 없는 자식 클래스는 자동으로 Object Class를 상속받음
// Object Class 메서드
- Object clone() : 해당 객체의 복제본을 생성하여 반환
- boolean equals(Object object) : 해당 객체와 전달받은 객체가 같은지 여부를 반환
- Class getClass() : 해당 객체의 클래스 타입을 반환
- int hashCode() : 자바에서 객체를 식별하는 정수값인 해시 코드를 반환
- String toString() : 해당 객체의 정보를 문자열로 반환
부모 클래스로부터 상속 받은 메서드의 내용을 재정의 하는 것
조건
1. 선언부가 부모 클래스의 메서드와 일치해야함
2. 접근 제어자를 부모 클래스의 메서드보다 좁은 범위로 변경 불가
3. 부모 클래스 메서드보다 많은 예외 선언 불가
// horn 메서드 오버라이딩 예시
public class Car {
public void horn() {
System.out.println("빵빵");
}
}
public class SportsCar extends Car{
@Override
public void horn() {
System.out.println("엔진 " + engine + " 부앙~\n");
}
}
부모 클래스의 멤버를 참조할 수 있는 키워드
객체 내부 생성자 및 메서드에서 부모 클래스의 멤버에 접근하기 위해 사용
자식 클래스 내부에서 선언한 멤버와 부모 클래스에서 상속받은 멤버 이름이 같은 경우 구분하기 위해 사용
public void setCarInfo(String model, double price) { // 자식 클래스 메서드
super.model = model; // model은 부모 필드에 set
this.price = price; // price는 자식 필드에 set
}
super()
부모 클래스이 생성자를 호출할 수 있는 키워드
자식 클래스 객체 생성시 부모 클래스들까지 합쳐서 하나의 인스턴스 생성
이 때, 부모 클래스 멤버들의 초기화 작업이 먼저 이루어져어야 하므로 자식 클래스 생성자에서 부모 클래스 생성자를 첫 줄에 호출
// 자식 클래스 SportsCar 생성자
public SportsCar(String model, String color, double price, String engine) {
super(model, color, price); // 부모 클래스 생성자 호출
this.engine = engine;
}
참조 변수의 타입 변환
자동 타입 변환
부모타입 변수 = 자식타입 객체
: 자동으로 부모타입으로 변환강제 타입 변환
자식타입 변수 = (자식타입) 부모타입 객체
: 타입 변환 연산자를 사용해 강제로 자식 타입으로 변환다형성
여러 가지 형태를 가질 수 있는 능력
구성 하고 있는 객체를 변경하면 소프트웨어의 실행 성능 및 결과물이 달라짐
Tire tire = new HankookTire("HANKOOK");
Tire tire = new KiaTire("KIA");
부모타이어 변수 = 자식타이어 객체
를 선언하여 자동 타입변환된 변수를 사용 ➡️ 각각의 자식 타이어 객체에 재정의된 메서드를 통해 다양한 자동차 생성public Car(Tire tire) {
this.tire = tire;
}
Car car1 = new Car(new KiaTire("KIA"));
Car car2 = new Car(new HankookTire("HANKOOK"));
Tire getHankookTire() {
return new HankookTire("HANKOOK"); // 자동 타입 변환
}
Tire getKiaTire() {
return new KiaTire("KIA");
}
Tire hankookTire = car1.getHankookTire();
KiaTire kiaTire = (KiaTire) car2.getKiaTire(); // 강제 타입 변환
instance of
해당 클래스 객체의 원래 클래스명을 체크할 때 사용하는 명령어
사용 : {대상 객체} instance of {클래스 이름}
➡️ boolean 타입으로 응답
추상 클래스 : 구현되지 않은 미완성 설계도
자식 클래스에 상속되어 자식 클래스에 의해서만 완성될 수 있음
여러개의 자식 클래스들에서 공통적인 필드나 메서드를 추출해서 만들 수 있음
선언 : abstract
키워드 사용
추상 메서드 : 구현되지 않은 미완성 메서드, 정의만 할 뿐 실행 내용이 없음
상속 받은 클래스에서 추상 클래스의 추상 메서드는 반드시 오버라이딩 되어야함
public abstract class 추상클래스 {
abstract 리턴타입 메서드이름(매개변수); // 구현 부분 X
}
public class 클래스명 extends 추상클래스명 {
@Override
public 리턴타입 메서드이름(매개변수) { // 추상 메서드 오버라이딩
// 실행문
}
}