Menu
Coddy logo textTech

메서드 오버라이딩 (@Override)

Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 87개 중 22번째.

메서드 오버라이딩(Method overriding)은 서브클래스가 부모 클래스에 이미 정의된 메서드에 대해 자체적인 구현을 제공할 수 있도록 합니다. 이것은 자식 클래스가 상속받은 동작을 자신의 특정 요구에 맞게 커스터마이징하는 방법입니다.

메서드를 오버라이드할 때, 해당 서브클래스의 객체에 대해 서브클래스 버전이 부모의 버전을 완전히 대체합니다. 메서드는 부모 메서드와 동일한 이름, 반환 타입 및 매개변수를 가져야 합니다:

public class Animal {
    public void makeSound() {
        System.out.println("Some generic sound");
    }
}

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

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

@Override 어노테이션은 부모 메서드를 오버라이드하려는 의도를 컴파일러에 알립니다. 선택 사항이지만, 메서드 이름을 실수로 잘못 입력하거나 잘못된 매개변수를 사용하는 경우 컴파일러가 오류를 잡아낼 수 있으므로 강력히 권장됩니다:

@Override
public void makeSound() { }  // 올바름 - 컴파일러가 이를 확인합니다

public void makesound() { }  // 오타! 오버라이딩 대신 새로운 메서드를 생성합니다

오버라이딩된 메서드를 호출하면, Java는 실제 객체 타입에 속하는 버전을 실행합니다:

Dog dog = new Dog();
dog.makeSound();  // 출력: Woof!

Cat cat = new Cat();
cat.makeSound();  // 출력: Meow!

이전 레슨에서 오버라이드된 메서드 내부에서 새로운 코드와 함께 부모의 동작을 여전히 포함하고 싶다면 super.methodName()을 사용할 수 있다는 점을 기억하세요.

challenge icon

챌린지

쉬움

서브클래스가 부모 메서드를 오버라이드하여 자신만의 특화된 동작을 제공하는 방법을 보여주는 알림 시스템을 구축해 보겠습니다. @Override 어노테이션이 실수를 방지하는 데 어떻게 도움이 되는지, 그리고 각 서브클래스가 상속받은 메서드를 어떻게 커스터마이징할 수 있는지 배우게 될 것입니다.

코드를 정리하기 위해 세 개의 파일을 생성합니다:

  • Notification.java: 일반적인 알림을 나타내는 부모 클래스를 생성합니다. 다음을 포함해야 합니다:
    • message (String)를 위한 private 필드
    • 메시지를 매개변수로 받는 생성자
    • 메시지를 반환하는 getMessage() 메서드
    • "Sending notification: " + message를 출력하는 send() 메서드
  • EmailNotification.java: Notification을 상속받고 이메일을 통해 알림을 보내는 방식을 커스터마이징하는 서브클래스를 생성합니다:
    • recipient 이메일 주소 (String)를 위한 private 필드
    • 메시지와 수신자를 모두 매개변수로 받으며, 부모 부분을 위해 super(message)를 사용하는 생성자
    • @Override 어노테이션을 사용하여 send() 메서드를 오버라이드하고 "Emailing " + recipient + ": " + getMessage()를 출력합니다.
  • Main.java: 동일한 메서드 이름이 객체 유형에 따라 어떻게 다른 동작을 생성하는지 보여줍니다. 메시지와 이메일 주소라는 두 개의 입력을 받게 됩니다. 동일한 메시지로 일반 Notification과 EmailNotification을 모두 생성한 다음, 각각에 대해 send()를 호출하여 서로 다른 출력을 확인하세요.

메시지(String)와 수신자 이메일 주소(String)라는 두 개의 입력을 받게 됩니다.

출력은 두 줄로 표시되어야 합니다. 첫 번째 줄은 부모의 send() 메서드에서, 두 번째 줄은 EmailNotification에서 오버라이드된 버전에서 출력됩니다. 이는 메서드 오버라이딩을 통해 서브클래스가 상속된 동작을 자체 구현으로 대체하는 방법을 보여줍니다.

치트 시트

메서드 오버라이딩(Method overriding)을 사용하면 서브클래스가 부모 클래스에 이미 정의된 메서드에 대해 자체적인 구현을 제공할 수 있습니다. 오버라이딩된 메서드는 부모 메서드와 동일한 이름, 반환 타입 및 매개변수를 가져야 합니다.

public class Animal {
    public void makeSound() {
        System.out.println("Some generic sound");
    }
}

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

@Override 어노테이션은 선택 사항이지만 강력히 권장됩니다. 이는 컴파일러에게 부모 메서드를 오버라이드하려는 의도를 알려주어, 철자가 틀린 메서드 이름이나 잘못된 매개변수와 같은 오류를 잡는 데 도움을 줍니다:

@Override
public void makeSound() { }  // 올바름 - 컴파일러가 이를 확인합니다

public void makesound() { }  // 오타! 오버라이딩 대신 새로운 메서드를 생성합니다

오버라이딩된 메서드를 호출할 때, Java는 실제 객체 타입에 속하는 버전을 실행합니다:

Dog dog = new Dog();
dog.makeSound();  // 출력: Woof!

Cat cat = new Cat();
cat.makeSound();  // 출력: Meow!

오버라이딩된 메서드 내부에서 super.methodName()을 사용하여 새로운 코드와 함께 부모의 동작을 포함할 수 있습니다.

직접 해보기

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 입력 읽기
        String message = scanner.nextLine();
        String recipient = scanner.nextLine();
        
        // TODO: message를 사용하여 Notification 객체 생성
        
        // TODO: message와 recipient를 사용하여 EmailNotification 객체 생성
        
        // TODO: Notification 객체에서 send() 호출
        
        // TODO: EmailNotification 객체에서 send() 호출
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨