클래스 조금 아는 상태에서 회원정보 등록하고, 출력하는 프로그램 만들기
새벽 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