문제
동영상 플레이어는 재생(Playing), 일시정지(Paused), 정지(Stopped) 상태가 있습니다. 상태에 따라 play(), pause(), stop() 동작이 다르게 작동하도록 구현하세요.
| 요구사항 |
| VideoPlayer 클래스는 상태를 가집니다. |
| PlayerState 인터페이스를 구현하는 상태 클래스별로 play, pause, stop 동작을 정의합니다. |
| 상태별로 메시지를 출력하고, 필요시 상태 전환이 일어나도록 합니다. |
현재 상태: Stopped
play() 호출 -> 재생 시작
pause() 호출 -> 일시정지
stop() 호출 -> 정지
접근방법
✔ VidoPlayer 클래스가 상태를 가지기 때문에 내부에서 상태를 저장할 변수 필요
코드
public class Main {
public static void main(String[] args) {
VideoPlayer player = new VideoPlayer("크라임씬 제로");
player.play();
player.pause();
player.pause();
player.stop();
player.play();
}
}
class VideoPlayer {
private PlayerState state;
private final String video;
public VideoPlayer(String video) {
this.video = video;
state = new Stopped();
}
public String getVideo() {
return video;
}
public void setState(PlayerState state) {
this.state = state;
}
public void play() {
state.play(this);
}
public void pause() {
state.pause(this);
}
public void stop() {
state.stop(this);
}
}
interface PlayerState {
void play(VideoPlayer player);
void pause(VideoPlayer player);
void stop(VideoPlayer player);
}
class Playing implements PlayerState {
@Override
public void play(VideoPlayer player) {
System.out.println(player.getVideo() + " 비디오는 이미 재생 중입니다.");
}
@Override
public void pause(VideoPlayer player) {
System.out.println(player.getVideo() + " 비디오를 일시정지 합니다.");
player.setState(new Paused());
}
@Override
public void stop(VideoPlayer player) {
System.out.println(player + " 비디오를 정지합니다.");
player.setState(new Stopped());
}
}
class Paused implements PlayerState {
@Override
public void play(VideoPlayer player) {
System.out.println(player.getVideo() + " 비디오를 다시 재생합니다.");
player.setState(new Playing());
}
@Override
public void pause(VideoPlayer player) {
System.out.println("이미 일시정지 상태입니다.");
}
@Override
public void stop(VideoPlayer player) {
System.out.println(player.getVideo() + " 비디오 정지합니다.");
player.setState(new Stopped());
}
}
class Stopped implements PlayerState {
@Override
public void play(VideoPlayer player) {
System.out.println(player.getVideo() + " 비디오를 처음부터 재생합니다.");
player.setState(new Playing());
}
@Override
public void pause(VideoPlayer player) {
System.out.println("정지 상태여서 일시정지를 할 수 없습니다.");
player.setState(new Paused());
}
@Override
public void stop(VideoPlayer player) {
System.out.println("이미 정지 상태입니다.");
}
}
실행결과

풀이과정
📌 VideoPlayer 클래스
class VideoPlayer {
private PlayerState state;
private final String video;
public VideoPlayer(String video) {
this.video = video;
state = new Stopped();
}
public String getVideo() {
return video;
}
public void setState(PlayerState state) {
this.state = state;
}
public void play() {
state.play(this);
}
public void pause() {
state.pause(this);
}
public void stop() {
state.stop(this);
}
}
비디오 플레이어의 상태를 가지고 있는 클래스다.
1. 변수
① 비디오 플레이어의 상태를 담은 참조 변수(state)다. 해당 변수를 내부에서 사용하여 상태별로 메서드를 호출할 수 있다.
② 현재 비디오 플레이어에서 재생될 비디오의 이름(video)을 저장할 수 있는 참조 변수다.
둘 다 해당 클래스 내부에서만 사용하기 때문에 private 접근 제어자로 선언했으며 비이도 이름은 한 번 초기화되면 변경되지 않아야 하므로 final로 설정했다.
2. 생성자
각 비디오 플레이어마다 재생될 비디오 이름이 다르므로 매개변수로 받는다. 기본 비디오 상태는 멈춘 상태로 정해야하기 때문에 stopped 클래스로 초기화 했다.
3. 메서드
① setState(PlayerState)
비디오 플레이어의 상태를 변경한다. 해당 메서드로 외부에서 state 변수를 변경할 수 있다.
📌 PlayerState 인터페이스
interface PlayerState {
void play(VideoPlayer player);
void pause(VideoPlayer player);
void stop(VideoPlayer player);
}
비디오 플레이어의 상태를 객체로 표현하기 위한 최상위 인터페이스다. 비디오 플레이어의 상태인 재생(play), 일시정지(pause), 정지(stop)를 정의했다. 각각의 메서드의 매개변수에 VideoPlayer 클래스를 넘기는데 각 메서드 내부에서 상태를 변경하기 위해서 필요하다.
📌 Playing 클래스
class Playing implements PlayerState {
@Override
public void play(VideoPlayer player) {
System.out.println(player.getVideo() + " 비디오는 이미 재생 중입니다.");
}
@Override
public void pause(VideoPlayer player) {
System.out.println(player.getVideo() + " 비디오를 일시정지 합니다.");
player.setState(new Paused());
}
@Override
public void stop(VideoPlayer player) {
System.out.println(player + " 비디오를 정지합니다.");
player.setState(new Stopped());
}
}
PlayerState 인터페이스를 상속받은 자식 클래스로, 재생 상태를 객체로 표현했다. 인터페이스에서 정의된 메서드를 자신 클래스에 맞게 오버라이딩 해야한다.
1. 메서드
① play(VideoPlayer)
재생 상태에서 재생 메서드를 호출하면 이미 비디오가 재생된 상태이므로 안내 메시지롤 노출했다.
② pause(VideoPlayer)
재생 상태에서 일시정지 상태로 변경한다.
③ stop(VideoPlayer)
재생 상태에서 정지 상태로 변경한다. 상태 변경은 VideoPlayer 클래스의 setState() 메서드로 진행한다.
느낀점
상태별 클래스로 생성하여 조건문으로 상태를 구분할 필요가 없어서 편리하다. 다만 상태별로 클래스를 생성해야해서 클래스 수가 증가한다.
문제 출처 : ChatGPT로 생성한 문제
'문제모음 > ChatGPT' 카테고리의 다른 글
| [커맨드 패턴] 음악 플레이어 (0) | 2025.09.26 |
|---|---|
| [전략 패턴] 배송비 계산 (0) | 2025.09.25 |
| [옵저버 패턴] 뉴스 구독 (0) | 2025.09.25 |
| [옵저버 패턴] 스마트홈 온도 센서 (0) | 2025.09.24 |
| [옵저버 패턴] 주식 시세 알림 (1) | 2025.09.24 |