개발일기/Java

클래스 조금 아는 상태에서 회원정보 등록하고, 출력하는 프로그램 만들기

민장미 2023. 4. 20. 04:08

새벽 3시까진 GPT랑 데이트하면서 .... 재미났는데

지금 디질거같음 원래 클래스 내부의 메소드를 써서 출력할랬더니

별 쇼를 다함  결국 그냥 출력하는 코드씀... 무튼 대강 잘 돌아감

오늘 어찌버티냐 

=> 이때, 새벽 4시경

 

 

+ 4/20 오후 4시 추가:

 

(메뉴버튼2번 작동이 되긴하는데 total 번이 아닌 1명분만 출력됌 

=> 원인은 switch 문 case1에서 생성된 객체가 case2에서 사용할 수 없다는거

아니면 루프 밖에 저장해야하는데 객체형이라 이것도 어렵고 ...

 

그래서 GPT와 밤새 데이터를 했다. 

GTP가 도움을 주긴했으나, 해답을 찾도록 도와준거지 짜준 코드 다 틀리고

계속 객체 배열을 만들라는데 만들어야하는 2번 버튼의 기능에 어긋나고, 

그 당시엔 좋다고 객체 배열 만들고 했는데  밤이라 맛이가서 그런지 가장 기본적인걸 잊고 있었음

배열은 애초에 자료형이 같은걸 묶는 거라는거.... 그래서 객체를 배열로 묶어도 문제가 생길게 분명한데 

ㅠㅠㅠㅠ 

 

저 위에 새벽4시쯤  완성된 아래의 1번 코드.

객체 배열로 만들어 저장되도록 해서 출력이 1명분만 되던걸 해결하긴 했다. 

산넘어 산인게 또 다른 문제 발생 ㅋㅋㅋㅋㅋ 

실제로 아래 1번코드를 실행하면 다 진행이 되긴했으나

문자열 정보(이름, 반)가 null로만 출력 됌... 

물론 이 오류 원인은 객체형 배열 때문 ㅋㅋㅋㅋㅋㅋ 배열이 애초에 같은 자료형끼리 묶는건데

 


//학생 정보관리 시스템 프로그램 (회원정보 등록 및 출력) / 배열 이용
// 1. 학생의 수 즉, 배열의 크기를 입력받아서 배열을 생성한다. 한번 생성 후엔  ㄴㄴ 하게
// 2. 메뉴판 생성 1번 정보등록 2번 정보출력 3번 종료
//   2-1. 회원정보를 입력받아서 회원정보를 각 정보별 배열에 대입한다. 
//     고유번호, 이름, 학년, 반 (예외처리) 미입력시 다시 정보 적ㄴㄴ 칸으로 돌아가게 
//   2-2. 등록된 학생 정보를 출력하는 기능 
//   2-3. 종료기능 
// 3. 감싸는 루프문 생성 레이블 등

 

 

코드 총 3 개  무한 수정을 통해서 마지막 코드를 완성 !!

 

1번 코드 :  객체형 배열때문에  case 2: 출력메소드 오류  (문자열은 null로만 출력됌)

package registrationStudent;

import java.util.ArrayList;
import java.util.Scanner;


//메소드 : create(배열생성),  registerSt(학생 등록), printSt(회원정보 출력), 

class Student {
	// 멤버필드 선언
	int sudentNum; // 학생고유넘버
	String name;
	int grade; // 1~3학년
	String classCh; // A~C반
	static ArrayList<Student> stdlist = new ArrayList<>();

	// 생성자 각 멤버필드에 (입력한)값을 저장 다 0을 입력하면 초기화 가능
	public Student(int n, String str, int n2, String ch) {
		sudentNum = n;
		name = str;
		grade = n2;
		classCh = ch;
	} // 생성자

	public void printStudent() {

		for (Student e : stdlist) {// e는 객체다!!!
			System.out.println("======================");
			System.out.println("학생번호: " + e.sudentNum);
			System.out.println("이름	: " + e.name);
			System.out.println("학년	: " + e.grade + "학년");
			System.out.println("반	: " + e.classCh + "반");
			System.out.println("======================");
		}
	}
	/*
	 * public void printStudent(Student st) { //객체형 쓸 일 없을듯
	 * 
	 * System.out.println("======================");
	 * System.out.println("학생번호: "+st.sudentNum);
	 * System.out.println("이름	: "+st.name);
	 * System.out.println("학년	: "+st.grade+"학년");
	 * System.out.println("반	: "+st.classCh+"반");
	 * System.out.println("======================"); } // print
	 */

	// 학생정보를 출력해주는 메소드 //배열형
	// print

	/*
	 * public void printAllStudents(ArrayList<Student> studentList) {
	 * System.out.println("======================"); for(Student st : studentList) {
	 * System.out.println("학생번호: "+st.studentNum);
	 * System.out.println("이름	: "+st.name);
	 * System.out.println("학년	: "+st.grade+"학년");
	 * System.out.println("반	: "+st.classCh+"반");
	 * System.out.println("======================"); } }
	 */

}// class stu

public class StudentSystem {

	public static void main(String[] args) {

		// 필요한 객체를 생성
		// 원활한 객체 사용을 위해 학생 객체를 0으로 초기화함
		Scanner sc = new Scanner(System.in);
		ArrayList<Student> stdArray = new ArrayList<>(); // 윗줄의 sc = stdArray?
		Student ref = new Student(0, null, 0, null); // **초기화가 포인트

		System.out.println("총 학생 인원 수: "); // 학생등록 제한 수
		int total = Integer.parseInt(sc.nextLine());
		int idx = 0; // 학생등록을 한 횟수 0으로 초기화//case1의 조건과 관련 잘 조절

		// Student 객체형의 배열을 만들어서 정보를 저장하자.
		Student[] studentList = new Student[total];

		ext: while (true) {
			System.out.println("메뉴: 1번-학생등록 2번-학생정보출력 3번-시스템 종료");
			int menu = Integer.parseInt(sc.nextLine());

			switch (menu) {

			case 1: // 리미트 넘을시 idx >= total 이거 대신 객체 배열 길이 사용?
				if (idx >= studentList.length) {
					System.out.println("총 학생의 수를 초과하였습니다. 입력불가");

				} else {
					System.out.println("회원정보를 순서대로 입력하시오");
					System.out.print("학생번호 : ");
					ref.sudentNum = Integer.parseInt(sc.nextLine());
					System.out.print("이름 : ");
					ref.name = sc.nextLine();
					System.out.print("학년 : ");
					ref.grade = Integer.parseInt(sc.nextLine());
					System.out.print("반 : ");
					ref.classCh = sc.nextLine();
					// 밖에서 생성된 학생객체에 입력한 값들을 저장
					Student st = new Student(menu, null, menu, null);

					// 생성된 Student 객체는 아래 Student 형 배열에 저장
					studentList[idx++] = st;
					// idx++; //회원등록때마다 1회 증가 => 이거 삭제 위에 배열에서 대신 증감

				} // else
				break;

			case 2: // 최대 문제 ...case1의 객체를 어케 여기서 쓸것인가 => 해결
				// 또 다른 문제 : 객체 1개를 번갈아 쓰는거라서 학생 1명만 출력이 됌
				// case 1번을 여기서 반복하게 해야함 => 불가능 결국 객체형 배열을 만들어 따로 저장해야함
				// st는 case1에서 만들어지지만 밖 배열에 저장되므로 사용가능
				for (Student e :studentList) {// e는 객체다!!!
					System.out.println("======================");
					System.out.println("학생번호: " + e.sudentNum);
					System.out.println("이름	: " + e.name);
					System.out.println("학년	: " + e.grade + "학년");
					System.out.println("반	: " + e.classCh + "반");
					System.out.println("======================");
				}

				break;
			case 3:
				System.out.println("시스템을 종료합니다.");
				break ext;

			}// sw

		} // wh

	}// main


}

 

2번 코드:  학원에 와서 오전에 잠깐 고쳐봄 

아예 클래스 멤버필드를 전부 문자열로 고쳐버림

그랬더니 문제였던 null만 출력되던 현상은 고쳐짐 

다만 전부 문자열이다보니 예외처리가 불가능한거 + 그리고 뭔가 이건 이상하다고 계속 찜찜해서 

지금까지 꾸준히 고쳐서 드. 디.어 

package registrationStudent;

import java.util.ArrayList;

import java.util.Scanner;

class Student {
	// 멤버필드 선언
	String sudentNum; // 학생고유넘버
	String name;
	String grade; // 1~3학년
	String classCh; // A~C반
	private String studentNum;
	static ArrayList<Student> stdlist = new ArrayList<>();

	// 생성자 각 멤버필드에 (입력한)값을 저장 다 0을 입력하면 초기화 가능
	public Student(String n, String str, String n2, String ch) {
		sudentNum = n;
		name = str;
		grade = n2;
		classCh = ch;
	} // 생성자

	public void printStudent() {

		for (Student e : stdlist) {// e는 객체다!!!
			System.out.println("======================");
			System.out.println("학생번호: " + e.sudentNum);
			System.out.println("이름	: " + e.name);
			System.out.println("학년	: " + e.grade + "학년");
			System.out.println("반	: " + e.classCh + "반");
			System.out.println("======================");
		}
	}

}// class stu

// 학생 객체 //주민번호 앞자리 => 성별

// 학생 정보관리 시스템 프로그램 (회원정보 등록 및 출력) / 배열 이용
// 1. 학생의 수 즉, 배열의 크기를 입력받아서 배열을 생성한다. 한번 생성 후엔 ㄴㄴ 하게
// 2. 메뉴판 생성 1번 정보등록 2번 정보출력 3번 종료
// 2-1. 회원정보를 입력받아서 회원정보를 각 정보별 배열에 대입한다.
//	  	  고유번호, 이름, 학년, 반 (예외처리) 미입력시 다시 정보 적ㄴㄴ 칸으로 돌아가게 
// 2-2. 등록된 학생 정보를 출력하는 기능
// 2-3. 종료기능
// 3. 감싸는 루프문 생성 레이블 등

public class StudentSystem {

	public static void main(String[] args) {

		// 필요한 객체를 생성
		// 원활한 객체 사용을 위해 학생 객체를 0으로 초기화함
		Scanner sc = new Scanner(System.in);
		ArrayList<Student> stdArray = new ArrayList<>(); // 윗줄의 sc = stdArray?
		Student ref = new Student(null, null, null, null); // **초기화가 포인트

		System.out.println("총 학생 인원 수: "); // 학생등록 제한 수
		int total = Integer.parseInt(sc.nextLine());
		int idx = 0; // 학생등록을 한 횟수 0으로 초기화//case1의 조건과 관련 잘 조절

		// Student 객체형의 배열을 만들어서 정보를 저장하자.
		Student[] studentList = new Student[total];

		ext: while (true) {
			System.out.println("메뉴: 1번-학생등록 2번-학생정보출력 3번-시스템 종료");
			int menu = Integer.parseInt(sc.nextLine());

			switch (menu) {

			case 1: // 리미트 넘을시 idx >= total 이거 대신 객체 배열 길이 사용?
				if (idx >= studentList.length) {
					System.out.println("총 학생의 수를 초과하였습니다. 입력불가");

				} else {
					System.out.println("회원정보를 순서대로 입력하시오");
					System.out.print("학생번호 : ");
					ref.sudentNum = sc.nextLine();
					System.out.print("이름 : ");
					ref.name = sc.nextLine();
					System.out.print("학년 : ");
					ref.grade = sc.nextLine();
					System.out.print("반 : ");
					ref.classCh = sc.nextLine();
					// 밖에서 생성된 학생객체에 입력한 값들을 저장
					Student st = new Student(ref.sudentNum, ref.name, ref.grade, ref.classCh);

					// 생성된 Student 객체는 아래 Student 형 배열에 저장
					studentList[idx++] = st;
					// idx++; //회원등록때마다 1회 증가 => 이거 삭제 위에 배열에서 대신 증감

				} // else
				break;

			case 2: // 최대 문제 ...case1의 객체를 어케 여기서 쓸것인가 => 해결
				// 또 다른 문제 : 객체 1개를 번갈아 쓰는거라서 학생 1명만 출력이 됌
				// case 1번을 여기서 반복하게 해야함 => 불가능 결국 객체형 배열을 만들어 따로 저장해야함
				// st는 case1에서 만들어지지만 밖 배열에 저장되므로 사용가능
				for (Student e : studentList) {// e는 객체다!!!
					System.out.println("======================");
					System.out.println("학생번호: " + e.sudentNum);
					System.out.println("이름	: " + e.name);
					System.out.println("학년	: " + e.grade + "학년");
					System.out.println("반	: " + e.classCh + "반");
					System.out.println("======================");
				}
				break;
			case 3:
				System.out.println("시스템을 종료합니다.");
				break ext;

			}// sw

		} // wh

	}// main

}

 

완전한 코드를 만들어냈다 ㅠㅠㅠㅠ 물론 가독성은 떨어지고 더 간단한 방법도 많을테지만

아직 더 배워야하니까~  드디어 해냈다는 만족감이 듬

 

최종 코드:

 

package studentManage;

import java.util.Scanner;

//객체형 배열을 안쓰고 해보기
//case ㄴㄴ if문으로 간다

class Student {
	// 멤버필드 선언
	int studentNum; // 학생고유넘버
	String name;
	int grade; // 1~3학년
	String classCh; // A~C반
	// this 키워드 사용 ?

	public Student() {
		System.out.println(" 기본생성자 미정");
	} // 기본생성자 선언

	// 생성자 각 멤버필드에 (입력한)값을 저장 다 0을 입력하면 초기화 가능
	public Student(int sudentNum, String name, int grade, String classCh) {
		this.studentNum = sudentNum;
		this.name = name;
		this.grade = grade;
		this.classCh = classCh;
	} // 생성자 변경:

	// 멤버필드들을 합쳐서 한개의 문자열로 변환해주는 메소드
	public String toString() {

		String msg = "";
		msg = "학생번호 : " + studentNum + "\n" + "이름 : " + name + "\n" + "학년: " + grade + "학년" + "\n" + "반 : " + classCh
				+ "반" + "\n";
		return msg;
	}

	public static void printInfo(Student st) { // 노쓸모 메소드
		System.out.println("======================");
		System.out.println("학생번호: " + st.studentNum);
		System.out.println("이름	: " + st.name);
		System.out.println("학년	: " + st.grade + "학년");
		System.out.println("반	: " + st.classCh + "반");
		System.out.println("======================");
	}
}

public class StudentSystem {
	public static void main(String[] args) {
		// 필요한 객체를 생성
		// 원활한 객체 사용을 위해 학생 객체를 0으로 초기화함
		Scanner sc = new Scanner(System.in);
		Student ref = new Student(0, null, 0, null); // **초기화가 포인트

		System.out.print("총 학생 인원 수: "); // 학생등록 제한 수
		int total = Integer.parseInt(sc.nextLine());
		int idx = 0; // 학생등록을 한 횟수 0으로 초기화//case1의 조건과 관련 잘 조절
		// 문자열 배열
		String[] stdInfo = new String[total];

		ext: while (true) {
			System.out.println("메뉴: 1번-학생등록 2번-학생정보출력 3번-시스템 종료");
			int menu = Integer.parseInt(sc.nextLine());

			// case2: 최대 문제 ...case1의 객체를 어케 여기서 쓸것인가 => 해결
			// 또 다른 문제 : 객체 1개를 번갈아 쓰는거라서 학생 1명만 출력이 됌
			// case 1번을 case2에서 반복하게 해야함 => 불가능 결국 객체형 배열을 만들어 따로 저장해야함
			// st는 case1에서 만들어지지만 밖 배열에 저장되므로 사용가능
			// switch문 대신 if문으로 바꾸기

			inner: if (menu == 1) {
				if (idx >= total) {
					System.out.println("총 학생의 수를 초과하였습니다. 입력불가");
					break inner;
				} else {
					System.out.println("회원정보를 순서대로 입력하시오");

					try {
						System.out.print("학생번호 : ");
						ref.studentNum = Integer.parseInt(sc.nextLine());
					} catch (NumberFormatException e) {
						System.out.println("정수를 입력하세요. 처음부터 다시 입력합니다.");
						break inner;
					}

					System.out.print("이름 : ");
					ref.name = sc.nextLine();

					try {
						System.out.print("학년 : ");
						ref.grade = Integer.parseInt(sc.nextLine());
					} catch (NumberFormatException e) {
						System.out.println("정수를 입력하세요. 처음부터 다시 입력합니다.");
						break inner;
					}

					System.out.print("반 : ");
					ref.classCh = sc.nextLine();
					// 위에 생성된 객체에 생성된 회원값을 저장 // 입력한 정보를 가진 객체 생성
					Student st = new Student(ref.studentNum, ref.name, ref.grade, ref.classCh);
					ref = st;

					// 객체 -> 문자열 변수로 전환
					String msg = ref.toString(); // 객체의 멤버필드들을 하나의 문자열로 합쳐서 반환해주는 메소드
					// 미리 생성해높은 문자열 배열에 msg를 저장
					stdInfo[idx] = msg;
					idx++;
				} // else1
			} else if (menu == 2) { // st 객체가 안사라지게 하는 방법

				for (String e : stdInfo) {
					System.out.println(e);
				}
				// 이걸 인원수대로 출력되게 해야한다.
			} else if (menu == 3) {
				System.out.println("시스템을 종료합니다.");
				break ext;
			}
		} // wh ext
	} // main
}// pu clas