인터페이스와 다형성: 교체 가능한 기능 설계하기
15강. 인터페이스와 다형성: 교체 가능한 기능 설계하기
1. 이번 강의에서 해결할 문제
GameRecord가 콘솔과 CSV 형식을 모두 직접 알면 출력 방식이 늘 때 도메인 클래스가 계속 바뀝니다. 필요한 동작을 별도 계약으로 분리해야 합니다.
2. 학습 목표
3. 핵심 개념
인터페이스는 구현 클래스가 제공해야 할 메서드 계약을 선언합니다. 다형성을 사용하면 RecordFormatter 참조에 ConsoleFormatter 또는 CsvFormatter를 넣어 호출 코드를 바꾸지 않고 전략을 교체할 수 있습니다.
4. 단계별 실습
1. src/FormatterDemo.java 작성
실행 환경: 코드 편집기
실행 위치: C:\dev\game-records
실행 전 확인: 같은 이름의 기존 파일이 있다면 덮어쓰기 전에 Git diff와 이번 강의 변경 범위를 확인합니다.
대상 파일: src/FormatterDemo.java
record GameRecord(String playerName, String mode, int score) {}
interface RecordFormatter {
String format(GameRecord record);
}
class ConsoleFormatter implements RecordFormatter {
public String format(GameRecord record) {
return record.playerName() + " - " + record.score() + "점 (" + record.mode() + ")";
}
}
class CsvFormatter implements RecordFormatter {
public String format(GameRecord record) {
return String.join(",", record.playerName(), record.mode(), String.valueOf(record.score()));
}
}
public class FormatterDemo {
static void print(GameRecord record, RecordFormatter formatter) {
System.out.println(formatter.format(record));
}
public static void main(String[] args) {
GameRecord record = new GameRecord("Alice", "ranked", 1400);
print(record, new ConsoleFormatter());
print(record, new CsvFormatter());
}
}
2. PowerShell에서 컴파일·실행
실행 환경: Windows PowerShell
실행 위치: C:\dev\game-records
실행 전 확인: java -version과 javac -version이 선택한 LTS JDK를 가리키고, 소스 파일명이 public 클래스명과 일치하는지 확인합니다.
대상: 이 강의의 .java 파일, out의 class 파일과 명시된 출력 파일
Set-Location C:\dev\game-records
javac -d out .\src\FormatterDemo.java
java -cp out FormatterDemo
예상 결과: 같은 기록이 사람이 읽는 형식과 CSV 형식으로 각각 출력됩니다.
5. 코드가 동작하는 이유
print는 구체 클래스가 아니라 RecordFormatter 계약만 알며 실제 구현의 format이 호출됩니다. 이 예제의 record 문법은 간단한 불변 데이터 전달에 사용됩니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
인터페이스와 다형성: 교체 가능한 기능 설계하기 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.