며칠 전에도 학생부 프로그램을 만들어보았다.
처음에는 함수를 이용하지 않고, 두번째에는 함수를 이용해서 만들었다.
JAVA 함수를 이용해서 학생부 프로그램 만들기
아래는 함수를 이용하지 않고 MAIN에다가 전부 입력해서 프로그램을 만들어놓은 예시이다.import java.util.Scanner;public class Test01 { public static void main(String[] args) { String[] datas = new String[5]; Scanner sc=new Sc
yn98.tistory.com
이번에는 조금 더 업그레이드 해서 학생부를 학생데이터로 이용해서 만들어보았다. (CRUD)
요구사항은 이렇다.
<<< CRUD 정의하기>>>
C 학생추가
R 학생 전체 목록 출력 selectAll
학생PK를 검색해서 출력 selectOne
학생이름으로 검색해서 출력 selectAll
1등출력 selectAll
등급으로출력 selectAll
U 재시험을 봐서 성적에 변화가 생긴 경우
샘플데이터 >> 전체출력 >> CREATE 데이터를 추가
System.out.println("===== 메 뉴 =====");
System.out.println("1. 학생추가"); // 학생이름, 점수
System.out.println("2. 전체목록출력");
System.out.println("3. 번호검색"); // 번호 입력받기
System.out.println("4. 이름검색"); // 이름 입력받기
System.out.println("5. 1등출력"); // 1등 출력(동점자 있으면 동점자도 함께 출력)
System.out.println("6. 등급검색"); // 등급 입력받기
System.out.println("7. 재시험"); // 7번 입력 시 10점 추가
System.out.println("0. 프로그램 종료");
System.out.println("===============");
아래는 위에 요구사항에 따라 내가 짜본 코드이다.
package class05;
import java.util.Scanner;
class Student {
int num;
String name;
int score;
char grade;
Student(int num,String name){
this(num,name,0);
}
Student(int num,String name,int score){
this.num=num;
this.name=name;
this.score=score;
this.grade='C';
if(this.score>=80) {
this.grade='A';
}
else if(this.score>=60) {
this.grade='B';
}
}
void printInfo() {
System.out.println(this.num+"번 "+this.name+" "+this.score+"점 "+this.grade+"등급");
}
char calculateGrade(int score) {
if (this.score >= 80) {
return 'A';
} else if (this.score >= 60) {
return 'B';
} else {
return 'C';
}
}
void retakeExam() {
this.score += 10; // 점수 10점 추가
this.grade = calculateGrade(this.score); // 등급 재계산
}
}
public class Test01 {
public static boolean isEmpty(int cnt) {
if(cnt<=0) {// 아직 저장된 학생 데이터가 전혀 없을때
System.out.println("데이터가 없습니다!");
return true;
}
return false;
}
public static boolean isFull(int cnt,Student[] datas) {
if(cnt>=datas.length) {// 더 이상 학생 데이터를 저장할 수 없을때
System.out.println("저장가능한 공간이 없습니다!");
return true;
}
return false;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int PK=1001; // 시스템에서 부여하는 PK값
int cnt=0; // 현재 배열에 저장된 데이터의 개수
Student[] datas=new Student[3];
datas[0]=new Student(PK++,"티모",50);
cnt++;
while(true) {
System.out.println("===== 메 뉴 =====");
System.out.println("1. 학생추가");
System.out.println("2. 전체목록출력");
System.out.println("3. 번호검색");
System.out.println("4. 이름검색");
System.out.println("5. 1등출력");
System.out.println("6. 등급검색");
System.out.println("7. 재시험");
System.out.println("0. 프로그램 종료");
System.out.println("===============");
System.out.print("메뉴 입력 >> ");
int menu=sc.nextInt();
if(menu==0) {
System.out.println("프로그램을 종료합니다.");
break;
}
else if(menu==1) { // 학생추가
if(isFull(cnt,datas)) {
continue;
}
String name;
int score;
while(true) {
System.out.print("이름 입력 >> ");
name=sc.next();
System.out.print("정말로? (Y/N) >> ");
String ans=sc.next();
if(ans.equals("Y")) {
break;
}
}
while(true) {
System.out.print("성적 입력 >> ");
score=sc.nextInt();
if(0<=score && score<=100) {
break;
}
}
datas[cnt++]=new Student(PK++,name,score);
}
else if(menu==2) { // 전체목록출력
if(isEmpty(cnt)) {
continue;
}
System.out.println("===============");
for(int i=0;i<cnt;i++) {
// datas == 배열 == 학생부
// datas[i] == 배열의 요소 == 학생
// datas[i].num == 학생.번호 == 학생의 번호
datas[i].printInfo();
}
System.out.println("===============");
}
else if(menu==3) { //번호 검색/
// pk
if(isEmpty(cnt)) {
continue;
}
int num;
while(true) {
System.out.print("검색할 학생 번호 입력 >> ");
num = sc.nextInt();
if(1001<=num && num<2000) {
break;
}
}
boolean flag = false;
for(int i=0; i<cnt;i++) {
if(datas[i].num ==num) {
flag = true;
datas[i].printInfo();
}
}
if(!flag) {
System.out.println("검색결과가 없습니다...");
}
// int searchNum = sc.nextInt();
// if (searchNum <= 0 || searchNum > cnt) {
// System.out.println("잘못된 학생 번호입니다. 다시 입력해주세요.");
// continue;
// }
// System.out.println(datas[searchNum-1].num+"번 "+datas[searchNum-1].name+" "+datas[searchNum-1].score+"점 "+datas[searchNum-1].grade+"등급");
}
else if(menu==4) { // 이름검색
// 이름
if(isEmpty(cnt)) {
continue;
}
System.out.print("검색할 학생 이름 입력 >> ");
String searchName = sc.next();
boolean flag = false;
for(int i=0;i<cnt;i++) {
if(datas[i].name.equals(searchName)) {
datas[i].printInfo();
flag = true;
break;
}
}
if(!flag) {
System.out.println("해당 이름의 학생을 찾을 수 없습니다!");
}
}
else if(menu==5) { // 1등출력
// 1등
if(isEmpty(cnt)) {
continue;
}
Student topStudent = datas[0];
for (int i = 1; i < cnt; i++) {
if (datas[i].score > topStudent.score) {
topStudent = datas[i];
}
}
System.out.print("1등 학생: ");
topStudent.printInfo();
}
else if(menu==6) { // 등급검색
// 등급
if(isEmpty(cnt)) {
continue;
}
System.out.print("검색할 등급 입력 (A, B, C) >> ");
char grade = sc.next().charAt(0);
boolean flag = false;
for (int i = 0; i < cnt; i++) {
if (datas[i].grade == grade) {
datas[i].printInfo();
flag = true;
}
}
if (!flag) {
System.out.println("해당 등급의 학생을 찾을 수 없습니다.");
}
}
else if(menu==7) { // 재시험 - 10점 +
if(isEmpty(cnt)) {
continue;
}
for (int i = 0; i < cnt; i++) {
if (datas[i].score < 60) {
datas[i].retakeExam(); // 재시험 메서드 호출
// System.out.println(datas[i].num + "번 " + datas[i].name + "의 재시험 결과: " + datas[i].score + "점 " + datas[i].grade + "등급");
datas[i].printInfo();
}
}
} else {
System.out.println("잘못된 입력입니다!");
}
}
}
}
막히는 부분은 내 소울메이트인 ChatGPT를 이용하였다.
아래는 강사님의 예시 답안이다.
package class01;
import java.util.Random;
import java.util.Scanner;
class Student {
int num;
String name;
int score;
char grade;
Student(int num,String name){
this(num,name,0);
}
Student(int num,String name,int score){
this.num=num;
this.name=name;
this.score=score;
this.setGrade();
}
void printInfo() {
System.out.println(this.num+"번 "+this.name+" "+this.score+"점 "+this.grade+"등급");
}
// 학생 1명이 재시험을 봄 ==>>> 메서드
// 60 -> 60~100 랜덤 점수로 변경됨 : 경계값 검사
void test() {
Random rand=new Random();
/*
10 >> 10~100 -> 91 랜덤정수의 개수=101-현재점수
20 >> 20~100 -> 81
90 >> 90~100 -> 11
.nextInt(100) // 0~99
.nextInt(100)+1 // 1~100
*/
this.score=rand.nextInt(101-this.score)+this.score;
this.setGrade();
}
void setGrade() {
this.grade='C';
if(this.score>=80) {
this.grade='A';
}
else if(this.score>=60) {
this.grade='B';
}
}
}
public class Test01 {
public static boolean isEmpty(int cnt) {
if(cnt<=0) {
System.out.println("데이터가 없습니다!");
return true;
}
return false;
}
public static boolean isFull(int cnt,Student[] datas) {
if(cnt>=datas.length) {
System.out.println("저장가능한 공간이 없습니다!");
return true;
}
return false;
}
public static int firstScore(Student[] datas,int cnt) {
int pivot = datas[0].score;
for(int i=1;i<cnt;i++) {
if(pivot < datas[i].score) {
pivot = datas[i].score;
}
}
return pivot;
}
public static boolean isRight(char grade) {
if(grade=='A' || grade=='B' || grade=='C') {
return true;
}
return false;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int PK=1001; // 시스템에서 부여하는 PK값
int cnt=0; // 현재 배열에 저장된 데이터의 개수
Student[] datas=new Student[3];
datas[0]=new Student(PK++,"티모",50);
cnt++;
while(true) {
System.out.println("===== 메 뉴 =====");
System.out.println("1. 학생추가");
System.out.println("2. 전체목록출력");
System.out.println("3. 번호검색");
System.out.println("4. 이름검색");
System.out.println("5. 1등출력");
System.out.println("6. 등급검색");
System.out.println("7. 재시험");
System.out.println("0. 프로그램 종료");
System.out.println("===============");
System.out.print("메뉴 입력 >> ");
int menu=sc.nextInt();
if(menu==0) {
break;
}
else if(menu==1) { // 학생추가
if(isFull(cnt,datas)) {
continue;
}
String name;
int score;
while(true) {
System.out.print("이름 입력 >> ");
name=sc.next();
System.out.print("정말로? (Y/N) >> ");
String ans=sc.next();
if(ans.equals("Y")) {
break;
}
}
while(true) {
System.out.print("성적 입력 >> ");
score=sc.nextInt();
if(0<=score && score<=100) {
break;
}
}
datas[cnt++]=new Student(PK++,name,score);
}
else if(menu==2) { // 전체목록출력
if(isEmpty(cnt)) {
continue;
}
System.out.println("===============");
for(int i=0;i<cnt;i++) {
// datas == 배열 == 학생부
// datas[i] == 배열의 요소 == 학생
// datas[i].num == 학생.번호 == 학생의 번호
datas[i].printInfo();
}
System.out.println("===============");
}
else if(menu==3) { // 번호검색
if(isEmpty(cnt)) {
continue;
}
int num;
while(true) {
System.out.print("검색할 학생의 번호 입력 >> ");
num=sc.nextInt();
if(1001<=num && num<2000) {
break;
}
}
boolean flag=false;
for(int i=0;i<cnt;i++) {
if(datas[i].num == num) {
// 현재 살펴보고있는 학생.번호 == 사용자가 입력한 번호
flag=true;
datas[i].printInfo();
}
}
if(!flag) {
System.out.println("검색결과가 없습니다...");
}
}
else if(menu==4) { // 이름검색
if(isEmpty(cnt)) {
continue;
}
System.out.print("검색어 입력 >> ");
String searchKeyword=sc.next();
// 검색어 : searchKeyword,searchContent,sk,sc
// 유효성 검사 x
boolean flag=false;
for(int i=0;i<cnt;i++) {
if(datas[i].name.contains(searchKeyword)) {
// 학생부에 저장되어있는 학생의 이름안에 검색어가 있어?
datas[i].printInfo();
flag=true;
}
}
if(!flag) {
System.out.println("검색결과가 없습니다...");
}
}
else if(menu==5) { // 1등출력 -->>> selectAll
if(isEmpty(cnt)) {
continue;
}
// 1등의 점수
// : 함수
int score=firstScore(datas,cnt); // 1등의 점수를 함수로 찾아냄
for(int i=0;i<cnt;i++) {
if(score==datas[i].score) {
datas[i].printInfo();
}
}
// 해당 점수인 학생을 모두 출력
// : 1명은 메서드 --->> .printInfo()
// : N명은 함수
}
else if(menu==6) { // 등급검색
if(isEmpty(cnt)) {
continue;
}
char grade;
while(true) {
System.out.print("등급 입력 >> ");
grade=sc.next().charAt(0);
if(isRight(grade)) {
break;
}
}
boolean flag=false;
for(int i=0;i<cnt;i++) {
if(datas[i].grade==grade) {
datas[i].printInfo();
flag=true;
}
}
if(!flag) {
System.out.println("검색결과가 없습니다...");
}
}
else if(menu==7) { // 재시험
if(isEmpty(cnt)) {
continue;
}
// 전체 학생들이 재시험을 봅니다.
for(int i=0;i<cnt;i++) {
datas[i].test();
}
}
else {
System.out.println("잘못된 입력입니다!");
}
}
}
}
예전에 비해서 많이 발전했지만, 중요한 부분을 조금 놓쳤다.
1. 주석을 통해 코드가독성을 늘리는 것이 부족했다.
2. 함수 이용이 아직은 덜 익숙하다.
3. '5번'메뉴에 다른 이름 같은 점수인 경우를 고려하지 않았다.
4. 요구사항 제대로 확인 안한 점.
메뉴 7번은 바로 위에 코드는 조금 응용을 해서 랜덤값을 올리는것으로 한 차이이다.
.contains() 와 .equals()의 차이, 함수 관련 지식 이해도를 위 코드를 통해 이해하게 되었다.
'JAVA' 카테고리의 다른 글
JAVA 오버라이딩 + 예제 (2) | 2024.07.03 |
---|---|
JAVA 상속, super() + 예제 (0) | 2024.07.03 |
JAVA 오버로딩 실습 (0) | 2024.07.02 |
JAVA - static, final 키워드 (0) | 2024.07.02 |
JAVA 메서드 오버로딩 (0) | 2024.07.02 |