[상태 패턴] 동영상 재생

2025. 10. 1. 20:07·문제모음/ChatGPT

문제

동영상 플레이어는 재생(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
'문제모음/ChatGPT' 카테고리의 다른 글
  • [커맨드 패턴] 음악 플레이어
  • [전략 패턴] 배송비 계산
  • [옵저버 패턴] 뉴스 구독
  • [옵저버 패턴] 스마트홈 온도 센서
오늘도 756
오늘도 756
  • 오늘도 756
    나만의 코딩일지
    오늘도 756
  • 전체
    오늘
    어제
    • 전체보기
      • Front-End
        • HTML
        • CSS
        • JavaScript
      • Back-End
        • JAVA
        • JSP
        • Spring
        • SQL
      • 문제모음
        • 백준
        • ChatGPT
      • Git
      • 프로젝트
        • 가계부
  • 블로그 메뉴

    • 전체보기
    • BackEnd
    • FrontEnd
    • Git
    • 프로젝트
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    repositories 연결
    maven project
    Repository
    복사
    간편로그인
    네이버 검색 api
    github
    API
    html
    Git
    spring
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
오늘도 756
[상태 패턴] 동영상 재생
상단으로

티스토리툴바