상속
- 상속의 사전적 정의는 부모가 자식에게 물려주는 행위를 말함
- 부모 클래스의 필드와 메서드를 자식 클래스에게 물려줄 수 있다.
- 상속을 사용하면 적은 양의 코드로 새로운 클래스를 작성할 수도 있고 공통적인 코드를 관리하여 코드의 추가와 변경이 쉬워질 수도 있다.
방법
- 클래스간의 상속은
extends 키워드를 사용하여 정의
public class 자식클래스 extends 부모클래스 {
}
클래스간의 상속
- 부모 클래스에 새로운 필드와 메서드가 추가되면 자식 클래스는 이를 상속받아 사용할 수 있다.
- 자식 클래스에 새로운 필드와 메서드가 추가되어도 부모 클래스는 어떠한 영향도 받지 않는다.
- 따라서 자식 클래스의 멤버 개수는 부모 클래스보다 항상 같거나 많다.

단일 상속과 다중 상속
- Java는 다중상속을 허용하지 않음
- Java는 단일 상속만 허용
- 다중상속을 허용하면 클래스간의 관계가 복잡해지는 문제가 생기기 때문
- 만약 자식 클래스에서 상속받는 서로 다른 부모 클래스들이 같은 이름의 멤버를 가지고 있다면 자식 클래스에서는 이 멤버를 구별할 수 있는 방법이 없다는 문제가 생김
final 클래스와 final 메서드
final 클래스
- 클래스에 final 키워드를 지정하여 선언하면 최종적인 클래스가 됨으로 더 이상 상속할 수 없는 클래스가 된다.
public final class Car {}
...
public class SportsCar extends Car{} // 오류가 발생합니다.
final 메서드
- 메서드에 final 키워드를 지정하여 선언하면 최종적인 메서드가 됨으로 더 이상 오버라이딩할 수 없는 메서드가 된다.
Object
- Object 는 말그대로 “객체”를 의미하는 단어이며 보통, Object 클래스를 의미
- Object 클래스는 Java 내 모든 클래스들의 최상위 부모 클래스를 의미
- 따라서, 모든 클래스는 Object의 메서드를 사용 가능
- 부모 클래스가 없는 자식 클래스는 컴파일러에 의해 자동으로 Object 클래스를 상속받게 된다.
Object 클래스의 메서드
- Object clone() : 해당 객체의 복제본을 생성하여 반환함.
- boolean equals(Object object) : 해당 객체와 전달받은 객체가 같은지 여부를 반환함.
- Class getClass() : 해당 객체의 클래스 타입을 반환함.
- int hashCode() : 자바에서 객체를 식별하는 정수값인 해시 코드를 반환함.
- String toString() : 해당 객체의 정보를 문자열
로 반환함. & Object 클래스에서는 클래스이름 @해쉬코드값 리턴함.
- …
오버라이딩
- 부모 클래스로부터 상속받은 메서드의 내용을 재정의 하는 것
- 부모 클래스의 메서드를 그대로 사용 가능하지만 자식 클래스의 상황에 맞게 변경을 해야하는 경우 오버라이딩을 사용
오버라이딩 조건
- 선언부가 부모 클래스의 메서드와 일치해야 합니다.
- 접근 제어자를 부모 클래스의 메서드 보다 좁은 범위로 변경 불가
- 예외는 부모 클래스의 메서드 보다 많이 선언할 수 없습니다.
super와 super()
super
- 부모 클래스의 멤버를 참조할 수 있는 키워드
- 객체 내부 생성자 및 메서드에서 부모 클래스의 멤버에 접근하기 위해 사용
- 자식 클래스 내부에서 선언한 멤버와 부모 클래스에서 상속받은 멤버와 이름이 같을 경우 이를 구분하기 위해 사용
super 사용 예시
- 자식 클래스의 메서드를 호출하면 super 키워드로 접근한 부모 클래스의 model, color 필드에 매개변수의 값이 저장
- this 키워드로 접근한 자식 클래스의 price 필드에는 매개변수의 값이 저장
// 부모 클래스 : Car
String model; // 자동차 모델
String color; // 자동차 색상
double price; // 자동차 가격
// 자식 클래스 : SportsCar
String model = "Ferrari"; // 자동차 모델
String color = "Red"; // 자동차 색상
double price = 300000000; // 자동차 가격
// 자식 클래스의 메서드
public void setCarInfo(String model, String color, double price) {
super.model = model; // model은 부모 필드에 set
super.color = color; // color는 부모 필드에 set
this.price = price; // price는 자식 필드에 set
}
super()
- 부모 클래스의 생성자를 호출할 수 있는 키워드
- 객체 내부 생성자 및 메서드에서 해당 객체의 부모 클래스의 생성자를 호출하기 위해 사용
- 자식 클래스의 객체가 생성될 때 부모 클래스들이 모두 합쳐져서 하나의 인스턴스가 생성
super() 사용 예시
- 부모 클래스의 멤버들의 초기화 작업이 먼저 수행이 되어야 함.
- 자식 클래스 객체를 생성할 때 생성자 매개변수에 매개값을 받아와 super(…)를 사용해 부모 생성자의 매개변수에 매개값을 전달하여 호출하면서 부모 클래스의 멤버를 먼저 초기화
- 자식 클래스의 생성자에서는 부모 클래스의 생성자가 호출
- 오버로딩된 부모 클래스의 생성자가 없다고 하더라도 부모 클래스의 기본 생성자를 호출
- 눈에 보이지는 않지만 컴파일러가 super(); 를 자식 클래스 생성자 첫 줄에 자동으로 추가해줌
- 부모 클래스의 생성자는 가장 첫 줄에서 호출이 되어야한다.
// 부모 클래스 Car 생성자
public Car(String model, String color, double price) {
this.model = model;
this.color = color;
this.price = price;
}
// 자식 클래스 SportsCar 생성자
public SportsCar(String model, String color, double price, String engine) {
// this.engine = engine; // 오류 발생
super(model, color, price);
this.engine = engine;
}
정리하기
상속이란
- 부모 클래스의 필드와 메서드를 자식 클래스에게 물려주는 행위
Object란
- Java 내 모든 클래스들의 최상위 부모 클래스를 의미
오버라이딩이란
- 부모 클래스로부터 상속받은 메서드의 내용을 재정의하는 것
final 메서드 vs final 클래스
- final 메서드 : 더 이상 오버라이딩할 수 없는 메서드
- final 클래스 : 더 이상 상속을 할 수 없는 메서드
this vs super
- this : 자신 클래스의 메서드, 멤버 접근 키워드
- super : 부모 클래스의 메서드, 멤버 접근 키워드
this() vs super()
- this() : 자신 클래스의 다른 생성자를 호출하는 키워드
- super() : 부모 클래스의 생성자를 호출하는 키워드