https://print-blue.tistory.com/169
https://print-blue.tistory.com/167
1) Scanner 인스턴스 1개만 생성
2) AnimalBook class
[main method]
2-1) if 문 -> switch문 으로 변경
2-2) 메뉴를 show() 메소드로 구현
book package 내 Menu class 추가 : show() 정의
3) BookManager class
3-1) updataData() : 이름이 있을 경우, 나이 입력 받기
3-2) inputData(), searchData(), upData(), deleteData() 메소드 내
중복된 코드를 메소드 구현 : search() - index 리턴 (int)
중복된 코드 : for (int i=0; i<index; i++)
- 배열 100이 넘어갔을 때도 처리해야함
- 만약 i 가 99일때 infoStorage[j+1] 부분에서 에러가 뜸
1) Scanner 인스턴스 1개만 생성
https://print-blue.tistory.com/169 참고 !!
import java.util.Scanner;
public class BookManager {
private final int MAX_CNT = 5;
private AnimalInfo[] infoStorage = new AnimalInfo[MAX_CNT];
private int index = 0;
public static Scanner input = new Scanner(System.in);
...
}
이전에 메소드마다 Scanner 객체 생성했던 부분 다 지우기 !
public class AnimalBook {
// static field
private static BookManager manager = new BookManager();
public static void main(String[] args) {
String userValue = "";
while(true) {
...
}
BookManager.input.close();
}
}
2) AnimalBook class [main method]
2-1) if 문 -> switch문 으로 변경
2-2) 메뉴를 show() 메소드로 구현
book package 내 Menu class 추가 : show() 정의
2-2 부터 구현하고 ! 2-1 구현해보자 !
이 부분을 show() 메소드로 정의할 것 !
System.out.println("[ 메뉴를 선택하세요 ]");
System.out.println("1. 정보 입력\n2. 정보 검색\n3. 정보 수정\n4. 정보 삭제\n5. 전체 정보\n6. 종료");
System.out.print("선택 ... ");
book 패키지 내 Menu class 추가 하라 했으니 정의할 것 !
static 필드로 만든 이유는 굳이 인스턴스를 만들지 않고 사용하지 않기 위해서 !
package book;
public class Menu {
// [메뉴 출력] ==================================================
public static void show() {
System.out.println("\n[ 메뉴를 선택하세요 ]");
System.out.println("1. 정보 입력\n2. 정보 검색\n3. 정보 수정\n4. 정보 삭제\n5. 전체 정보\n6. 종료");
System.out.print("선택 ... ");
}
}
그럼 이제 다시 AnimalBook 클래스로 돌아와 main () 메소드에서 if 문을 swith 문으로 바꾸자
import book.BookManager;
import book.Menu; // 추가 !
public class AnimalBook {
// static field
private static BookManager manager = new BookManager();
public static void main(String[] args) {
int userValue;
menu:
while(true) {
Menu.show(); // 추가 !
userValue = BookManager.input.nextInt();
switch(userValue) {
case 1:
manager.inputData(); // 1. 정보 입력(저장)
break;
case 2:
manager.searchData(); // 2. 정보 검색
break;
case 3:
manager.updataData(); // 3. 정보 수정
break;
case 4:
manager.deleteData(); // 4. 정보 삭제
break;
case 5:
manager.showBook(); // 5. 전체 정보
break;
case 6:
System.out.println("++ 프로그램을 종료합니다. ++");
break menu; // 6. 종료
}
}
BookManager.input.close();
}
}
3) BookManager class
3-1) updataData() : 이름이 있을 경우, 나이 입력 받기
3-2) inputData(), searchData(), upData(), deleteData() 메소드 내
중복된 코드를 메소드 구현 : search() - index 리턴 (int)
중복된 코드 : for (int i=0; i<index; i++)
이것도 3-2 부터 해결 하자
중복되는 코드를 먼저 메소드로 구현한 다음, 3-1 부분을 코드 추가하면서 중간중간에 구현해보자
BookManager 클래스에 메소드 정의부터 하자
기존에 코드를 보면 반복문 내에서 같은 이름이 있는지 찾는 거였는데,
메소드를 재정의해야되는데 그럼 매개변수로 이름을 받아야 된다 !
또 메소드 구현하면서 반환형은 index 로 리턴하라 했으니 int 로 하고, (index 가 int 타입이니까)
하지만 index 에 값을 저장하라는 게 아니다 !!!
i 는 같은 이름을 찾았을 때 해당 인덱스 번호를 찾은거니까 return 을 i 로 해야된다 !
만약 조건이 맞지 않을 때 for 문 밖에 return 으로 -1, 즉,절대로 가질 수 없는 값 ! 으로 해야된다
0을 하지 않은 이유는 배열은 0부터 시작 되기 때문 !
또한 내부에서만 사용할거니까 private로 바꾸고, 모든 메소드가 public 이 아니다 라는 점 알아두자
// [중복 검사] ==================================================
private int search(String name) {
for (int i=0; i<index; i++) {
if (infoStorage[i].getName().equals(name)) {
return i;
}
}
return -1;
}
자 재정의 했으니 다른 메소드도 재정의해주자
1) inputData() 메소드 재정의
# 기존 코드
// [1. 정보 입력(저장)] =========================================
public void inputData() {
@SuppressWarnings("resource")
Scanner input = new Scanner(System.in);
System.out.println("<< 정보를 입력하세요 >>");
System.out.print("1. 이름 : ");
String name = input.next();
System.out.print("2. 나이 : ");
int age = input.nextInt();
for (int i=0; i<index; i++) {
if (infoStorage[i].getName().equals(name)) {
System.out.println("이미 저장된 이름입니다.\n");
return;
}
}
infoStorage[index++] = new AnimalInfo(name, age);
System.out.println("데이터 입력이 완료되었습니다.\n");
}
기존 코드를 보면 정보를 입력할 때 무조건 ! 이름 입력 후 나이 입력을 해서 저장이 됐는데
이젠 정보를 입력할 때 기존에 저장되어 있는 이름이 있으면 나이는 받지 않고, 이미 저장된 이름이 있다 ! 라고 문구 출력해주자
이름을 입력받고, 나이를 입력하기 전에 반복문을 통해 저장된 값(배열)에 같은 이름이 있는지 확인해주는 메소드를 호출해서 조건식으로 있는지 없는지 확인하면 된다
찾았으면 해당 인덱스 번호가 리턴되고, 못찾았으면 절대로 가질 수 없는 값 -1 (음수면 됨) 리턴되니,
int 타입의 참조변수에 값을 설정해주고, 설정한 참조 변수를 가지고 조건문으로 -1 이 아니면 ! 이미 저장된 이름이라고 문구 출력하고, 다음 코드가 실행되지 않게 return 해주면 된다
변수에 저장해준 이유는 다음 라인에 이후에 또 사용하기 위해서 저장한 것 !!!
만약 -1 이면 찾지 못했으니 즉, 같은 이름이 없으니 if 문이 실행되지 않을 것이고, 다음 코드인 나이를 입력받게 된다
# 재정의
// [1. 정보 입력(저장)] =========================================
public void inputData() {
System.out.println("<< 정보를 입력하세요 >>");
System.out.print("1. 이름 : ");
String name = input.next();
int searchIndex = search(name);
if (searchIndex != -1) { // 추가 !
System.out.println("이미 저장된 이름입니다.");
return;
}
System.out.print("2. 나이 : ");
int age = input.nextInt();
infoStorage[index++] = new AnimalInfo(name, age);
System.out.println("데이터 입력이 완료되었습니다.");
}
2) searchData() 메소드 재정의
# 기존 코드
// [2. 정보 검색] ===============================================
public void searchData() {
@SuppressWarnings("resource")
Scanner input = new Scanner(System.in);
System.out.print("검색할 이름을 입력하세요 ... ");
String name = input.next();
for (int i=0; i<index; i++) {
if (infoStorage[i].getName().equals(name)) {
infoStorage[i].showAnimalInfo();
System.out.println();
return;
}
}
System.out.println("해당 데이터는 없습니다.\n");
}
정보 입력 메소드와 같이 Scanner 객체 생성 부분 지우고 !
조건문을 통해 이름 검색 후 있으면 해당 정보를 출력해주고, 없으면 해당 데이터는 없다는 문구를 출력해주면 된다 !
앞서 말했듯 search() 리턴값이 int 이니까 int 타입의 참조 변수에 값을 저장해주자
변수에 저장을 해야 다음 라인에서 변수에 저장된 값을 사용하기 위해서 !
조건식을 통해 -1 (같은 이름이 없는 경우) 이 아닐 때 (searchIndex != -1),
저장된 해당 인덱스 번호를 infosrorage 에 [인덱스번호] 를 입력하여 showAnimalInfo() 메소드 호출해주면 된다
# 재정의
// [2. 정보 검색] ===============================================
방법 1
public void searchData() {
System.out.print("검색할 이름을 입력하세요 ... ");
String name = input.next();
int searchIndex = search(name);
if (searchIndex != -1) {
infoStorage[searchIndex].showAnimalInfo();
System.out.println();
return;
}
System.out.println("해당 데이터는 없습니다.");
}
방법 2
public void searchData() {
System.out.print("검색할 이름을 입력하세요 ... ");
String name = input.next();
int searchIndex = search(name);
if (searchIndex == -1) {
System.out.println("해당 데이터는 없습니다.");
} else {
infoStorage[searchIndex].showAnimalInfo();
System.out.println();
}
}
전 방법 2로 가겠어용 ^.^
3) updataData() 메소드 재정의
# 기존 코드
// [3. 정보 수정] ===============================================
public void updataData() {
@SuppressWarnings("resource")
Scanner input = new Scanner(System.in);
System.out.print("수정할 이름을 입력하세요 ... ");
String name = input.nextLine();
System.out.print("나이를 입력하세요 ...");
int age = input.nextInt();
for (int i=0; i<index; i++) {
if (infoStorage[i].getName().equals(name)) {
infoStorage[i].setAge(age);
System.out.println("수정이 완료되었습니다.\n");
return;
}
}
System.out.println("해당 데이터는 없습니다.\n");
}
수정하는 메소드도 동일하게 같은 이름이 있으면 나이까지 입력하지 않고, 해당 데이터가 없다고 수정하면 된다
# 재정의
// [3. 정보 수정] ===============================================
방법 1
public void updataData() {
System.out.print("수정할 이름을 입력하세요 ... ");
String name = input.next();
int searchIndex = search(name);
if (searchIndex != -1) {
System.out.print("나이를 입력하세요 ...");
int age = input.nextInt();
infoStorage[searchIndex].setAge(age);
System.out.println("수정이 완료되었습니다.");
return;
}
System.out.println("해당 데이터는 없습니다.");
}
방법 2
public void updataData() {
System.out.print("수정할 이름을 입력하세요 ... ");
String name = input.next();
int searchIndex = search(name);
if (searchIndex == -1) {
System.out.println("해당 데이터는 없습니다.");
return;
}
System.out.print("나이를 입력하세요 ...");
int age = input.nextInt();
infoStorage[searchIndex].setAge(age);
System.out.println("수정이 완료되었습니다.");
}
이것도 방법 2 로 쓰기 ~~,,
4) deleteData() 메소드 재정의
# 기존 코드
// [4. 정보 삭제] ===============================================
public void deleteData() {
@SuppressWarnings("resource")
Scanner input = new Scanner(System.in);
System.out.print("삭제할 이름을 입력하세요 ... ");
String name = input.next();
for (int i=0; i<index; i++) {
if (infoStorage[i].getName().equals(name)) {
for (int j=i; j<index; j++) {
infoStorage[j] = infoStorage[j+1];
}
index--;
System.out.println("삭제가 완료되었습니다.\n");
return;
}
}
System.out.println("해당 데이터는 없습니다.\n");
}
삭제 부분은 좀 더 신경써야된다
지금 작성한 코드는 간단한거지 우너래 삭제 부분은 처리할 부분이 많다 !
# 재정의
// [4. 정보 삭제] ===============================================
방법 1
public void deleteData() {
System.out.print("삭제할 이름을 입력하세요 ... ");
String name = input.next();
int searchIndex = search(name);
if (searchIndex != -1) {
for (int j=searchIndex; j<index; j++) {
infoStorage[j] = infoStorage[j+1];
}
index--;
System.out.println("삭제가 완료되었습니다.");
return;
}
System.out.println("해당 데이터는 없습니다.");
}
방법 2
public void deleteData() {
System.out.print("삭제할 이름을 입력하세요 ... ");
String name = input.next();
int searchIndex = search(name);
if (searchIndex == -1) {
System.out.println("해당 데이터는 없습니다.");
return;
}
for (int j=searchIndex; j<index; j++) {
infoStorage[j] = infoStorage[j+1];
}
index--;
System.out.println("삭제가 완료되었습니다.");
}
전체 코드
import book.BookManager;
import book.Menu;
/*
* [과제]
* 1) Scanner 인스턴스 1개만 생성 - o
*
* 2) AnimalBook class
* [main method]
* 2-1) if 문 -> switch문 으로 변경 - o
* 2-2) 메뉴를 show() 메소드로 구현 - o
* book package 내 Menu class 추가 : show() 정의
*
* 3) BookManager class
* 3-1) updataData() : 이름이 있을 경우, 나이 입력 받기 - o
* 3-2) inputData(), searchData(), upData(), deleteData() 메소드 내 - o
* 중복된 코드를 메소드 구현 : search() - index 리턴 (int)
* 중복된 코드 : for (int i=0; i<index; i++)
*
* - 배열 100이 넘어갔을 때도 처리해야함
* - 만약 i 가 99일때 infoStorage[j+1] 부분에서 에러가 뜸
*/
public class AnimalBook {
// static field
private static BookManager manager = new BookManager();
public static void main(String[] args) {
int userValue;
menu:
while(true) {
Menu.show(); // 메뉴판
userValue = BookManager.input.nextInt();
switch(userValue) {
case 1:
manager.inputData(); // 1. 정보 입력(저장)
break;
case 2:
manager.searchData(); // 2. 정보 검색
break;
case 3:
manager.updataData(); // 3. 정보 수정
break;
case 4:
manager.deleteData(); // 4. 정보 삭제
break;
case 5:
manager.showBook(); // 5. 전체 정보
break;
case 6:
System.out.println("++ 프로그램을 종료합니다. ++");
break menu; // 6. 종료
}
}
BookManager.input.close();
}
}
package book;
public class AnimalInfo {
private String name;
private int age;
public AnimalInfo(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return this.name;
}
public void showAnimalInfo() {
System.out.println("name >> " + this.name);
System.out.println("age >> " + this.age);
}
}
package book;
public class Menu {
// [메뉴 출력] ==================================================
public static void show() {
System.out.println("\n[ 메뉴를 선택하세요 ]");
System.out.println("1. 정보 입력\n2. 정보 검색\n3. 정보 수정\n4. 정보 삭제\n5. 전체 정보\n6. 종료");
System.out.print("선택 ... ");
}
}
package book;
import java.util.Scanner;
public class BookManager {
private final int MAX_CNT = 5;
private AnimalInfo[] infoStorage = new AnimalInfo[MAX_CNT];
private int index = 0;
public static Scanner input = new Scanner(System.in);
// [중복 검사] ==================================================
private int search(String name) {
for (int i=0; i<index; i++) {
if (infoStorage[i].getName().equals(name)) {
return i;
}
}
return -1;
}
// [1. 정보 입력(저장)] =========================================
public void inputData() {
System.out.println("<< 정보를 입력하세요 >>");
System.out.print("1. 이름 : ");
String name = input.next();
int searchIndex = search(name);
if (searchIndex != -1) {
System.out.println("이미 저장된 이름입니다.");
return;
}
System.out.print("2. 나이 : ");
int age = input.nextInt();
infoStorage[index++] = new AnimalInfo(name, age);
System.out.println("데이터 입력이 완료되었습니다.");
}
// [2. 정보 검색] ===============================================
public void searchData() {
System.out.print("검색할 이름을 입력하세요 ... ");
String name = input.next();
int searchIndex = search(name);
if (searchIndex == -1) {
System.out.println("해당 데이터는 없습니다.");
} else {
infoStorage[searchIndex].showAnimalInfo();
System.out.println();
}
}
// [3. 정보 수정] ===============================================
public void updataData() {
System.out.print("수정할 이름을 입력하세요 ... ");
String name = input.next();
int searchIndex = search(name);
if (searchIndex == -1) {
System.out.println("해당 데이터는 없습니다.");
return;
}
System.out.print("나이를 입력하세요 ...");
int age = input.nextInt();
infoStorage[searchIndex].setAge(age);
System.out.println("수정이 완료되었습니다.");
}
// [4. 정보 삭제] ===============================================
public void deleteData() {
System.out.print("삭제할 이름을 입력하세요 ... ");
String name = input.next();
int searchIndex = search(name);
if (searchIndex == -1) {
System.out.println("해당 데이터는 없습니다.");
return;
}
for (int j=searchIndex; j<index; j++) {
infoStorage[j] = infoStorage[j+1];
}
index--;
System.out.println("삭제가 완료되었습니다.");
}
// [5. 전체 정보 출력] ==========================================
public void showBook() {
System.out.println("<< 저장 목록 >>");
for(int i=0; i<index; i++) {
infoStorage[i].showAnimalInfo();
System.out.println();
}
}
}
'Language > JAVA' 카테고리의 다른 글
JAVA 간단한 프로그램 - 상품 관리 프로그램 (평가) (0) | 2024.04.29 |
---|---|
JAVA 자바 활용 백엔드 개발 기초 연습 문제 - 예외 처리 throws 처리 되는 순서 (0) | 2024.04.25 |
JAVA 간단한 프로그램 - 동물병원 프로그램 ver1.1 (0) | 2024.04.25 |
JAVA 자바 활용 백엔드 개발 기초 연습 문제 - enum 문제 (0) | 2024.04.25 |
JAVA 간단한 프로그램 - 동물병원 프로그램 ver2 (0) | 2024.04.24 |