Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 메소드 오버라이딩(재정의) 개념과 예제 완벽 정리

오버라이딩(Overriding)은 서브클래스 타입에 특화된 동작을 정의할 수 있는 기능입니다. 즉, 서브클래스는 자신의 요구 사항에 맞게 부모 클래스로부터 상속받은 메서드를 다시 구현할 수 있습니다.

객체지향 관점에서 오버라이딩이란 기존에 존재하는 메서드의 기능을 덮어써서 새롭게 정의하는 것을 의미합니다.

오버라이딩 예제

다음 예제를 통해 메서드 오버라이딩이 어떻게 동작하는지 살펴보겠습니다.

class Animal {
    public void move() {
        System.out.println("Animals can move");
    }
}
class Dog extends Animal {
    public void move() {
        System.out.println("Dogs can walk and run");
    }
}
public class TestDog {
    public static void main(String args[]) {
        Animal a = new Animal(); // Animal 참조 변수, Animal 객체
        Animal b = new Dog();    // Animal 참조 변수, Dog 객체
        a.move();  // Animal 클래스의 메서드 실행
        b.move();  // Dog 클래스의 메서드 실행
    }
}

실행 결과

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Animals can move
Dogs can walk and run

동작 원리

위 예제에서 주목할 점은 변수 bAnimal 타입으로 선언되었음에도 불구하고 Dog 클래스의 move() 메서드가 실행된다는 것입니다. 그 이유는 다음과 같습니다.

  • 컴파일 시점: 참조 변수의 타입을 기준으로 메서드의 존재 여부를 검사합니다.
  • 런타임 시점: JVM이 실제 객체의 타입을 판별하여 해당 객체에 속한 메서드를 실행합니다.

따라서 위 예제에서 Animal 클래스에 move 메서드가 존재하기 때문에 프로그램은 정상적으로 컴파일됩니다. 이후 런타임에는 실제 객체인 Dog에 특화된 메서드가 실행되는 것입니다. 이러한 메커니즘을 동적 바인딩(Dynamic Binding) 또는 런타임 다형성(Runtime Polymorphism)이라고 부릅니다.

오버라이딩 시 주의 사항

메서드를 올바르게 오버라이딩하기 위해서는 다음 규칙을 지켜야 합니다.

  • 메서드 이름, 매개변수 목록, 반환 타입이 부모 클래스의 메서드와 동일해야 합니다.
  • 접근 제한자는 부모 클래스의 메서드보다 같거나 더 넓은 범위로만 지정할 수 있습니다. 예를 들어 부모 메서드가 protected라면 자식에서 public으로 선언할 수 있지만, 그 반대는 불가능합니다.
  • 부모 클래스의 메서드가 final로 선언된 경우 오버라이딩할 수 없습니다.
  • 부모 클래스의 메서드가 static이라면 이는 오버라이딩이 아니라 하이딩(Hiding)으로 처리됩니다.