수업 복습

간이 팀프로젝트 (주민 상호작용 프로그램 구현)

_김영인 2025. 10. 16. 23:13

/*

 

주민

이름, 종족, 말버릇

 

1. 주민추가

2. 전체출력

3. 1명 출력

4. 상호작용

- 어떤 주민으로 할지 선택

- 메세지 입력 시, 대답과 말버릇 나옴.

0. 프로그램 종료

 

함수 최소 5개 이상 구현 (메서드 아님)

 

*/

package class03;

 

import java.util.Scanner;

 

class Person {

String kind;

String name;

String habit;

 

Person(String name, String kind, String habit){

this.name = name;

this.kind = kind;

this.habit = habit;

 

}

String getName() {

return this.name;

}

 

String getHabit() {

return this.habit;

}

 

 

void interAction(String Msg) {

System.out.println(Msg+this.habit);

 

}

void printInfo() {

System.out.println("종족: "+this.kind);

System.out.println("이름: "+this.name);

System.out.println("말버릇 : "+this.habit);

}

}

 

public class Test03 {

 

public static void main(String[] args) {

 

// 다섯명 제한

Person[] town = new Person[5];

// PK

int index = 0;

// 앞으로 사용할 스캐너 미리 선언

Scanner sc = new Scanner(System.in);

// 종족 미리 선언

String[] kind = { "인간", "초월체", "요들", "드래곤", "다르킨", "기계", "바스타야", "살아있는 바위" };

 

System.out.println("게임에 오신 것을 환영합니다.");

while (true) {

// 게임 시작

System.out.println();

System.out.println("1. 주민 추가");

System.out.println("2. 마을 주민 목록 보기");

System.out.println("3. 주민 한명 보기");

System.out.println("4. 주민과 대화 나누기");

System.out.println("0. 종료하기");

System.out.println("메뉴룰 선택해주세요.");

System.out.print(">> ");

// 명령어 입력 받기

int command = sc.nextInt();

// 개행 먹어주는 용도의 nextLine();

// => 아 원래 안 넣었는데 주절주절..

// 하다보니까 주절주절 개행 때문에 입력이 한 번 넘어갔다.. 주절주절.. 문제를 이런 방식으로 해결했다...

sc.nextLine();

 

// 입력 받은 명령어 유효성 검사 0~4 사이 값이 아니면 재입력

if(command < 0 || command > 4) {

System.out.println("잘못된 입력입니다!!");

continue;

}

 

// 프로그램 종료

if (command == 0) {

System.out.println("프로그램을 종료합니다...");

break;

}

 

else if (command == 1) {

System.out.println("[현재 인원: " + index + " / " + town.length + "]");

if (isTownFull(index)){

continue;

}

 

System.out.println("종족을 선택하세요!");

for (int i = 0; i < kind.length; i++) {

System.out.println((i + 1) + ". " + kind[i]);

}

System.out.print(">> ");

int kindNum = userInput(kind.length);

String k = kind[kindNum];

 

System.out.println(k + " 선택완료");

 

String name;

while (true) {

System.out.println("이름을 입력해주세요.");

System.out.print(">> ");

name = sc.nextLine();

 

if (doesSlangExist(name)) {

System.out.println("아름다운 단어를 사용해주세요!");

} else {

break;

}

}

 

String habit;

while (true) {

System.out.println("말버릇을 입력해주세요.");

System.out.print(">> ");

habit = sc.nextLine();

 

if (doesSlangExist(habit)) {

System.out.println("아름다운 단어를 사용해주세요!");

} else {

break;

}

}

 

System.out.println("새로운 주민 " + name + "이/가" + " 추가되었습니다.");

town[index] = new Person(name, k, habit);

index++;

}

else if (command == 2) {

boolean isTownEmpty = isTownEmpty(index);// 결합도 낮추기

if(isTownEmpty) {

continue;

}

printNumListOf(town, index);

}

else if (command == 3) {

boolean isTownEmpty = isTownEmpty(index);// 결합도 낮추기

if(isTownEmpty) {

continue;

}

printNumListOf(town,index);

System.out.println("주민을 번호로 선택해주세요.");

int userInputNum = userInput(town.length);

town[userInputNum].printInfo();

}

else if(command == 4) {

boolean isTownEmpty = isTownEmpty(index);// 결합도 낮추기

if(isTownEmpty) {

continue;

}

 

//여까지 마을 비었는지

printNumListOf(town ,index);//마을의 모든 애들 이름 번호 출력

 

// 주민 번호 입력

int Jnum;

while(true) {

System.out.println("상호작용할 주민의 번호를 입력하세요.");

System.out.print(">> ");

Jnum = sc.nextInt();

sc.nextLine();

if (Jnum < 0 || Jnum > index) {

System.out.println("잘못된 입력입니다. 다시 입력해주세요.");

System.out.print(">> ");

}else {

break;

}

}

String msg;

 

while(true) {

System.out.println("메세지를 입력하세요 >> ");

msg = sc.nextLine();

boolean doesSlangInclude = doesSlangExist(msg);

 

if(!doesSlangInclude){

break;

}

System.out.println("아름다운 단어를 사용해주세요!");

}

System.out.println(town[Jnum-1].getName() + " : " + msg + town[Jnum-1].getHabit());

 

}

}

}

 

// 빈 배열 확인

/**

* 마을이 가득찼는지 검사하는 함수입니다.

* @param index Primary Key, PK 값 => 인덱스

* @return 공촌 여부 - boolean형

*/

static boolean isTownEmpty(int index) {

if(index < 1) {

System.out.println("주민이 존재하지 않습니다!!");

return true;

}

return false;

}

 

// 가득찬 배열 확인

/**

* 마을이 가득찼는지 검사하는 함수입니다.

* @param index Primary Key, PK 값 => 인덱스

* @return 마을 정원 초과 여부 - boolean형

*/

static boolean isTownFull(int index) {

int numberOfPerson = index + 1;

if(numberOfPerson > 5) {

System.out.println("마을 정원이 가득찼습니다!!");

return true;

}

return false;

}

// 주어진 데이터에 번호 붙여서 출력

/**

* 마을 주민들의 이름을 모두 출력하는 함수입니다.

* @param town Person 클래스로부터 나온 객체를 배열 형태로 초기화한 변수 => 마을

* @param index Primary Key, PK 값 => 인덱스

*/

static void printNumListOf(Person[] town, int index){

System.out.println();

System.out.println("======= 주민 목록 =======");

System.out.println();

for(int i = 0 ; i < index; i++){

System.out.println(i+1 +". "+ town[i].getName());

}

System.out.println();

System.out.println("=======================");

}

// 길이만큼의 자연수 중 하나를 유저 입력으로 받는 함수 + 유효성

/**

* 유저의 입력이 1부터 length까지의 범위 포함 여부를 검사하는 함수입니다.

* @param length 끝 번호

* @return 유저 입력 - int형

*/

static int userInput(int length){

Scanner sc = new Scanner(System.in);

int userInput;

while(true){

userInput = sc.nextInt(); // 숫자 유효성 검사

if(userInput < 1 || userInput > length){

System.out.println("잘못된 입력입니다. 다시 입력해주세요.");

System.out.print(">> ");

}

break;

}

return userInput - 1;

}

// 비속어 검사

/**

* 유저의 메세지에 비속어가 있는지 검사하는 함수입니다.

* @param msg 유저가 입력한 메세지

* @return 욕 존재 여부 - boolean형

*/

static boolean doesSlangExist(String msg){

String[] slang = {"바보", "멍청이", "말미잘"};

 

boolean doesSlangInclude = false;

 

for(int i = 0; i < slang.length; i++){

if(msg.contains(slang[i])){

doesSlangInclude = true;

}

}

return doesSlangInclude;

 

}

}

 

 

커맨드 1 코딩을 맡아 해당 부분 상세 주석 입력

else if (command == 1) { //1을 입력하면

System.out.println("[현재 인원: " + index + " / " + town.length + "]"); //현재 인원과 마을 수용가능 전체인원 출력

if (isTownFull(index)){ //함수인 isTownFull 함수에 index를 넣어 마을이 꽉 찼는지 확인해주고 꽉 찼다면 컨티뉴를 만나 while문의 처음으로 돌아감

continue;

}

 

System.out.println("종족을 선택하세요!"); //그게 아니라면 종족 선택 안내문구 출력

for (int i = 0; i < kind.length; i++) { //정수형 인덱스 i는 0부터 시작해서 종족길이보다 작으면 1씩 증감하는 for문

System.out.println((i + 1) + ". " + kind[i]); // 숫자는 1부터 시작해야해서 "."과 함꼐 종족배열 안에 있는 인덱스를 출력

}

System.out.print(">> "); //입력을 위한 공간 안내 문구 출력

int kindNum = userInput(kind.length); //정수형 kindNum에 종족길이를 넣은 userInput 함수를 선언

// 입력과 유효성 검사를 위한 함수 (입력값이 1~ 종족수 내인지 확인하는 함수)

String k = kind[kindNum]; //문자형 k에 kindNum을 넣은 종족 배열을 저장

 

System.out.println(k + " 선택완료"); //선택한 종족과 완료 확인문구 출력

 

String name; // 문자형 name을 선언

while (true) {

System.out.println("이름을 입력해주세요.");

System.out.print(">> ");

name = sc.nextLine(); //띄어쓰기까지 입력을 받기 위해 nextLine 사용

 

if (doesSlangExist(name)) { //doesSlangExist에 name을 넣은 함수를 불러와서

System.out.println("아름다운 단어를 사용해주세요!"); //욕이 들어있다면 안내문구 출력 후 재시도

} else {

break; //아니라면 다음으로 진행

}

}

 

String habit; //문자형 habit을 선언

while (true) {

System.out.println("말버릇을 입력해주세요.");

System.out.print(">> ");

habit = sc.nextLine();

 

if (doesSlangExist(habit)) {

System.out.println("아름다운 단어를 사용해주세요!");

} else {

break;

}

}

 

System.out.println("새로운 주민 " + name + " 이/가" + " 추가되었습니다."); //완료 후 확인문구 출력

town[index] = new Person(name, k, habit); //town 배열 안에 인덱스를 넣어 이름, 종족, 말버릇을 넣은 새 클래스 Person을 저장 (새로운 객체를 생성해서 배열에 저장)

index++; //저장 후 인덱스는 하나 증감

}

 

주석 직접 작성 후 코드 전체적으로 파악 및 이해를 위한 복습을 시도했고 팀원들과 디스코드를 진행하여 4시간 가량 회의 및 피드백을 진행.

next() 와 nextLine() 에 대한 차이를 이해하였고

next()는 띄어쓰기를 읽어들여 멈추고 nextLine()는 개행을 읽어들여 멈추기 때문에 띄어쓰기를 포함한 입력이라면 nextLine()을 써줘야함

'수업 복습' 카테고리의 다른 글

Java interface 복습  (0) 2025.10.26
Java Thread & MVC  (0) 2025.10.24
복습 Java 이론  (0) 2025.10.20
복습 함수  (0) 2025.10.18
Day1(OT + java 기초)  (0) 2025.09.19