오버라이딩(Overriding)
✒️ 2025-05-16 13:55 내용 수정
1. 메서드 오버로드
같은 이름의 메서드를 중복하여 정의하는 것
- 메서드 오버로딩 참고.
public ClassName();
public ClassName(int);
public ClassName(double);
public ClassName(int a, String "");
2. 메서드 오버라이딩
상속관계에서 상위클래스가 상속해준 메서드의 내용을 다시 정의하여 메서드를 구현하는 기술
- 단, 메서드의 이름, 리턴 타입은 동일하게 지정해야 한다.
- 서브타입(부모의 메서드가 리턴하는 타입의 하위 클래스에 속하는 타입)은 리턴할 수 있다.
- 부모 클래스의 메서드보다 더 좁은 범위의 접근 제어자로 변경할 수 없다.
- 부모 클래스의 메서드보다 더 큰 범위의 예외를 선언할 수 없다.
- 부모 클래스의 static 메서드는 자식 클래스에서 오버라이딩할 수 없다.
- 제어자 참고.
- 자식 클래스가 static 메서드를 상속받는 것처럼 보이지만, 실제로는 직접 호출하는 것이다.
super.staticMethod()가 안되고,Parent.staticMethod()이다.- 참고 자료 : 최진영's static은 상속이 될까
- Hiding : 부모 클래스의 static 메서드를 자식 클래스에서 다시 정의하면 부모 클래스에 있는 메서드가 가려지게 된다. 이는 오버라이딩된게 아니라 해당 메서드의 호출 환경에 따라 2개의 메서드를 모두 사용할 수 있음을 말한다.
public class Car {
public void turnOn() {
System.out.println("시동 거는 중");
}
public void turnOff() {
System.out.println("시동 끄는 중");
}
// static 메서드
// 자식 클래스에서 오버라이딩 불가
public static void colorChange() {
System.out.println("색상 설정");
}
}
public class MorningCar extends Car {
// Car.turnOn()을 재정의
@Override
public void turnOn() {
super.turnOn(); // Car.turnOn() 내용이 실행된다
System.out.println("Morning과 함께 출발!");
}
// Car.turnOff()를 재정의
@Override
public void turnOff() {
super.turnOff(); // Car.turnOff() 내용이 실행된다
System.out.println("안전하게 도착!");
}
// 부모 클래스의 static 메서드 재정의 시
// 부모 클래스의 메서드가 가려짐(Hiding)
// 환경에 따라 부모와 자식의 메서드 모두 호출 가능
public static void colorChange() {
System.out.println("검은색");
}
}
public class CarTest {
public static void main(String[] args) {
Car.colorChange(); // 색상 설정
MorningCar.colorChange(); // 검은색
MorningCar myCar = new MorningCar;
myCar.turnOn(); // 시동 거는 중
// Morning과 함께 출발!
myCar.turnOff(); // 시동 끄는 중
// 안전하게 도착!
}
}