상속관계
public class Child extends Parents {
...
}
- 상속은 객체 지향 프로그래밍의 핵심 요소 중 하나로, 기존 클래스의 필드와 메서드를 새로운 클래스에서 재사용하게 해주는 기능
- 상속을 사용하려면 extends 키워드를 사용
- 상속의 대상은 오직 하나
- 부모 클래스(슈퍼 클래스) : 상속을 통해 자신의 필드와 메서드를 다른 클래스에 제공하는 클래스
- 자식 클래스(서브 클래스) : 부모 클래스로부터 필드와 메서드를 상속받는 클래스
상속과 메모리 구조
- 객체 생성 시 ElectricCar 뿐만 아니라 상속 관계에 있는 Car까지 함께 포함해서 인스턴스를 생성
- 참조값은 x001로 하나이지만 실제로 그 안에서는 Car, ElectricCar라는 두가지 클래스 정보가 공존
- 상속 관계를 사용하면 부모의 필드와 메서드만 물려 받는게 아닌, 부모 클래스도 함께 포함해서 생성
- 외부에서 볼때는 하나의 인스턴스를 생성하는 것 같지만 내부에서는 부모와 자식이 모두 생성되고 공간도 구분됨
- 메서드와 필드 선택은 호출하는 변수의 타입(클래스)를 기준으로 선택
- 자식 타입에 메서드나 필드가 없으면 부모 타입으로 올라가서 찾음
- 부모에서도 해당 메서드나 필드를 찾지 못하면 더 상위 부모에서 필요한 기능을 찾음, 계속 찾아도 없으면 컴파일 오류 발생
메서드 오버라이딩
- 부모에게서 상속 받은 기능을 자식이 재정의 하는것을 의미
- @Override 애노테이션 선언 필요
메서드 오버라이딩 조건
- 메서드 이름 : 메서드 이름이 같아야 한다.
- 메서드 파라미터 : 파라미터의 타입, 순서, 개수가 같아야 한다.
- 반환 타입 : 반환 타입이 같아야 한다. 단, 반환 타입이 하위 클래스 타입일 수 있다.
- 접근 제어자 : 오버라이딩 메서드의 접근 제어자는 상위 클래스의 메서드보다 더 제한적이어서는 안된다.
- private -> default -> protected -> public 순으로 제한 범위가 넓음
- 상위 클래스의 메서드가 protected로 선언된 경우, 하위 클래스에서는 protected, public으로만 선언 가능
- 예외 : 오버라이딩 메서드는 상위 클래스의 메서드보다 더 많은 체크 예외를 throws로 선언할 수 없다.
- 더 적거나 같은 수의 예외, 또는 하위 타입의 예외는 선언 가능
- static, final, private : 해당 키워드가 붙은 메서드는 오버라이딩 될 수 없다.
- static : 클래스 레벨에서 작동하므로 인스턴스 레벨에서 사용하는 오버라이딩이 의미가 없음
- final : 재정의 금지
- private : 해당 클래스에서만 접근 가능하기 때문에 하위 클래스에서 사용 불가
- 생성자 오버라이딩 : 생성자는 오버라이딩 할 수 없다.
오버로딩(Overloading) vs 오버라이딩(Overriding)
- 오버로딩 : 메서드 이름이 같고 파라미터가 다른 메서드를 여러개 정의하는 것(과하게 물건을 담았다는 뜻)
- 오버라이딩 : 하위 클래스에서 상위 클래스의 메서드를 재정의하는 것
super
- 부모 클래스에 대한 참조를 나타냄
- 부모와 자식의 필드명이 같거나 메서드가 오버라이딩 되어 있으면 자식에서 부모의 필드나 메서드를 호출할 수 없기에 super를 사용
생성자 호출
- 상속 관계인 인스턴스를 생성하면 결국 메모리 내부에는 자식과 부모 클래스가 각각 만들어지기 때문에 각각의 생성자도 모두 호출되어야 함
- 상속 관계를 사용하면 자식 클래스의 생성자에서 부모 클래스의 생성자를 반드시 호출해야 함
- 상속을 받으면 생상자의 첫줄에 super(...)를 사용해서 부모 클래스의 생성자를 호출해야 함
- 부모 클래스의 생성자가 기본 생성자인 경우에는 super() 생략 가능
- 상속 관계의 생성자 호출은 부모에서 자식 순서로 실행됨
'Java > Basic' 카테고리의 다른 글
다형성과 메서드 오버라이딩 (0) | 2024.12.31 |
---|---|
instanceof (0) | 2024.12.31 |
다형성과 캐스팅 (0) | 2024.12.30 |
static (1) | 2024.12.08 |
메모리 구조 (2) | 2024.12.08 |