1. 필드 설정
field 을 넣어준 것과 main () 메소드에서 객체 생성해서 사용하는 것과 차이가 있는데 (실행은 됨)
메모리에 미리 할당해서 사용하기 위해서 field 로 설정한 것, main() 메소드에서 실행되고 끝나면 사라짐
public class AnimalBook {
// static field
private static BookManager manager = new BookManager();
public static void main(String[] args) {
}
}
package book;
public class AnimalInfo {
private String name;
private int age;
public AnimalInfo(String name, int age) {
}
public void showAnimalInfo() {
}
}
package book;
import java.util.Scanner;
public class BookManager {
private final int MAX_CNT;
private int index = 0;
public void inputData() {
}
public void showBook() {
}
}
2. book package
AnimalInfo 클래스
- 매개 변수 2개를 받는 생성자 정의
public AnimalInfo(String name, int age) { // 매개변수 2개를 받는 생성자 정의
this.name = name;
this.age = age;
}
- 출력하는 메소드 정의, 반환형이 없는 메소드라 void 로 설정했음
public void showAnimalInfo() { // 반환형이 없는 메소드라 void 로 설정, 출력하는 메소드
System.out.println("name >> " + this.name);
System.out.print("age >> " + this.age);
}
BookManager 클래스
- BookManager 필드 설정
AnimalInfo 를 배열로 관리할 것
private final int MAX_CNT = 100; // final : 값 설정 x
private AnimalInfo[] infoStorage = new AnimalInfo[MAX_CNT];
private int index = 0;
- inputData() 메소드 : 입력 받을 때 실행될 메소드
사용자에게 입력 받을 정보를 infoStorage에 저장할 것 !
1. 사용자에게 입력 받기 위해서 Scanner 객체 생성
2. 이름과 나이 입력 받기
3. AnimalInfo 생성자를 통해 객체를 만들고, infoStorage 배열에 저장
public void inputData() {
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();
System.out.println();
input.close();
}
디버깅을 위해 출력을 해볼건데 AnimalBook 파일에 main() 메소드에서 호출할 것
하지만 AnimalBook 에는 static 필드가 있는데 외부에 있는 메소드를 가져오기 위해서임 !
static 필드를 설정해주고 main() 메소드에서 출력해보기
AnimalBook 파일 만들어주고 코드 작성 !
main() 메소드에서 실행되는 출력 문구인데 보면 while 문을 써서 Y 와 N 에 따라 조건문이 실행되는 거 같다
import book.BookManager;
public class AnimalBook {
// static field
private static BookManager manager = new BookManager();
public static void main(String[] args) {
while (true) {
System.out.print("정보 입력할까요? (Y/N) ... ");
userVaule = input.next();
if (userVaule.equals("y") {
manager.inputData();
} else if (userVaule.equals("n") {
break;
}
}
System.out.println("정보 입력을 종료합니니다.\n");
}
}
근데 inputData() 코드 안에 Scanner 객체를 닫아버리면 다음 입력을 받을 수가 없음
그러면 다시 수정
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();
System.out.println();
}
그러면 이제
3. AnimalInfo 생성자를 통해 객체를 만들고, infoStorage 배열에 저장 이 부분을 처리할 것
아래 코드를 보면 이제 infoStorage[???] 에 인덱스에 어떻게 접근할 것인지 생각해봐야한다 !
infoStorage[???] = new AnimalInfo(name, age); // 사용자에게 name, age 입력 받은 것
BookManager class 의 field 를 보면 괜히 private int index = 0; field 가 있는게 아니다
infoStorage[index] = new AnimalInfo(name, age);
근데 또 여기서 [index] 만하면 입력 받을 때마다 같은 index = 0, 0 자리에 계속 덮어씌워질 거다
후증가를 해서 index를 처리해주면 된다
infoStorage[index++] = new AnimalInfo(name, age);
이렇게 하면 inputData() 메소드가 실행될때마다 index가 후증가 되면서 infoStorage 배열에 저장될 거다
확인해보기 위해 출력해보기
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();
System.out.println("현재 인덱스 >> " + index);
infoStorage[index++] = new AnimalInfo(name, age);
System.out.println("다음 인덱스 >> " + index);
System.out.println("데이터 입력이 완료되었습니다.\n");
}
# inputData() 전체 코드
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();
AnimalInfo animal = new AnimalInfo(name, age);
infoStorage[index++] = animal;
System.out.println("데이터 입력이 완료되었습니다.\n");
}
- showBook() 메소드 : 정보를 보기 위해 실행될 메소드
저장된 배열을 출력하기 위해서 반복문 사용해서 출력할 것 !
infoStorage.length 를 하면 전체를 도는데 그럼 들어가지 않은 것까지 돌아가서 이거는 사용 x
그래서 저장된 index까지 돌기 위해 i<index 를 하면 된다
infostorage[ i ].shoeAnimalInfo() 를 해서 출력하면 된다
public class AnimalInfo {
...
public void showAnimalInfo() {
System.out.println("name >> " + this.name);
System.out.print("age >> " + this.age);
}
}
public void showBook() {
System.out.println("\n<< 저장 목록 >>");
for (int i=0; i<index; i++) {
infoStorage[i].showAnimalInfo();
if (i < index-1) {
System.out.println("\n"); // 배열의 마지막 요소에만 화이트 라인
}
}
}
근데 일반 for 문 말고 향상된 for 문을 쓰고 싶다
하지만 향상된 for 문을 쓰면 처리해야될 부분이 생긴다
저장되지 않은 index 에는 null 값이 저장되어있는데 showAnimalInfo() 를 쓸 수가 없다
그래서 조건식을 걸어 null 부분은 출력하지 않으면 된다
조건식을 안걸면 NPE 에러 발생 !
( NullPointException = NPE 라 불림)
// [향상된 for 문]
for(AnimalInfo info: infoStorage) {
if (info == null) { // null인지 아닌지 먼저 검사할 것
break;
}
info.showAnimalInfo();
System.out.println();
}
# showBook() 전체 코드
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();
}
}
이것도 main() 메소드에서 출력해서 확인해보면 된다 !
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);
String userVaule = "";
while (true) {
System.out.print("정보 입력할까요? (Y/N) ... ");
userVaule = input.next();
if (userVaule.equalsIgnoreCase("y") || userVaule.equalsIgnoreCase("yes")) {
manager.inputData();
} else if (userVaule.equalsIgnoreCase("n") || userVaule.equalsIgnoreCase("no")) {
break;
}
}
System.out.println("\n정보 입력을 종료합니니다.");
manager.showBook();
}
}
# showBook() 전체 코드
public void showBook() {
System.out.println("\n<< 저장 목록 >>");
for (int i=0; i<index; i++) {
infoStorage[i].showAnimalInfo();
if (i < index-1) {
System.out.println("\n"); // 배열의 마지막 요소에만 화이트 라인
}
}
}
AnimalBook 클래스
사용자에게 입력받았을 때 Y,y,YES,Yes,yes / N,n,NO,no,no 이렇게 입력받았을 때 조건을 걸거다
아래 코드처럼 작성하면 되는데
if (userVaule.equals("y") || userVaule.equals("Y")
|| userVaule.equals("YES") || userVaule.equals("Yes") || userVaule.equals("yes")) {
manager.inputData();
} else if (userVaule.equals("N") || userVaule.equals("N")
|| userVaule.equals("NO") || userVaule.equals("No") || userVaule.equals("no")) {
// manager.showBook();
// input.close();
break;
}
그럼 코드가 너무 길어지고 하니까 자바에서 지원하는 소문자/대문자 구분해주는 equalsIgnoreCase 메소드를 사용해보자
if (userVaule.equalsIgnoreCase("y") || userVaule.equalsIgnoreCase("yes")) {
manager.inputData();
} else if (userVaule.equalsIgnoreCase("n") || userVaule.equalsIgnoreCase("no")) {
// manager.showBook();
// input.close();
break;
}
3. 전체 코드
# 전체 코드
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");
}
}
# 전체 코드
package book;
public class AnimalInfo {
private String name;
private int age;
public AnimalInfo(String name, int age) { // 매개변수 2개를 받는 생성자 정의
this.name = name;
this.age = age;
}
public void showAnimalInfo() { // 반환형이 없는 메소드라 void 로 설정, 출력하는 메소드
System.out.println("name >> " + this.name);
System.out.print("age >> " + this.age);
}
}
# showBook() 전체 코드
public void showBook() {
System.out.println("\n<< 저장 목록 >>");
for(AnimalInfo info: infoStorage) {
if (info == null) {
break;
}
info.showAnimalInfo();
System.out.println();
}
}
'Language > JAVA' 카테고리의 다른 글
JAVA 자바 활용 백엔드 개발 기초 연습 문제 - enum 문제 (0) | 2024.04.25 |
---|---|
JAVA 간단한 프로그램 - 동물병원 프로그램 ver2 (0) | 2024.04.24 |
JAVA Generic 제네릭 개념 & 문법 정리 (0) | 2024.04.23 |
JAVA Calendar 클래스 개념과 예제 (0) | 2024.04.23 |
JAVA 자바 활용 백엔드 개발 기초 연습 문제 - 예외 클래스 정의하기 (0) | 2024.04.22 |