[java] 자바 추상 클래스와 인터페이스의 메서드 오버라이딩 규칙

자바에서는 추상 클래스와 인터페이스를 사용하여 다형성을 구현할 수 있습니다. 추상 클래스는 일부 구현을 제공하는 추상 메서드를 포함하고, 인터페이스는 모든 메서드가 추상 메서드입니다. 이러한 클래스와 인터페이스를 상속받거나 구현할 때 메서드 오버라이딩 규칙을 따라야 합니다.

추상 클래스의 메서드 오버라이딩 규칙

추상 클래스는 자식 클래스에서 추상 메서드를 오버라이딩해야 합니다. 따라서 자식 클래스에서 추상 메서드를 구현해야 합니다. 오버라이딩된 메서드는 메서드 시그니처(signature)가 일치해야 하며, 접근 제어자는 부모 클래스의 메서드와 같거나 더 넓은 범위로 재정의할 수 있습니다.

다음은 추상 클래스의 메서드 오버라이딩 예시입니다.

public abstract class Animal {
    // 추상 메서드
    public abstract void sound();

    // 일반 메서드
    public void sleep() {
        System.out.println("동물이 잠을 잡니다.");
    }
}

public class Cat extends Animal {
    @Override
    public void sound() {
        System.out.println("야옹");
    }
}

위 예시에서는 Animal 클래스가 추상 클래스이고, sound 메서드가 추상 메서드입니다. Cat 클래스는 Animal 클래스를 상속받고 sound 메서드를 오버라이딩하여 구현합니다.

인터페이스의 메서드 오버라이딩 규칙

인터페이스는 모든 메서드가 추상 메서드이므로 인터페이스를 구현할 때는 모든 메서드를 오버라이딩해야 합니다. 오버라이딩된 메서드는 메서드 시그니처가 일치해야 하며, 접근 제어자는 인터페이스의 메서드와 일치해야 합니다.

다음은 인터페이스의 메서드 오버라이딩 예시입니다.

public interface Shape {
    void draw();
    double getArea();
}

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("원을 그립니다.");
    }
    
    @Override
    public double getArea() {
        return 3.14 * 5 * 5;
    }
}

위 예시에서 Shape 인터페이스는 drawgetArea라는 두 개의 추상 메서드를 가지고 있습니다. Circle 클래스는 Shape 인터페이스를 구현하여 두 메서드를 오버라이딩하여 구현합니다.

결론

자바에서 추상 클래스와 인터페이스를 사용할 때는 메서드 오버라이딩 규칙을 따라야 합니다. 추상 클래스의 경우 추상 메서드를 오버라이딩하여 구현하고, 인터페이스의 경우 모든 메서드를 오버라이딩해야 합니다. 이를 통해 다형성을 구현하고 유연하고 확장 가능한 코드를 작성할 수 있습니다.


참고 문서