Menu
Coddy logo textTech

인터페이스의 Default 및 Static 메서드

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

원래 인터페이스는 구현이 없는 추상 메서드만 포함할 수 있었습니다. Java 8부터 인터페이스는 디폴트 메서드(default methods)정적 메서드(static methods)를 포함할 수 있는 기능을 갖게 되어 더욱 유연해졌습니다.

디폴트 메서드(default method)는 default 키워드를 사용하여 인터페이스 내에서 직접 구현을 제공합니다. 인터페이스를 구현하는 클래스는 이 동작을 자동으로 상속받지만, 필요한 경우 이를 오버라이드(override)할 수 있습니다:

public interface Drawable {
    void draw();
    
    default void display() {
        System.out.println("Displaying on screen...");
        draw();
    }
}

Drawable을 구현하는 모든 클래스는 display() 메서드를 자동으로 얻게 됩니다. 이는 이미 인터페이스를 구현하고 있는 클래스들에 영향을 주지 않으면서 기존 인터페이스에 새로운 메서드를 추가할 때 특히 유용합니다.

인터페이스의 정적 메서드는 클래스의 정적 메서드와 유사하게 작동합니다. 이들은 인터페이스 자체에 속하며 인터페이스 이름을 사용하여 호출됩니다:

public interface MathOperations {
    static int add(int a, int b) {
        return a + b;
    }
}

// 사용법
int result = MathOperations.add(5, 3);

정적 인터페이스 메서드는 오버라이드될 수 없으며, 이를 구현하는 클래스에 상속되지 않습니다. 이들은 인터페이스의 목적과 관련된 유틸리티 메서드에 유용합니다.

만약 클래스가 동일한 기본 메서드 시그니처를 가진 두 개의 인터페이스를 구현한다면, 해당 클래스는 충돌을 해결하기 위해 해당 메서드를 오버라이드해야 합니다.

challenge icon

챌린지

쉬움

인터페이스의 디폴트(default) 메서드와 정적(static) 메서드를 모두 보여주는 메시징 시스템을 구축해 보겠습니다. 구현 클래스가 직접 사용하거나 필요에 따라 커스터마이징할 수 있는 내장 기능이 포함된 인터페이스를 만들 것입니다.

코드는 다음 네 개의 파일로 구성됩니다:

  • Messenger.java: 모든 메시징 서비스를 나타내는 인터페이스를 정의합니다. void를 반환하는 추상 메서드 sendMessage(String message)를 선언해야 합니다. [TIMESTAMP] 를 출력한 후 sendMessage(message)를 호출하는 sendWithTimestamp(String message)라는 디폴트 메서드를 추가하세요. 또한 메시지를 대문자로 변환하여 반환하는 formatMessage(String message)라는 정적 메서드를 포함하세요.
  • EmailMessenger.java: Messenger를 구현하는 클래스를 생성합니다. recipient 필드(String)를 가집니다. 수신자를 초기화하는 생성자를 포함하세요. Email to [recipient]: [message]를 출력하도록 sendMessage()를 구현하세요. 이 클래스는 디폴트 sendWithTimestamp() 메서드를 그대로 사용합니다.
  • SMSMessenger.java: Messenger를 구현하는 또 다른 클래스를 생성합니다. phoneNumber 필드(String)를 가집니다. 전화번호를 초기화하는 생성자를 포함하세요. SMS to [phoneNumber]: [message]를 출력하도록 sendMessage()를 구현하세요. 디폴트 타임스탬프 동작 대신 [URGENT] 를 출력한 후 sendMessage(message)를 호출하도록 디폴트 sendWithTimestamp() 메서드를 오버라이드하세요.
  • Main.java: 모든 것을 하나로 모아 인터페이스의 디폴트 및 정적 메서드를 시연합니다. 이메일 수신자, 전화번호, 메시지의 세 가지 입력을 받습니다. 먼저 정적 메서드인 Messenger.formatMessage()를 사용하여 메시지 형식을 지정하고 저장합니다. 그런 다음 EmailMessenger와 SMSMessenger를 생성합니다. 각 메신저에 대해 형식화된 메시지로 sendWithTimestamp()를 호출하세요. EmailMessenger는 기본 구현을 사용하고 SMSMessenger는 오버라이드된 버전을 사용하는 것을 확인할 수 있습니다.

이메일 수신자(String), 전화번호(String), 메시지(String)의 세 가지 입력을 받게 됩니다.

출력은 각 메신저당 두 줄씩 총 네 줄로 표시되어야 합니다: 접두사 줄([TIMESTAMP] 또는 [URGENT]) 다음에 메시지 줄이 옵니다. EmailMessenger는 기본 타임스탬프 접두사를 표시하고, SMSMessenger는 사용자 정의 긴급 접두사를 표시합니다. 둘 다 정적으로 형식화된(대문자) 메시지를 사용하게 됩니다!

직접 해보기

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 입력 읽기
        String emailRecipient = scanner.nextLine();
        String phoneNumber = scanner.nextLine();
        String message = scanner.nextLine();
        
        // TODO: Messenger.formatMessage()를 사용하여 메시지 형식을 지정하고 저장하세요
        
        // TODO: 이메일 수신자로 EmailMessenger를 생성하세요
        
        // TODO: 전화번호로 SMSMessenger를 생성하세요
        
        // TODO: 형식화된 메시지와 함께 EmailMessenger에서 sendWithTimestamp()를 호출하세요
        
        // TODO: 형식화된 메시지와 함께 SMSMessenger에서 sendWithTimestamp()를 호출하세요
    }
}
quiz icon실력 점검

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

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