/*
주민
이름, 종족, 말버릇
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 |