1. 메서드 오버라이딩(Overriding)
오버라이딩은 부모 클래스에 정의된 메서드를 자식 클래스에서 재정의하는 것이다. 상속 관계에서만 사용할 수 있다.
조건
- 메서드 이름 동일
- 시그니처 동일
- 반환 타입 동일
- 접근제어자는 부모보다 좁아질 수 없음
오버라이딩 시에 @Overrider 애노테이션을 사용하는 것이 권장된다. 컴파일 단계에서 재정의 여부를 검토해주기 때문이다.
public class Main {
public static void main(String[] args) {
Bike bike = new Bike();
Car car = new Car();
MotorBike motorBike = new MotorBike();
bike.run();
car.run();
motorBike.run();
}
}
class Vehicle {
void run() {
System.out.println("Vehicle is running");
}
}
class Bike extends Vehicle {
@Override
void run() {
System.out.println("Bike is running");
}
}
class Car extends Vehicle {
@Override
void run() {
System.out.println("Car is running");
}
}
class MotorBike extends Vehicle {
@Override
void run() {
System.out.println("MotorBike is running");
}
}
//결과
Bike is running
Car is running
MotorBike is running
2. 오버라이딩의 동작 방식: 동적 바인딩 (Dynamic Binding)
부모 타입의 참조 변수로 자식 객체를 참조하더라도, 실제로 실행되는 메서드는 자식 클래스에서 오버라이딩한 메서드이다. 즉, 메서드 호출은 참조 변수의 타입이 아니라 실제 객체의 타입을 기준으로 결정된다. 이로 인해 같은 메서드 호출이라도 객체에 따라 서로 다른 동작을 하게 된다.
class Animal {
public void cry() {
System.out.println("동물이 울음소리를 냅니다.");
}
}
class Tiger extends Animal {
@Override
public void cry() {
System.out.println("호랑이가 울음소리를 냅니다. 어흥~~~~");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Tiger();
animal.cry(); // "호랑이가 울음소리를 냅니다. 어흥~~~~"
}
}
**오버로딩 vs 오버라이딩** 은 면접 단골 문제이므로 잘 기억해두자!!
3. Super 키워드
super는 부모 클래스를 가리키는 참조 키워드이다. 자식 클래스 내부에서 부모 클래스의 멤버에 접근할 때 사용된다.
오버라이딩된 메서드 안에서 부모의 원래 메서드를 호출하고 싶을 때 super.메서드()를 사용한다.
class Parent {
void hello() {
System.out.println("부모 클래스 메서드");
}
}
class Child extends Parent {
@Override
void hello() {
super.hello(); // 부모 메서드 호출
System.out.println("자식 클래스 메서드");
}
}
//실행 결과
부모 클래스 메서드
자식 클래스 메서드
4. super() 생성자 호출
super()는 부모 클래스의 생성자를 호출하는 구문이다.
- 자식 클래스의 생성자에서 사용
- 생성자 첫줄에서만 호출 가능
- 명시하지 않아도 기본 생성자가 자동 호출됨
부모 클래스에 기본 생성자가 없을 경우, 자식 클래스에서 super(매개변수)를 반드시 명시해야 함.
class Parent {
Parent() {
System.out.println("부모 생성자");
}
}
class Child extends Parent {
Child() {
// super() 자동 호출
System.out.println("자식 생성자");
}
}
//실행 결과
부모 생성자
자식 생성자
class Parent {
Parent(int x) {
System.out.println("부모 생성자: " + x);
}
}
class Child extends Parent {
Child() {
super(10); // 필수, 생략 시 컴파일 오류가 발생함 (부모의 기본 생성자가 없기 때문)
System.out.println("자식 생성자");
}
}
5. super vs this
- this : 현재 객체
- super : 부모 객체
두 키워드는 생성자, 메서드, 필드 접근에서 명확히 구분되어 사용된다.
6. 정리
- 오버라이딩은 부모 메서드를 자식에서 재정의하는 것이다
- 메서드 호출은 실제 객체 기준으로 결정된다.
- super는 부모 클래스의 멤버에 접근할 때 사용한다.
- super()는 부모 생성자를 호출한다.
'Java & Spring' 카테고리의 다른 글
| Getter/Setter와 관리 규약 (0) | 2026.01.06 |
|---|