JAVA 간단한 프로그램 - 동물병원 프로그램 ver2
https://print-blue.tistory.com/166
JAVA 간단한 프로그램 - 동물병원 프로그램 ver1
1. 필드 설정field 을 넣어준 것과 main () 메소드에서 객체 생성해서 사용하는 것과 차이가 있는데 (실행은 됨)메모리에 미리 할당해서 사용하기 위해서 field 로 설정한 것, main() 메소드에서 실행되
print-blue.tistory.com
그럼 메뉴가 정보 입력/정보검색/정보수정/정보삭제/전체정보/종료가 생기면서 프로그램이 업그레이드 됐음
1. 메뉴 부분 만들기
import book.BookManager;
import java.util.Scanner;
public class AnimalBook2 {
// static field
private static BookManager manager = new BookManager();
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while(true) {
System.out.println("[ 메뉴를 선택하세요 ]");
System.out.println("1. 정보 입력\n2. 정보 검색\n3. 정보 수정\n4. 정보 삭제\n5. 전체 정보\n6. 종료");
System.out.print("선택 ... ");
int userValue = input.nextInt();
if (userValue == 1) {
// 1. 정보 입력
manager.inputData();
} else if (userValue == 2) {
// 2. 정보 검색
manager.searchData();
// } else if (userValue == 3) {
// // 3. 정보 수정
// manager.updataData();
// } else if (userValue == 4) {
// // 4. 정보 삭제
// manager.deleteData();
} else if (userValue == 5) {
// 5. 전체 정보
manager.showBook();
} else if (userValue == 6){
// 6. 종료
System.out.println("++ 프로그램을 종료합니다. ++");
input.close();
break;
} else {
System.out.println("잘못된 선택입니다. 다시 선택해주세요.\n");
}
}
}
}
2. BookManager
2-1 . 정보 입력(저장)
프로젝트 1 참고
// [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();
infoStorage[index++] = new AnimalInfo(name, age);
System.out.println("데이터 입력이 완료되었습니다.\n");
}
자 여기서 저장된 정보 중에 같은 이름이 있으면 이미 저장된 이름이 있다고 출력해주기
// [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");
}
2-2. 정보 검색
infoStorage 에 저장된 배열을 순회해서 특정 키워드로 통해 저장되어 있는 해당 index 에 접근해 정보 출력을 구현하면 된다 !
근데 우리는 특정 키워드를 이름으로 찾아낼거라 문제에서 그랬으니 infoStorage 에 저장된 이름 을 찾아내면 된다
1. 이름을 입력받은 후, 검색
2-1. 있으면, 정보 출력 ( showAnilmalInfo 메소드 호출)
2-2. 없으면, "해당 데이터는 없습니다." 문구 출력
// [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++) {
//
}
}
근데 이름을 어떻게 찾을건지 ?! 생각해봐야한다
showAnilmalInfo 가 있는 AnimalInfo class 로 다시 돌아가 ... 이름만 가져오는 코드를 작성해주자
어떤 것을 작성하냐 ! getter 를 !
package book;
public class AnimalInfo {
private String name;
private int age;
public AnimalInfo(String name, int age) {
this.name = name;
this.age = age;
}
// 이 부분 추가 ! ==============================
public String getName() {
return this.name;
}
// ============================================
public void showAnimalInfo() {
System.out.println("name >> " + this.name);
System.out.println("age >> " + this.age);
}
}
AnimalInfo class 에서 이제 name 을 가져올 수 있으니 infoStorage[i].getName() 하면 되고,
여기서 이제 문자열 비교를 위해 . equals 를 하면 된다
infoStorage[i].getName().equals(name)
// [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();
}
}
System.out.println("해당 데이터는 없습니다.\n");
}
하지만 이렇게 해도 배열을 돌면서 있을 때 찾고 , 다음 배열에 없으니 해당 데이터 없다고 출력까지 된다
이를 해결하기 위해서 찾았을 때 return 을 해줘서 끝내주면 된다
// [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");
}
다른 방법으로는 boolean 타입 변수를 만들어서 true / false 만들면 된다
// [2. 정보 검색] ===============================================
public void searchData() {
@SuppressWarnings("resource")
Scanner input = new Scanner(System.in);
System.out.print("검색할 이름을 입력하세요 ... ");
String name = input.next();
boolean find = false;
for (int i=0; i<index; i++) {
if (infoStorage[i].getName().equals(name)) {
infoStorage[i].showAnimalInfo();
find = true;
System.out.println();
}
}
if (! find) {
System.out.println("해당 데이터는 없습니다.\n");
}
}
2-3. 정보 수정
정보 검색을 마쳤으면 수정도 비슷하다 !
infoStorage 에 저장된 배열을 순회해서 이름을 통해 저장되어 있는 해당 index 에 접근해 수정해주면 된다 !
만약 이름이 없으면 해당 데이터 없다는 문구 출력을 하면 된다
1. 이름을 입력받은 후, 수정
2-1. 있으면, 수정 후 "수정이 완료되었습니다." 출력
2-2. 없으면 "해당 데이터는 없습니다." 출력
첫번째로 사용자에게 수정할 이름을 입력 받기
근데 우리가 수정할 이름을 입력받은 다음에 나이 입력도 받아야 한다 !
// [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();
}
일단 더 작업이 필요하지만 한 번 출력해보자
// [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)) {
//
}
}
}
흠 근데 이름으로 찾고 수정해야되는데 수정해야할 코드를 어떻게 해야될지 모르겠다
그러면 또 다시 AnimalInfo class 에 private 필드라 접근이 안되니 메소드로 접근하기 위해 setter 를 추가 해주자
# AnimalInfo 전체 코드
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);
}
}
그럼 다시 bookManager 로 돌아가 마저 수정하자
// [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");
}
근데 문제는 없지만 기능에 대해 생각해봐야한다
이름 기준으로 수정할건데, 나이를 무조건 넣게 된다
이 부분은 나중에 다른 포스팅에서 해결하고, 지금은 넘어가자
2-4. 정보 삭제
정보 삭제는 좀 신경을 써야되는 부분이 있다
이름을 입력했을 때 있으면 삭제하고, 없으면 해당 데이터가 없으면 해당 데이터는 없습니다 문구 출력해야한다
그래서 검색 작업이 먼저 이루어져 한다.
1. 이름을 입력받은 후, 삭제
2-1. 있으면, 삭제 후 '삭제가 완료되었습니다.' 문구 출력
2-2. 없으면, '해당 데이터는 없습니다.' 출력
// [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)) {
//
}
}
}
그렇담 여기서 또 이름을 찾았을 때 어떤 코드를 작성하느냐 가 문제인건데
여기서도 여러 방법이 있겠지만그 중 나는 이름을 찾고 해당 인덱스에 저장된 객체를 null 로 수정하는 것이다.
// [4. 정보 삭제] ===============================================
public void deleteData() {
@SuppressWarnings("resource")
Scanner input = new Scanner(System.in);
System.out.print("삭제할 이름을 입력하세요 ... ");
String name = input.nextLine();
for (int i=0; i<index; i++) {
if (infoStorage[i].getName().equals(name)) {
infoStorage[i] = null;
System.out.println("삭제가 완료되었습니다.\n");
return;
}
}
System.out.println("해당 데이터는 없습니다.\n");
}
하지만 배열 0 자리에 오는 정보를 삭제하면
if (infoStorage[i].getName().equals(name)) 에서 infoStorage[i] 가 null 이니 에러가 뜬다
그렇담 다시 수정
해당 인덱스를 삭제하는게 아니라 인덱스는 냅두고 null 값으로 수정하면 null 이 에러가 뜨니
해당 인덱스를 삭제하고 삭제한 자리에 그 다음 인덱스 를 그 자리에 넣으면 된다
처리를 하면서 증가했던 index 는 삭제될 때 index 증감시켜주는 거 꼭 !
여기서 배열은 장점은 단순
단점은 앞자리나 중간을 삭제하면 전체가 이동해야함
// [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++) { // j 는 i 부터 시작해야함
infoStorage[j] = infoStorage[j+1]; // 원래 있던 인덱스에 +1
}
index-- // 삭제했으니 증가했던 index를 다시 증감
System.out.println("삭제가 완료되었습니다.\n");
return;
}
}
System.out.println("해당 데이터는 없습니다.\n");
}
2-5. 전체 정보 출력
// [5. 전체 정보 출력] ==========================================
public void showBook() {
System.out.println("\n<< 저장 목록 >>");
// [for문]
for(int i=0; i<index; i++) {
infoStorage[i].showAnimalInfo();
System.out.println();
}
// [향상된 for문]
// for(AnimalInfo info: infoStorage) {
// if (info == null) {
// break;
// }
// info.showAnimalInfo();
// System.out.println();
// }
3. 전체 코드
# AnimalBook 전체 코드
import book.BookManager;
import java.util.Scanner;
public class AnimalBook {
// static field
private static BookManager manager = new BookManager();
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while(true) {
System.out.println("[ 메뉴를 선택하세요 ]");
System.out.println("1. 정보 입력\n2. 정보 검색\n3. 정보 수정\n4. 정보 삭제\n5. 전체 정보\n6. 종료");
System.out.print("선택 ... ");
int userValue = input.nextInt();
if (userValue == 1) {
// 1. 정보 입력
manager.inputData();
} else if (userValue == 2) {
// 2. 정보 검색
manager.searchData();
} else if (userValue == 3) {
// 3. 정보 수정
manager.updataData();
} else if (userValue == 4) {
// 4. 정보 삭제
manager.deleteData();
} else if (userValue == 5) {
// 5. 전체 정보
manager.showBook();
} else if (userValue == 6){
// 6. 종료
System.out.println("++ 프로그램을 종료합니다. ++");
input.close();
break;
} else {
System.out.println("잘못된 선택입니다. 다시 선택해주세요.\n");
}
}
}
}
# book 전체 코드
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);
}
}
# BookManager 전체 코드
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;
// [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");
}
// ==============================================================
// [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");
}
// ==============================================================
// [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");
}
// ==============================================================
// [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");
}
// ==============================================================
// [5. 전체 정보 출력] ==========================================
public void showBook() {
System.out.println("\n<< 저장 목록 >>");
// [for문]
for(int i=0; i<index; i++) {
infoStorage[i].showAnimalInfo();
System.out.println();
}
// [향상된 for문]
// for(AnimalInfo info: infoStorage) {
// if (info == null) {
// break;
// }
// info.showAnimalInfo();
// System.out.println();
// }
}
}
다음 포스팅 >> https://print-blue.tistory.com/167
JAVA 간단한 프로그램 - 동물병원 프로그램 ver2
https://print-blue.tistory.com/166 JAVA 간단한 프로그램 - 동물병원 프로그램 ver11. 필드 설정field 을 넣어준 것과 main () 메소드에서 객체 생성해서 사용하는 것과 차이가 있는데 (실행은 됨)메모리에 미
print-blue.tistory.com