TIL

상속과 오버라이딩(Overriding)

류정근 2024. 4. 30. 22:26
오버라이딩!! 이해라도 해보자!!

 

필요한 이유

부모 타입의 기능을 자식에서는 다르게 재정의 하고 싶을 수 있기 때문!!

 

오버라이딩이란

부모에게서 상속 받은 기능을 자식이 재정의 하는 것을 메서드 오버라이딩(Overriding)이라 한다.

 

사용방법

package extends1.overriding;
public class Car {
public void move() {
System.out.println("차를 이동합니다.");
}
public void openDoor() {
System.out.println("문을 엽니다.");
}
}

부모클래스(Car)

package extends1.overriding;
public class ElectricCar extends Car {
@Override
public void move() {
System.out.println("전기차를 빠르게 이동합니다.");
}
public void charge() {
System.out.println("충전합니다.");
}
}

자식클래스(ElectricCar)

 

ElectricCar 의 move()를 호출하면 Car 의 move() 가 아니라 ElectricCar 의 move()가 호출된다.

 

@Override <- 이 부분을 애노테이션이라고 부른다. 애노테이션은 주석과 비슷한데, 프로그램이 읽을 수 있는 특별한 주석이라 생각 하면 된다. 상위 클래스의 매서드를 오버라이드 하는 것임을 나타낸다. 필수는 아니지만 명확성을 위해 붙여주는 것이 좋다.

Car의 move() 메서드를 ElectricCar 에서 오버라이딩 했다.

 

오버라이딩과 메모리 구조

ElectricCar` 타입에 `move()` 메서드가 있다. 해당 메서드를 실행한다. 이때 실행할 메서드를 이미 찾았으므
로 부모 타입을 찾지 않는다.

 

오버로딩(Overloading)  VS 오버라이딩(Overriding)

메서드 오버로딩

메서드 이름은 같지만 매개변수(파라미터)가 다른 메서드를 여러개 정의하는 것.

 

매서드 오버라이딩

하위 클래스에서 상위클래스의 메서드를 재정의하는 것.

(실무에서는 메서드 오버라이딩, 메서드 재정의 둘다 사용한다.)

 

메서드 오버라이딩 조건

1. 메서드 이름: 메서드 이름이 같아야 한다.

2. 메서드 매개변수(파라미터): 매개변수(파라미터) 의 타입, 순서, 개수가 같아야 한다.

3.반환타입: 반환 타입이 같아야한다. ( 단, 반환타입이 하위 클래스 타입일 수 있다.)

4. 접근 제어자: 오버라이딩 메서드의 접근 제어자는 상위 클래스의 메서드보다 더 제한적이어서는 안된다.

(ex,  상위 클래스의 메서드가 portcted로 선언되면 하위 메서드에서는 private , default로 오버라이딩 불가)

5.예외: 오버라이딩 메서드는 상위 클래스의 메서드보다 더 많은 체크 예외를 `throws` 로 선언할 수 없다.(더 적거나 같은 수의 예외, 또는 하위 타입의 예외는 선언할 수 있다.)

6. static , final, private:  이 키워드가 붙은 메서드는 오버라이딩 될 수 없다.

`static` 은 클래스 레벨에서 작동하므로 인스턴스 레벨에서 사용하는 오버라이딩이 의미가 없다. 쉽게 이
야기해서 그냥 클래스 이름을 통해 필요한 곳에 직접 접근하면 된다.
`final` 메서드는 재정의를 금지한다.
`private` 메서드는 해당 클래스에서만 접근 가능하기 때문에 하위 클래스에서 보이지 않는다. 따라서 오
버라이딩 할 수 없다.

7.생성자 오버라이딩: 생성자는 오버라이딩 할 수 없다.

 

추가

 

접근 제어자의 종류


`private` : 모든 외부 호출을 막는다.
`default` (package-private): 같은 패키지안에서 호출은 허용한다.
`protected` : 같은 패키지안에서 호출은 허용한다. 패키지가 달라도 상속 관계의 호출은 허용한다.
`public` : 모든 외부 호출을 허용한다.
순서대로 `private` 이 가장 많이 차단하고, `public` 이 가장 많이 허용한다.
`private -> default -> protected -> public`

 

출처 : 김영한의 실전 자바 - 기본편

'TIL' 카테고리의 다른 글

Enum 이해하기  (1) 2024.05.09
예외처리하기  (0) 2024.05.01
인터페이스  (0) 2024.04.29
추상클래스  (0) 2024.04.27
상속 정복하기  (0) 2024.04.27