메서드 오버라이딩 (@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()을 사용할 수 있다는 점을 기억하세요.
챌린지
쉬움서브클래스가 부모 메서드를 오버라이드하여 자신만의 특화된 동작을 제공하는 방법을 보여주는 알림 시스템을 만들어 보겠습니다. @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에서 오버라이드된 버전에서 출력됩니다. 이는 메서드 오버라이딩을 통해 서브클래스가 상속된 동작을 자체 구현으로 대체하는 방법을 보여줍니다.
직접 해보기
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() 호출
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조