https://print-blue.tistory.com/166
JAVA 간단한 프로그램 - 동물병원 프로그램 ver1
1. 필드 설정field 을 넣어준 것과 main () 메소드에서 객체 생성해서 사용하는 것과 차이가 있는데 (실행은 됨)메모리에 미리 할당해서 사용하기 위해서 field 로 설정한 것, main() 메소드에서 실행되
print-blue.tistory.com
이전 프로젝트에서 문제점이 있는데 아래 2가지를 추가할 것 !
1) Scanner 인스턴스 1개만 생성
2) AnimalBook class
main method 내 if 문 -> switch문 으로 변경
1) Scanner 인스턴스 1개만 생성
메소드 실행될 때마다 Scanner 객체를 생성하고, 사용했는데 객체가 생성되면서 다른 객체에 영향을 미친다
또 Scanner 는 입력을 받기 위한 메소드라기 보다 구문을 구분하기 위한 메소드이다
따지고 보면 Scanner 가 입력을 받는게 아니라 System.in , in 이 받는다.
Scanner 객체는 여러 개 생성이 되지만, 객체 생성이 될 때 System.in 은 여러 개 생기는게 아니라 하나만 받는다.
그래서 여러 메소드에서 Scanner 생성하고 scanner.close(); 했을 때 다음 메소드에서 입력을 받을 때 close(); 했으니 에러가 생긴 것 ! (System.in 에서 InputStream 이 실행된 것)
그럼 이 부분에서 알 수 있는 건 ?! 객체 생성 하나만 생성하고 System.in 만 ! 받으면 된다 !
이제 구현을 해보자
Scanner 공부할 때 입출력 Stream 공부 하자
- InputStream
- OutputStream
이를 방지하고자 Scanner 인스턴스는 1개만 생성해보자
그럼 그걸 어디 파트에 생성하는지 생각해봐야한다 !
구조에 따라 다르겠지만(정답이 아니라는 점)
우린 지금 BookManager 를 자주 사용하고 있고, AnimalInfo 클래스 필드를 봐도 BookManager 타입의 static 필드를 만들어 main() 메소드에서도 사용하고 있다 ! 이 부분에서 힌트를 얻을 수 있다
public class AnimalBook {
// static field
private static BookManager manager = new BookManager();
}
static 필드로 미리 stack 에 올려놔 사용가능하다 !
왜인지 모르겠지만 close(); 도 안해도 됨 (이 부분 공부)
그렇담 BookManager 클래스에 Scanner 도 static 필드로 올려두자
public class BookManager {
private final int MAX_CNT = 100;
private AnimalInfo[] infoStorage = new AnimalInfo[MAX_CNT];
private int index = 0;
public static Scanner input = new Scanner(System.in); // 추가 !
}
그럼 이제 static 필드에 올려둔 Scanner 를 어떻게 사용할지 생각하면 된다
근데 깊게 생각 안해도 기존에 객체 생성하고, 사용한거랑 똑같이 하면 된다
(그럼 이전에 Scanner 사용했던 메소드도 재정의할 것)
방법은 다음 코드 설명하면서 !
package book;
import java.util.Scanner;
public class BookManager {
private final int MAX_CNT = 100;
private AnimalInfo[] infoStorage = new AnimalInfo[MAX_CNT];
private int index = 0;
public static Scanner input = new Scanner(System.in); // 추가 !
public void inputData() {
System.out.println("<< 정보를 입력하세요 >>");
System.out.print("1. 이름 : ");
String name = input.next();
System.out.print("2. 나이 : ");
int age = input.nextInt();
infoStorage[index++] = new AnimalInfo(name, age);
System.out.println("데이터 입력이 완료되었습니다.\n");
}
public void showBook() {
System.out.println("\n<< 저장 목록 >>");
for(AnimalInfo info: infoStorage) {
if (info == null) {
break;
}
info.showAnimalInfo();
System.out.println();
}
}
}
2) AnimalBook class
main method 내 if 문 -> switch문 으로 변경
static 필드로 Scanner 객체를 미리 할당을 해놓고 사용한 다음
main() 메소드에서 이전에는 if 문을 swtich 문으로 바꿔보자
이랬는데 !
# project_ver1 AnimalBook 전체 코드
import book.BookManager;
public class AnimalBook {
// static field
private static BookManager manager = new BookManager();
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String userVaule = "";
while (true) {
System.out.print("정보 입력할까요? (Y/N) ... ");
userVaule = input.next();
if (userVaule.equalsIgnoreCase("y") || userVaule.equalsIgnoreCase("yes")) {
// 사용자가 Y 입력했을 때 입력 메소드 실행
manager.inputData();
} else if (userVaule.equalsIgnoreCase("n") || userVaule.equalsIgnoreCase("no")) {
// 사용자가 N 입력했을 때 정보 출력 메소드 실행
manager.showBook();
input.close();
break;
}
}
System.out.println("정보 입력을 종료합니니다.\n");
}
}
요래 됐습니다 !
# project_ver1.1 AnimalBook 전체 코드
import book.BookManager;
/*
* [과제]
* 1) Scanner 인스턴스 1개만 생성 - o
*
* 2) AnimalBook class
* main method 내 if 문 -> switch문 으로 변경 - o
*/
public class AnimalBook {
// static field
private static BookManager manager = new BookManager();
public static void main(String[] args) {
String userVaule = "";
boolean check = true;
while (check) {
System.out.print("정보 입력할까요? (Y/N) ... ");
userVaule = BookManager.input.next();
switch (userVaule) {
case "y": case "Y": case "yes": case "Yes": case "YES":
manager.inputData();
break;
case "n": case "N": case "no": case "No": case "NO":
System.out.println("정보 입력을 종료합니니다.");
manager.showBook();
check = false;
break;
}
}
BookManager.input.close(); // 추가 !
}
}
일단 전체 코드를 미리 올려두고
하나씩 설명해보자면
while 문 안에 swith 문을 썼을 때 swith 문이 실행되면서 조건에 맞게 실행되면서 빠져나온거지
while 문이 실행 종료 되는게 아니다
while 문이 종료되게 만들어야 된다 !
여러 방법이 있는데
방법 1. boolean 타입 변수를 만들어 while 문에 조건을 걸던가
방법 2. 레이블을 사용하면 된다
방법 1
public class AnimalBook {
// static field
private static BookManager manager = new BookManager();
public static void main(String[] args) {
String userVaule = "";
boolean check = true; // 추가 !
while (check) {
System.out.print("정보 입력할까요? (Y/N) ... ");
userVaule = BookManager.input.next();
switch (userVaule) {
case "y": case "Y": case "yes": case "Yes": case "YES":
manager.inputData();
break;
case "n": case "N": case "no": case "No": case "NO":
System.out.println("정보 입력을 종료합니니다.");
manager.showBook();
check = false; // 추가 !
break;
}
}
BookManager.input.close();
}
}
방법 2
public class AnimalBook {
// static field
private static BookManager manager = new BookManager();
public static void main(String[] args) {
String userVaule = "";
menu:
while (true) {
System.out.print("정보 입력할까요? (Y/N) ... ");
userVaule = BookManager.input.next();
switch (userVaule) {
case "y": case "Y": case "yes": case "Yes": case "YES":
manager.inputData();
break;
case "n": case "N": case "no": case "No": case "NO":
System.out.println("정보 입력을 종료합니니다.");
manager.showBook();
break menu;
default:
System.err.println("Y/N 둘 중 하나를 입력하세요.");
}
}
BookManager.input.close();
}
}
swith 문에 case 를 보면 또 공통된 부분이 있다
소문자인지 대문자인지 !
case "y": case "Y": case "yes": case "Yes": case "YES":
case "n": case "N": case "no": case "No": case "NO":
그럼 입력받을 때 소문자를 받아도 대문자로 받아도 대문자로 바꿔주는 메소드 사용하자
import book.BookManager;
public class AnimalBook {
// static field
private static BookManager manager = new BookManager();
public static void main(String[] args) {
String userVaule = "";
menu:
while (true) {
System.out.print("정보 입력할까요? (Y/N) ... ");
userVaule = BookManager.input.next().toUpperCase(); // 추가 !
switch (userVaule) {
case "Y": case "Yes": // 변경 !
manager.inputData();
break;
case "N": case "No": // 변경 !
System.out.println("정보 입력을 종료합니니다.");
manager.showBook();
break menu;
default:
System.err.println("Y/N 둘 중 하나를 입력하세요.");
}
}
BookManager.input.close();
}
}
전체 코드
AnimalBook class 에 Scanner 객체 static 필드 올릴 때
import book.BookManager;
import java.util.Scanner;
/*
* [과제]
* 1) Scanner 인스턴스 1개만 생성 - o
*
* 2) AnimalBook class
* main method 내 if 문 -> switch문 으로 변경 - o
*/
public class AnimalBook {
// static field
private static BookManager manager = new BookManager();
private static Scanner input = new Scanner(System.in);
public static void main(String[] args) {
String userVaule = "";
boolean check = true;
menu:
while (true) {
System.out.print("정보 입력할까요? (Y/N) ... ");
userVaule = BookManager.input.next().toUpperCase();
switch (userVaule) {
case "Y": case "Yes":
manager.inputData(input);
break;
case "N": case "No":
System.out.println("정보 입력을 종료합니니다.");
manager.showBook();
break menu;
default:
System.err.println("Y/N 둘 중 하나를 입력하세요.");
}
}
}
}
// ================================================================================================
package book;
import java.util.Scanner;
public class BookManager {
private final int MAX_CNT = 100;
private AnimalInfo[] infoStorage = new AnimalInfo[MAX_CNT];
private int index = 0;
public void inputData(Scanner input) {
System.out.println("<< 정보를 입력하세요 >>");
System.out.print("1. 이름 : ");
String name = input.next();
System.out.print("2. 나이 : ");
int age = input.nextInt();
infoStorage[index++] = new AnimalInfo(name, age);
System.out.println("데이터 입력이 완료되었습니다.\n");
}
public void showBook() {
System.out.println("\n<< 저장 목록 >>");
// [for 문]
// for (int i=0; i<index; i++) {
// infoStorage[i].showAnimalInfo();
// if (i < index-1) {
// System.out.println("\n"); // 배열의 마지막 요소에만 화이트 라인
// }
// }
// [향상된 for 문]
for(AnimalInfo info: infoStorage) {
if (info == null) {
break;
}
info.showAnimalInfo();
System.out.println();
}
}
}
BookManager 클래스에 Scanner 객체 static 필드 올릴 때
import book.BookManager;
/*
* [과제]
* 1) Scanner 인스턴스 1개만 생성 - o
*
* 2) AnimalBook class
* main method 내 if 문 -> switch문 으로 변경 - o
*/
public class AnimalBook {
// static field
private static BookManager manager = new BookManager();
public static void main(String[] args) {
String userVaule = "";
menu:
while (true) {
System.out.print("정보 입력할까요? (Y/N) ... ");
userVaule = BookManager.input.next().toUpperCase();
switch (userVaule) {
case "Y": case "Yes":
manager.inputData();
break;
case "N": case "No":
System.out.println("정보 입력을 종료합니니다.");
manager.showBook();
break menu;
default:
System.err.println("Y/N 둘 중 하나를 입력하세요.");
}
}
BookManager.input.close();
}
}
// ==============================================================================================
package book;
import java.util.Scanner;
public class BookManager {
private final int MAX_CNT = 100;
private AnimalInfo[] infoStorage = new AnimalInfo[MAX_CNT];
private int index = 0;
public static Scanner input = new Scanner(System.in);
public void inputData() {
System.out.println("<< 정보를 입력하세요 >>");
System.out.print("1. 이름 : ");
String name = input.next();
System.out.print("2. 나이 : ");
int age = input.nextInt();
infoStorage[index++] = new AnimalInfo(name, age);
System.out.println("데이터 입력이 완료되었습니다.\n");
}
public void showBook() {
System.out.println("\n<< 저장 목록 >>");
// [for 문]
// for (int i=0; i<index; i++) {
// infoStorage[i].showAnimalInfo();
// if (i < index-1) {
// System.out.println("\n"); // 배열의 마지막 요소에만 화이트 라인
// }
// }
// [향상된 for 문]
for(AnimalInfo info: infoStorage) {
if (info == null) {
break;
}
info.showAnimalInfo();
System.out.println();
}
}
}
'Language > JAVA' 카테고리의 다른 글
JAVA 자바 활용 백엔드 개발 기초 연습 문제 - 예외 처리 throws 처리 되는 순서 (0) | 2024.04.25 |
---|---|
JAVA 간단한 프로그램 - 동물병원 프로그램 ver2.1 (1) | 2024.04.25 |
JAVA 자바 활용 백엔드 개발 기초 연습 문제 - enum 문제 (0) | 2024.04.25 |
JAVA 간단한 프로그램 - 동물병원 프로그램 ver2 (0) | 2024.04.24 |
JAVA 간단한 프로그램 - 동물병원 프로그램 ver1 (0) | 2024.04.24 |