인터페이스의 Default 및 Static 메서드
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 87개 중 37번째.
원래 인터페이스에는 구현이 없는 abstract method만 포함할 수 있었습니다. Java 8부터 인터페이스는 default method와 static method를 포함할 수 있게 되어 더욱 유연해졌습니다.
default method는 default 키워드를 사용하여 interface에 직접 구현을 제공합니다. interface를 구현하는 클래스는 이 behavior를 자동으로 상속하지만, needed 경우 이를 override할 수 있습니다.
public interface Drawable {
void draw();
default void display() {
System.out.println("Displaying on screen...");
draw();
}
}Drawable을 구현하는 모든 class는 display() method를 무료로 얻습니다. 이는 이미 이를 구현하는 class를 손상시키지 않고 기존 interface에 새로운 method를 추가할 때 특히 유용합니다.
정적 메서드는 인터페이스에서 클래스의 정적 메서드와 같은 방식으로 작동합니다. 정적 메서드는 interface 자체에 속하며 interface 이름을 사용하여 호출합니다:
public interface MathOperations {
static int add(int a, int b) {
return a + b;
}
}
// 사용법
int result = MathOperations.add(5, 3);정적 인터페이스 메서드는 재정의할 수 없으며 구현 클래스에 상속되지 않습니다. 인터페이스의 목적과 관련된 유틸리티 메서드에 유용합니다.
class가 동일한 default method 시그니처를 가진 두 개의 interface를 implements하는 경우, class는 충돌을 해결하기 위해 해당 method를 override해야 합니다.
챌린지
쉬움기본 메서드와 static 메서드를 모두 인터페이스에서 보여 주는 메시징 시스템을 만들어 보겠습니다. 구현하는 class가 직접 사용하거나 필요에 따라 custom할 수 있는 기본 기능이 포함된 interface를 만들게 됩니다.
코드를 네 개의 파일로 나누어 구성합니다:
Messenger.java: 모든 메시징 서비스를 나타내는 interface를 Define합니다. void를 반환하는 abstract methodsendMessage(String message)를 Declare해야 합니다.sendWithTimestamp(String message)라는 default method를 Add하고,[TIMESTAMP]를 출력한 다음sendMessage(message)를 Call하도록 합니다. 또한formatMessage(String message)라는 static method를 포함하여 message를 대문자로 converted한 값을 반환하도록 합니다.EmailMessenger.java:Messenger를 implements하는 class를 Create합니다.recipientfield(String)이 있습니다. recipient를 초기화하는 constructor를 포함합니다.sendMessage()를 Implement하여Email to [recipient]: [message]를 display합니다. 이 class는 기본sendWithTimestamp()method를 그대로 사용합니다.SMSMessenger.java:Messenger를 implements하는 another class를 Create합니다.phoneNumberfield(String)이 있습니다. phone number를 초기화하는 constructor를 포함합니다.sendMessage()를 Implement하여SMS to [phoneNumber]: [message]를 display합니다. defaultsendWithTimestamp()method를 Override하여 기본 timestamp behavior를 사용하는 대신[URGENT]를 출력한 후sendMessage(message)를 Call하도록 합니다.Main.java: default 및 static interface method를 모두 보여 주도록 모든 내용을 하나로 묶습니다. 세 가지 inputs를 받습니다: email recipient, phone number, message입니다. 먼저 static methodMessenger.formatMessage()를 사용하여 message를 format하고 저장합니다. 그런 다음 EmailMessenger와 SMSMessenger를 Create합니다. 각 messenger에 대해 formatted message를 사용하여sendWithTimestamp()를 Call합니다. EmailMessenger는 default implementation을 사용하는 반면 SMSMessenger는 override된 version을 사용하는 점에 유의하세요.
세 가지 inputs를 받습니다: email recipient(String), phone number(String), message(String)입니다.
출력은 총 네 줄이어야 합니다. 각 messenger마다 두 줄씩 출력됩니다. 하나는 prefix line([TIMESTAMP] 또는 [URGENT])이고, 그다음은 message line입니다. EmailMessenger는 default timestamp prefix를 표시하고, SMSMessenger는 custom urgent prefix를 표시합니다. 두 messenger 모두 static하게 format된(uppercase) message를 사용합니다!
직접 해보기
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()를 호출하세요
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조6인터페이스와 추상 클래스
인터페이스 소개인터페이스 구현하기다중 인터페이스 구현인터페이스의 Default 및 Static 메서드추상 클래스 vs 인터페이스함수형 인터페이스복습 - 결제 시스템직접 연습해 보세요: 온라인 Java 컴파일러