개발새발

[Java] 제목은 패턴으로 하겠습니다. 근데 이제 MVC를 곁들인 본문

Java/개념을 Java

[Java] 제목은 패턴으로 하겠습니다. 근데 이제 MVC를 곁들인

칸쵸. 2023. 9. 28. 20:57
728x90

드디어 올 것이 왔습니다

이놈의 MVC 패턴을 아주그냥 끝장을 내보겠어요

와하하 새벽이라 그런듯요 암튼 레지고


1. 디자인패턴(Design Pattern)이란?

소프트웨어 디자인에서 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책

요점만 말하자면 일종의 '설계도'라고 보면 될 것같다.

앞선 사람들이 개발을 하면서 수많은 시행착오를 거쳤을텐데, 그 과정에서 쌓인 설계의 노하우를 정리하여 이름을 붙이고,

이후에 재사용하기 좋은 형태로 만들어서 정리한 설계도같은 개념이랄까. 

 

진짜 간단하게 말해서 효율적인 코드를 만들기 위한 일종의 방법론이다.

이렇게 말로만 보면 진짜 알아듣기 어려우니 디자인 패턴의 일종인 MVC패턴의 예시를 통해 알아보자


2. MVC 패턴

소프트웨어 설계에서
세 가지 구성 요소인 모델(Model), 뷰(View), 컨드롤러(Controller)를 이용한 설계 방식
각 요소들이 기능별로 독립적으로 분리되어있다는 특징을 지닌다

 

1) Model

- 소프트 웨어 내 데이터로, 객체를 나타냄

- 데이터 및 데이터 접근과 업데이트에 관한 규칙을 나타냄

- 데이터가 바뀌면 컨트롤러를 업데이트 할 수 있는 로직을 가지고 있음

 

2) View

- 사용자 인터페이스(User Interface)로, 사용자에게 보이는 화면 내용

  화면 그 자체가 아니라, 화면에서 보이는 내용을 나타낸다 나는 맨날 헷갈려서 이게 왜 이렇게 되지? 맨날 이러고잇엇음..

- 모델의 컨텐츠를 보여주는 역할로, 모델의 데이터가 바뀌면 뷰의 모습도 함께 바뀌어야함

- 모델이 가진 데이터를 시각적으로 보여주는 역할

 

3) Controller

모델과 뷰 사이의 상호작용 담당

 

 

순서 및 구조를 나타내면 그림과 같다!

어드벤처타임 멤버들 특별 출연 히히

 

예시를 통해 알아보자!

저는 MVC패턴을 통해 재미있는 업다운 숫자맞추기 게임을 구현해보겠어요~

 

1) Model

package mvc.UpDownGame;
//랜덤 숫자 맞추기 게임 모델
public class GameModel {
	//멤버변수
	private int secretNumber; //숨겨진 번호
	private int attempts; //몇 번 시도했는가?
	
	//생성자
	public GameModel() {
		//1~100 범위의 무작위 숫자 생성하기 with형변환
		//Math.random() 사용시 0~0.99까지 무작위 숫자 반환
		secretNumber = (int) (Math.random() *100)+1;
		attempts = 0; //최초 시도는 0번
	}
	
	//getter
	public int getSecretNumber() {
		return secretNumber;
	}
	
	public int getAttempts() {
		return attempts;
	}
	
	//시도횟수를 증가시키는 메서드
	public void incrementAttempts() {
		attempts++; // attempts = attempts + 1
	}
	
	//숫자맞는지 '확인'해주는 메서드
	public boolean inCorrectGuess(int guess) {
		//guess가 값을 입력했기 대문에 증가 메서드를 추가
		incrementAttempts(); 
		return guess == secretNumber;
	}
	
	//맞춘 숫자..가 큰지 작은지 확인해주는 메서드
	//어차피 숫자가 틀릴 경우에만 실행 될 메서드이기 때문에 숫자가 일치하는 경우는 배제함
	public boolean checkUpDown(int guess) {
		if(secretNumber > guess) {
			return true;
		} else {
			return false;
		}
	}
}

모델 클래스에서는,

멤버변수: 랜덤하게 정해질 숫자(secretNumber)와 플레이어의 숫자맞추기 시도 횟수를 카운트 해줄 attempts

그리고 게임 진행에 실행될 메서드 몇 가지를 구현해줬습니다

 

2) View

package mvc.UpDownGame;

//게임의 결과를 보여줌
public class GameView {
	//View : 전부 출력 메서드로 구성
	
	//멤버변수 선언 및 초기화
	private String startMsg = "숫자 맞추기 게임을 시작합니다.";
	private String startMsg2 = "1 ~ 100 사이의 숫자를 맞춰보세요!";

	//0. 게임을 시작할 때 나오는 메시지
	public void displayMessage() {
		System.out.println(startMsg);
		System.out.println(startMsg2);
	}
	
	//숫자를 추측하는 값 입력하고 맞췄는지 틀렸는지 적는거랑 시도횟수 & 게임종료
	
	//1. 숫자를 추측할 때 출력할 메시지
	private String scanMsg = "추측한 숫자를 입력하세요 : ";
	public void displayGuessPrompt() {
		System.out.print(scanMsg);
	}
	
    //2. 숫자를 맞췄을 경우 출력할 메시지
	private String correctMsg = "숫자를 맞췄습니다.";
	public void displayCorrectGuess() { 
		System.out.println(correctMsg);
	}
	
    //3. 숫자를 맞추기를 시도할 때마다 출력할 메시지
	private String attemptMsg = "시도횟수 : ";
	public void displayAttempts(int attempts) {
		System.out.println(attemptMsg + attempts);
	}
	
    //4. 맞춘 숫자가 답보다 작을 때
	private String upMsg = "up";
	public void displayUp() {
		System.out.println(upMsg);
	}
	
    //5. 맞춘 숫자가 답보다 클 때
	private String downMsg = "down";
	public void displayDown() {
		System.out.println(downMsg);
	}
	
    //6. 숫자를 맞추고 게임을 종료할 때
	private String gameoverMsg = "게임이 종료되었습니다";
	public void displayGameOver() {
		System.out.println(gameoverMsg);
	}

}

보시다시피 view는 모두 출력 메서드만으로 구성했음을 알 수 있습니다

 

3) Controller

package mvc.UpDownGame;

import java.util.Scanner;

public class GameController {
	//클래스형 멤버변수
	private GameModel model;
	private GameView view;
	
	//생성자
	public GameController(GameModel model, GameView view) {
		this.model = model;
		this.view = view;
	}
	
	public void runGame() {
		
		//최초 메세지 보여주는거 출력하고
		view.displayMessage();
		Scanner sc = new Scanner(System.in);
		
		while(true) {
		//컴퓨터가 생각한 숫자를 맞췄을 때 불러올 view
		//숫자를 추측하는 값을 입력하자
		view.displayGuessPrompt(); 
		int guess = sc.nextInt();
		
		if(model.inCorrectGuess(guess)) {
			view.displayCorrectGuess(); 
			view.displayAttempts(model.getAttempts());
			break;
		} else {
			//틀렸을 때 view
			if(model.checkUpDown(guess)==true) {
				view.displayUp();
			} else if(model.checkUpDown(guess)==false){
				view.displayDown();
			}
			//up이든 down이든 시도횟수는 올라가니까용
			view.displayAttempts(model.getAttempts());
		}
		}
		
		sc.close();
		
	}

}

Controller는 Model과 View를 상호작용을 담당하므로, 이들 클래스형으로 멤버변수 및 생성자 매개변수를 만들었습니다.

 

4) Main

package mvc.UpDownGame;

public class GameMain {

	public static void main(String[] args) {
		GameModel m = new GameModel();
		GameView v = new GameView();
		GameController c = new GameController(m,v);
		
		c.runGame();

	}

}

그리고 마지막으로 main함수에서 Model, View, Controller 모두의 객체를 생성한 다음, 컨트롤러의 runGame() 메서드를 실행해주면...?

 

게임 실행창이 완성되었습니다

작동도 잘 되는지 볼까요?

1~100 숫자를 무려 4트만에 맞췄습니다 덜덜

아무튼 이렇게 모델에는 게임 실행에 필요한 멤버를, 뷰에는 출력 메서드를, 컨트롤러에는 이 둘을 활용해 게임을 돌아가게 만드는 메서드를 분배해서 코드를 완성했습니다. 이해가 조금 되실랑가요...

사실 저도 방금 저 코드를 블로그를 쓰면서 완성해서 아직 조금 얼떨떨합니달라

 

그리고 MVC패턴에 대한 설명은

https://www.oracle.com/technical-resources/articles/javase/mvc.html

 

Java SE Application Design With MVC

What Is Model-View-Controller (MVC)? If you've programmed with graphical user interface (GUI) libraries in the past 10 years or so, you have likely come across the model-view-controller (MVC) design. MVC was first introduced by Trygve Reenskaug, a Smalltal

www.oracle.com

여기 오라클에 정말 잘 설명 되어있으니 이것도 참고해주시면 좋을 것같아요..

 

그리고 이 외에도 오직 하나의 인스턴스만 생성하여 사용하는 디자인 패턴인 싱글톤패턴 등 세상에는 수많은 디자인패턴이 존재합니다. 나중에 또 하나씩 공부해서 필요한 때에 적재적소에 써먹을 수 있는 날이 오면 좋겠어요. 아직까지의 능력치로는 정말 ..하룻강아지가 깝치는 모양밖에 되지 않을 것같군요 호호

 

 

아무튼 이제 진짜 MVC패턴 끝!

'Java > 개념을 Java' 카테고리의 다른 글

[Java] 인터페이스 Interface  (1) 2023.10.11
[Java] Overloading  (1) 2023.09.27
[Java] 상속(inheritance)과 super  (1) 2023.09.27
[Java] Getter & Setter란 무엇인가?  (0) 2023.09.24
[Java] JUnit  (0) 2023.09.22