메서드 오버라이딩은 하위 클래스에서 상위 클래스의 이미 정의된 메서드를 재정의하는 과정을 의미한다.

 

이때, 하위 클래스에서 재정의된 메서드는 상위 클래스의 메서드와 '시그니처'가 반드시 동일해야 한다.

 

만약 시그니처가 동일하지 않다면, 이는 오버라이딩이 아닌 새로운 메서드를 정의한 것으로 간주된다.

메서드 오버라이딩에서 '시그니처'는 매우 중요한 역할을 한다. 시그니처는 메서드의 이름, 매개변수의 타입 및 개수 등을 포함한다. 오버라이딩된 메서드는 상위 클래스의 메서드와 시그니처가 동일해야 하지만, 메서드의 구현 내용은 하위 클래스에서 자유롭게 재정의될 수 있다. 이렇게 되면, 하위 클래스에서 오버라이딩된 메서드를 호출할 때 상위 클래스의 메서드 시그니처를 사용하게 된다.

public class Animal {
    public void makeSound() {
        System.out.println("The animal makes a sound");
    }
}

public class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Meow");
    }
}

public class Dog extends Animal {
    @Override
    public void makeSound() {
        System.out.println("Woof");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal1 = new Cat();
        Animal animal2 = new Dog();
        animal1.makeSound();
        animal2.makeSound();
    }
}

위 코드에서, Animal 클래스 makeSound() 메서드가 정의..

Cat 클래스와 Dog 클래스는 Animal 클래스를 상속받고, makeSound() 메서드를 오버라이딩하여 재정의. 각 클래스의 makeSound() 메서드는 다른 메시지를 출력...

main() 메서드에서는 Cat와 Dog 인스턴스를 생성하여 Animal 타입의 변수에 저장하고, 각각의 makeSound() 메서드를 호출합니다. 이때 makeSound() 메서드의 시그니처는 Animal 클래스에 정의된 것과 동일. 따라서 컴파일러는 Cat 인스턴스의 makeSound() 메서드와 Dog 인스턴스의 makeSound() 메서드를 각각 호출하며, 출력 결과는 각각 "Meow"와 "Woof"가 된다.

+ Recent posts