데이터와 비즈니스 로직을 관리합니다. 데이터베이스와의 통신, 데이터 처리, 그리고 비즈니스 규칙을 적용하는 역할을 담당.
데이터베이스가 아닌 메모리 상에서 데이터를 처리하고, 비지니스 로직을 수행하는 역할
각 클래스는 특정 데이터와 관련된 로직을 캡슐화, 데이터에 대한 접근과 수정 관리
ComputerNumber.java
컴퓨터에서 랜덤으로 정해주는 숫자를 정리해주는 곳
package baseball.model;
import camp.nextstep.edu.missionutils.Randoms;
import java.util.LinkedHashSet;
/**
* 1.숫자 랜덤 생성
*/
public class ComputerNumber {
private String computerNumber;
//숫자를 문자열로 저장하는 인스턴스 값
public ComputerNumber() {
//기본 생성자: 컴퓨터가 3자리 숫자를 생성하고 초기화하는 역활
setGameClearNumber();//초기화 해줌
}
public String getComputerNumber() {
return computerNumber; //getter메소드
//인스턴스 변수의 값을 변환하는 getter 메서드
}
public void setGameClearNumber() {
LinkedHashSet<String> computerNumberCheck = new LinkedHashSet<String>();
//중복되지 않는 문자열 반환하기 위해 LinkHashSet타입 선언한 ..Check메소드 만들어줌
while (computerNumberCheck.size() < 3) {
//3개의 서로 다른 숫자가 생성될 때까지 반복하고 생성이 되면 나옴
//Check크기가 3보다 작으면 getRandomNumber 메소드 호출 숫자 문자열 받아옴
//computerNumberCheck에 추가됨(게임 시작하기 전 한번만)
computerNumberCheck.add(getRandomNumber());
//LinkedHashSet은 중복허용 하지 않은 메소드임(신기하네)
}
this.computerNumber = String.join("", computerNumberCheck);
//저장된 숫자들을 하나의 문자열로 결합 -> computerNumber에 저장
}//setGameClearNumber 로직 구현
public static String getRandomNumber() {
//1-9 사이의 랜던한 숫자를 문자열로 반환
return Integer.toString(Randoms.pickNumberInRange(1, 9));
//정수로 호출하고 문자열로 반환하여 반환
}
}
선언하는 이유
캡슐화 및 정보 은닉
클래스 외부에서 직접적으로 접근할 수 없어 클래스 내부를 보호
ComputerNumber안에 있는 로직들의 데이터를 노출시키지 않음
초기화 하는 이유
일관된 상태 보장
초기화를 통해 모든 필수 필드가 적절한 값으로 설정되었는지 확인 및 보장
안전성
코드가 전반적으로 괜찮은지 확인하고 시스템 안전성에 큰 기여
PlayNumber.java
사용자가 작성하는 곳
package baseball.model;
import java.util.HashSet;
import java.util.Set;
public class PlayerNumber {
private String playerNumber;
//번호를 저장하기 ㅜ이한 문자열 변수 선언
public PlayerNumber(String playerNumber) {
//아래 있는 정보들은 이 3가지 메소드 호출한다는 것만 알아두면 됨
isStringLengthCorrect(playerNumber);
isDigitPlayerNumber(playerNumber);
isDifferentPlayerNumber(playerNumber);
this.playerNumber = playerNumber;
//선수 번호를 초기화하는 역활
}//인스턴스 playNumber의 생성자(playNmuber의 추가정보)
public String getPlayerNumber() {
return playerNumber;
//변수의 값을 반환하는 getter 메소드
}
//생성자 안에 있는 메소드들의 로직 설명
public static void isStringLengthCorrect(String word) throws IllegalArgumentException {
if (word.length() != 3) {
throw new IllegalArgumentException("잘못된 값을 입력하셨습니다.(입력값 3자리수)");
}
}
public static void isDigitPlayerNumber(String word) {
for (int i = 0; i < word.length(); i++) {
isDigitCharInString(word, i);
}
}
public static void isDifferentPlayerNumber(String word) throws IllegalArgumentException {
Set<Character> set = new HashSet<>();
for (int i = 0; i < word.length(); i++) {
set.add(word.charAt(i));
}
if (set.size() != word.length()) {
throw new IllegalArgumentException("잘못된 값을 입력하셨습니다.(중복된 숫자)");
}
}
public static void isDigitCharInString(String word, int index) throws IllegalArgumentException {
if (!Character.isDigit(word.charAt(index))) {
throw new IllegalArgumentException("잘못된 값을 입력하셨습니다.(3자리 자연수가 아닙니다.)");
}
}
}
RetryNumber.java
사용자로부터 게임을 다시 할건지 사용 여부에 관한 것
package baseball.model;
import baseball.view.InputView;
public class RetryNumber {
private String retryNumber;
//사용자로부터 입력받은 게임 재시작 여부 저장하는 인스턴스 변수
public String getRetryNumber(){
return retryNumber;
//인스턴스 변수의 값을 반환하는 getter 메소드
}
public RetryNumber(String retryNumber) {
//클래스의 생성자로 사용자로부터 입력받은 게임 재시작 여부를 검증하고 재시작
isCorrectRetryNumber(retryNumber);
this.retryNumber = retryNumber;
}
//1 아니면 2이여야 함.
public static void isCorrectRetryNumber(String number) throws IllegalArgumentException {
if (!number.equals("1") && !number.equals("2")) {
throw new IllegalArgumentException("잘못된 값을 입력하셨습니다.");
}
}
}
사용자게에 정보를 보여주고 사용자의 입력을 받는 역할
InputView
사용자로부터 텍스트 입력을 받는 역할
package baseball.view;
import camp.nextstep.edu.missionutils.Console;
// 사용자로부터 입력을 받는 클래스
public class InputView {
// 사용자로부터 숫자를 입력받는 메서드
public static String setUserNumber() {
System.out.println("숫자를 입력해주세요 : "); // 사용자에게 입력을 안내하는 메시지 출력
return Console.readLine(); // 사용자로부터 한 줄의 텍스트를 입력받아 반환
}
// 게임 재시작 여부를 사용자로부터 입력받는 메서드
public static String setRetryNumber(){
System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요."); // 사용자에게 게임 재시작 여부를 안내하는 메시지 출력
return Console.readLine(); // 사용자로부터 한 줄의 텍스트를 입력받아 반환
}
}