어댑터 패턴
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 87개 중 71번째.
Adapter Pattern은 호환되지 않는 인터페이스가 함께 작동할 수 있도록 하는 구조적 디자인 패턴입니다. 이는 두 클래스 사이의 다리 역할을 하며, 한 클래스의 인터페이스를 클라이언트가 expects하는 인터페이스로 변환합니다. 유럽 기기를 미국 콘센트에 꽂을 수 있게 해 주는 전원 어댑터와 같다고 생각해 보세요.
오디오 파일을 재생하는 기존 MediaPlayer 인터페이스가 있지만, 동영상 재생에 완전히 다른 인터페이스를 사용하는 서드파티 라이브러리를 통합해야 한다고 상상해 보세요:
// 작성한 코드가 사용하는 기존 인터페이스
interface MediaPlayer {
void play(String filename);
}
// 호환되지 않는 인터페이스를 가진 서드파티 클래스
class AdvancedVideoPlayer {
public void playVideo(String filename) {
System.out.println("Playing video: " + filename);
}
}adapter는 incompatible class를 감싸고 expects interface를 implements하며, 둘 사이의 호출을 변환합니다:
class VideoPlayerAdapter implements MediaPlayer {
private AdvancedVideoPlayer videoPlayer;
public VideoPlayerAdapter() {
this.videoPlayer = new AdvancedVideoPlayer();
}
public void play(String filename) {
videoPlayer.playVideo(filename);
}
}이제 클라이언트 코드는 익숙한 MediaPlayer 인터페이스를 통해 비디오 플레이어를 사용할 수 있습니다:
MediaPlayer player = new VideoPlayerAdapter();
player.play("movie.mp4"); // 출력: 비디오 재생 중: movie.mp4Adapter Pattern은 소스 코드를 수정하지 않고 legacy 코드나 타사 라이브러리를 통합할 때 매우 유용합니다. Client는 자신이 adapted class와 함께 작업하고 있다는 사실을 알지 못합니다. Client는 자신이 알고 있는 interface를 사용하기만 합니다.
챌린지
쉬움Adapter Pattern을 사용하여 온도 변환 시스템을 구축해 봅시다! Celsius 온도로 작동하는 기존 날씨 application이 있지만, Fahrenheit 단위로만 측정값을 출력하는 legacy 온도 센서를 통합해야 합니다. 어느 시스템도 수정하는 대신, 차이를 연결하는 adapter를 Create할 것입니다.
코드를 네 개의 파일로 구성합니다:
TemperatureProvider.java: 날씨 application이 expects하는 interface를 Define합니다. Celsius 온도를 나타내는 double을 반환하는getTemperatureCelsius()메서드를 Declare해야 합니다.FahrenheitSensor.java: incompatible interface를 가진 legacy 센서를 나타냅니다. Fahrenheit 온도를 저장하는 private double field를 가진 class를 Create하고, constructor를 통해 값을 설정합니다. 저장된 Fahrenheit 값을 반환하는readFahrenheit()메서드가 있어야 합니다.SensorAdapter.java: Fahrenheit 센서를 날씨 application과 compatible하게 makes하는 adapter를 Create합니다. adapter는TemperatureProvider를 implements하고FahrenheitSensor를 래핑해야 합니다.getTemperatureCelsius()가 호출되면 센서에서 값을 읽고 다음 공식으로 Celsius로 convert해야 합니다:(fahrenheit - 32) * 5 / 9.Main.java: 모든 것을 함께 연결합니다! Fahrenheit 단위의 온도 측정값(double) 하나를 input으로 받습니다.input 값으로
FahrenheitSensor를 Create합니다. 그런 다음 이 센서를 래핑하는SensorAdapter를 Create합니다. 날씨 application이 expected interface를 통해 이를 사용할 수 있음을 보여 주기 위해 adapter를TemperatureProvider변수에 저장합니다.다음 형식으로 결과를 출력합니다:
Temperature: [celsius] C. 여기서 celsius는 소수점 한 자리로 Format합니다.
input은 Fahrenheit 온도(double) 하나입니다.
예를 들어 input이 98.6이면 출력은 다음과 같습니다:
Temperature: 37.0 CMain class가 전적으로 TemperatureProvider interface와 함께 작동한다는 점에 주목하세요. 실제 온도가 뒤에서 adapter를 통해 연결된 Fahrenheit 센서에서 제공된다는 사실을 전혀 알지 못합니다. 이것이 Adapter Pattern의 우아함입니다!
직접 해보기
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double fahrenheit = scanner.nextDouble();
// TODO: 입력값으로 FahrenheitSensor 생성하기
// TODO: 센서를 감싸는 SensorAdapter 생성하기
// TODO: TemperatureProvider 변수에 어댑터 저장하기
// TODO: 섭씨 온도를 구해서 출력하기
// 형식: 소수점 첫째 자리까지 "Temperature: [celsius] C"
// 힌트: 포맷팅에 String.format("%.1f", value) 사용
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조직접 연습해 보세요: 온라인 Java 컴파일러