코딩항해기
[실습/JAVA] 학생부에 컬렉션프레임워크 더하기 (+풀이 0715) 본문
기존 진행해오던 학생부 프로그램에 컬렉션 프레임워크를 더해보자.
이번 실습 때 사용할 컬렉션 프레임워크는 ArrayList다.
[풀이 전 코드]
더보기
package class03;
import java.util.ArrayList;
import java.util.Scanner;
class Student {
//필드
private int num;
private String name;
private int score;
//생성자
public Student(int num, String name, int score) {
super();
this.num = num;
this.name = name;
this.score = score;
}
//게터세터
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "Student [num=" + num + ", name=" + name + ", score=" + score + "]";
}
}
public class Test03 {
public boolean isStuEmpty(ArrayList<Student> datas) { //없으면 F 있으면 T
if(datas.isEmpty()) {
System.out.println("학생 데이터가 없습니다.");
System.out.println("먼저 학생 데이터를 추가해주세요.");
return false;
}
return true;
}
public Student searchNum(ArrayList<Student> datas, int num) {
for(Student stu : datas) {
if(stu.getNum() == num) {//번호가 일치한다면
return stu;
}
}
return null;
}
public boolean hasSameName(ArrayList<Student> datas, String name){
boolean flag = false;
for(Student stu : datas) {
if(stu.getName().contains(name)) {//검색어를 포함한다면
System.out.println(stu); //학생출력
flag = true;
}
}
return flag;
}
public boolean isCheckAns(Scanner sc) {
String check = sc.next().toUpperCase();
if(check.equals("Y")) {
return true;
}
return false;
}
public boolean isScoreCheck(int score) {
if(score < 0 || 100 < score) {
System.out.println("성적은 0~100점 사이만 가능합니다.");
return true;
}
return false;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
Test03 t = new Test03();
ArrayList<Student> datas = new ArrayList<>(); //학생부 역할 (배열 역할을 하는 컬렉션 배열리스트)
//샘플데이터
int PK = 1001; //PK는 시스템에서 부여
datas.add(new Student(PK++, "홍길동", 50));
datas.add(new Student(PK++, "아무무", 88));
datas.add(new Student(PK++, "티모", 67));
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. 평균출력");
System.out.println("6. 점수변경");
System.out.println("7. 학생삭제");
System.out.println("0. 프로그램 종료");
System.out.println("=============");
System.out.print("메뉴입력 >> ");
int action=sc.nextInt();
if(action==0) {//종료조건
break;
}
else if(action==1) {//학생추가
System.out.print("이름 입력 >> ");
String name = sc.next();
System.out.print("성적 입력 >> ");
int score = sc.nextInt();
//유효값 검증
// if(t.isScoreCheck(score)) {
// //while(true)가 선행되어야함
// //continue;
// }
//KS 유효성 패스
datas.add(new Student(PK++, name, score));
System.out.println("학생 데이터 추가 완료!");
}
else if(action==2) {//전체출력
//비어있는지 확인
if(!t.isStuEmpty(datas)) {
continue;
}
//출력
System.out.println("******************");
for(Student data : datas) {
System.out.println(data);
}
System.out.println("******************");
}
else if(action==3) {//번호검색 selectOne
//비어있는지 확인
if(!t.isStuEmpty(datas)) {
continue;
}
System.out.print("번호 입력 >> ");
int num = sc.nextInt();
System.out.println("******************");
//일치하는 번호를 가진 학생 출력
Student data = t.searchNum(datas, num);
if(data != null) {
System.out.println(data);
}
else {
System.out.println("해당하는 데이터가 없습니다.");
}
System.out.println("******************");
}
else if(action==4) {//이름검색 selectAll
//비어있는지 확인
if(!t.isStuEmpty(datas)) {
continue;
}
System.out.print("이름 입력 >> ");
String name = sc.next();
System.out.println("******************");
if(!t.hasSameName(datas, name)) {//일치하는 번호가 없다면 있다면 출력됨
System.out.println("해당하는 데이터가 없습니다.");
}
System.out.println("******************");
}
else if(action==5) {//평균출력
//비어있는지 확인
if(!t.isStuEmpty(datas)) {
continue;
}
System.out.println("******************");
int sum = 0;//총합
for(Student stu : datas) {
sum += stu.getScore();//점수 누적
}
double avg = 1.0 * sum / datas.size();//평균
//출력
System.out.println("학생 평균 : "+avg+"점");
System.out.println("******************");
}
else if(action==6) {//점수변경
//비어있는지 확인
if(!t.isStuEmpty(datas)) {
continue;
}
Student result; //번호 조회 결과
while(true) {
System.out.print("번호 입력 >> ");
int num = sc.nextInt();
//종료조건 (검색결과가 있고 해당 학생으로 변경하려고 할때)
result = t.searchNum(datas, num);
if(result != null) {
System.out.print(result.getName()+" 학생의 성적을 변경하시겠습니까? (Y/N) >> ");
if(t.isCheckAns(sc)) {
break;
}
}
else {
System.out.println("해당하는 데이터가 없습니다.");
}
}
int score;//변경할 점수
while(true) {
System.out.print("성적 입력 >> ");
score = sc.nextInt();
//유효값 검증
if(t.isScoreCheck(score)) {
continue;
}
//종료조건
System.out.print(result.getName()+" 학생의 성적을 "+score+"점으로 변경하시겠습니까? (Y/N) >> ");
if(t.isCheckAns(sc)) {
break;
}
}
//성적 수정
result.setScore(score);
System.out.println("변경 완료되었습니다.");
}
else if(action==7) {//학생삭제
//비어있는지 확인
if(!t.isStuEmpty(datas)) {
continue;
}
int num; //사용자 입력값
Student result = null; //번호 조회 결과
while(true) {
System.out.println("(삭제하기를 취소하려면 0)");
System.out.print("번호 입력 >> ");
num = sc.nextInt();
//메뉴로 돌아가기
if(num == 0) {
break;
}
//종료조건 (검색결과가 있고 해당 학생으로 변경하려고 할때)
result = t.searchNum(datas, num);
if(result != null) {
System.out.print(result.getName()+" 학생을 정말 삭제하시겠습니까? (Y/N) >> ");
if(t.isCheckAns(sc)) {
break;
}
}
else {
System.out.println("해당하는 데이터가 없습니다.");
}
}//while
if(num != 0) {
datas.remove(datas.indexOf(result));
System.out.println("삭제되었습니다.");
}
}
else {//menu
System.out.println("잘못된 입력입니다!");
}
}
}
}
(학생클래스 생성, menu(action) 1, 2 번은 공통 진행으로 유효성 검사는 패스함)
[풀이 후기]
이름 검색 파트에서 메소드에서 출력문을 작성하였는데 ArrayList<Student>로 반환하는 방식으로 풀이해주셨다.
그리고 번호 검색과 이름 검색 메소드를 오버로딩으로 묶으셨다.
이러한 부분도 조금 더 신경쓰는 것이 좋을 것 같다.
=> 이 부분에서 중요한 건 반환된 배열을 null값으로 확인하는 것이 아니라 size()가 0보다 큰지, isEmpty인지 봐야한다.
(selectAll 주의점)
(수정한 코드 (메소드/main))
public ArrayList<Student> hasStu(ArrayList<Student> datas, String name){
ArrayList<Student> result = new ArrayList<>();
for(Student stu : datas) {
if(stu.getName().contains(name)) {//검색어를 포함한다면
result.add(stu);
}
}
return result;
}
////////////////////////////////////////////////////////////////////////////
System.out.print("이름 입력 >> ");
String name = sc.next();
System.out.println("******************");
ArrayList<Student> result = t.hasStu(datas, name);
if(result.isEmpty()) {//일치하는 번호가 없다면 있다면 출력됨
System.out.println("해당하는 데이터가 없습니다.");
}
else {
for(Student s : result) {
System.out.println(s);
}
}
System.out.println("******************");
//*****이 없었더라면 데이터 없음 한 뒤 continue해서 for문 뎁스를 한 번 빼주는게 더 좋음!
이런 식으로!
[최종 코드]
package class03;
import java.util.ArrayList;
import java.util.Scanner;
class Student {
//필드
private int num;
private String name;
private int score;
//생성자
public Student(int num, String name, int score) {
super();
this.num = num;
this.name = name;
this.score = score;
}
//게터세터
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() {
return "Student [num=" + num + ", name=" + name + ", score=" + score + "]";
}
}
public class Test03 {
public boolean isStuEmpty(ArrayList<Student> datas) { //없으면 F 있으면 T
if(datas.isEmpty()) {
System.out.println("학생 데이터가 없습니다.");
System.out.println("먼저 학생 데이터를 추가해주세요.");
return false;
}
return true;
}
public Student hasStu(ArrayList<Student> datas, int num) {
for(Student stu : datas) {
if(stu.getNum() == num) {//번호가 일치한다면
return stu;
}
}
return null;
}
public ArrayList<Student> hasStu(ArrayList<Student> datas, String name){
ArrayList<Student> result = new ArrayList<>();
for(Student stu : datas) {
if(stu.getName().contains(name)) {//검색어를 포함한다면
result.add(stu);
}
}
return result;
}
public boolean isCheckAns(Scanner sc) {
String check = sc.next().toUpperCase();
if(check.equals("Y")) {
return true;
}
return false;
}
public boolean isScoreCheck(int score) {
if(score < 0 || 100 < score) {
System.out.println("성적은 0~100점 사이만 가능합니다.");
return true;
}
return false;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Test03 t = new Test03();
ArrayList<Student> datas = new ArrayList<>(); //학생부 역할 (배열 역할을 하는 컬렉션 배열리스트)
//샘플데이터 > 전체출력 > 학생추가
//샘플데이터
int PK = 1001; //PK는 시스템에서 부여
datas.add(new Student(PK++, "홍길동", 50));
datas.add(new Student(PK++, "아무무", 88));
datas.add(new Student(PK++, "티모", 67));
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. 평균출력");
System.out.println("6. 점수변경");
System.out.println("7. 학생삭제");
System.out.println("0. 프로그램 종료");
System.out.println("=============");
System.out.print("메뉴입력 >> ");
int action=sc.nextInt();
if(action==0) {//종료조건
break;
}
else if(action==1) {//학생추가
System.out.print("이름 입력 >> ");
String name = sc.next();
System.out.print("성적 입력 >> ");
int score = sc.nextInt();
//유효값 검증
// if(t.isScoreCheck(score)) {
// //while(true)가 선행되어야함
// //continue;
// }
//KS 유효성 패스
datas.add(new Student(PK++, name, score));
System.out.println("학생 데이터 추가 완료!");
}
else if(action==2) {//전체출력
//비어있는지 확인
if(!t.isStuEmpty(datas)) {
continue;
}
//출력
System.out.println("******************");
for(Student data : datas) {
System.out.println(data);
}
System.out.println("******************");
}
else if(action==3) {//번호검색 selectOne
//비어있는지 확인
if(!t.isStuEmpty(datas)) {
continue;
}
System.out.print("번호 입력 >> ");
int num = sc.nextInt();
System.out.println("******************");
//일치하는 번호를 가진 학생 출력
Student data = t.hasStu(datas, num);
if(data != null) {
System.out.println(data);
}
else {
System.out.println("해당하는 데이터가 없습니다.");
}
System.out.println("******************");
}
else if(action==4) {//이름검색 selectAll
//비어있는지 확인
if(!t.isStuEmpty(datas)) {
continue;
}
System.out.print("이름 입력 >> ");
String name = sc.next();
System.out.println("******************");
ArrayList<Student> result = t.hasStu(datas, name);
if(result.isEmpty()) {//일치하는 번호가 없다면 있다면 출력됨
System.out.println("해당하는 데이터가 없습니다.");
}
else {
for(Student s : result) {
System.out.println(s);
}
}
System.out.println("******************");
//*****이 없었더라면 데이터 없음 한 뒤 continue해서 for문 뎁스를 한 번 빼주는게 더 좋음!
}
else if(action==5) {//평균출력
//비어있는지 확인
if(!t.isStuEmpty(datas)) {
continue;
}
System.out.println("******************");
int sum = 0;//총합
for(Student stu : datas) {
sum += stu.getScore();//점수 누적
}
double avg = 1.0 * sum / datas.size();//평균
//출력
System.out.println("학생 평균 : "+avg+"점");
System.out.println("******************");
}
else if(action==6) {//점수변경
//비어있는지 확인
if(!t.isStuEmpty(datas)) {
continue;
}
/*
변경할 학생 번호 입력받기
변경할 학생 존재 여부 파악하기
없다면 없다고 안내하고 다시 입력받기
있다면 해당 학생으로 정말 변경할 건지 확인하기
변경할 성적 입력받기
성적이 0~100 사이의 값일 때까지 입력받기
입력한 학생과 성적으로 정말 변경할 건지 확인하기
해당 학생 성적 변경하여 저장
변경 완료 되었음을 안내하기
*/
Student result; //번호 조회 결과
while(true) {
System.out.print("번호 입력 >> ");
int num = sc.nextInt();
//종료조건 (검색결과가 있고 해당 학생으로 변경하려고 할때)
result = t.hasStu(datas, num);
if(result != null) {
System.out.print(result.getName()+" 학생의 성적을 변경하시겠습니까? (Y/N) >> ");
if(t.isCheckAns(sc)) {
break;
}
}
else {
System.out.println("해당하는 데이터가 없습니다.");
}
}
int score;//변경할 점수
while(true) {
System.out.print("성적 입력 >> ");
score = sc.nextInt();
//유효값 검증
if(t.isScoreCheck(score)) {
continue;
}
//종료조건
System.out.print(result.getName()+" 학생의 성적을 "+score+"점으로 변경하시겠습니까? (Y/N) >> ");
if(t.isCheckAns(sc)) {
break;
}
}
//성적 수정
result.setScore(score);
System.out.println("변경 완료되었습니다.");
}
else if(action==7) {//학생삭제
//비어있는지 확인
if(!t.isStuEmpty(datas)) {
continue;
}
int num; //사용자 입력값
Student result = null; //번호 조회 결과
while(true) {
System.out.println("(삭제하기를 취소하려면 0)");
System.out.print("번호 입력 >> ");
num = sc.nextInt();
//메뉴로 돌아가기
if(num == 0) {
break;
}
//종료조건 (검색결과가 있고 해당 학생으로 변경하려고 할때)
result = t.hasStu(datas, num);
if(result != null) {
System.out.print(result.getName()+" 학생을 정말 삭제하시겠습니까? (Y/N) >> ");
if(t.isCheckAns(sc)) {
break;
}
}
else {
System.out.println("해당하는 데이터가 없습니다.");
}
}//while
if(num != 0) {
datas.remove(datas.indexOf(result));
System.out.println("삭제되었습니다.");
}
}
else {//menu
System.out.println("잘못된 입력입니다!");
}
}
}
}
[추가 풀이]
datas.remove(datas.indexOf(result));
부분은 정확하지 않기 때문에 for문으로 정확하게 일치하는 값을 찾아 해당 인덱스를 가진 값을 지워주는게 안전하다.
'problem solving > 과제&실습 코딩' 카테고리의 다른 글
[실습/JAVA] 게시판 만들기 (MVC 패턴) (0) | 2024.07.18 |
---|---|
[실습/JAVA] 학생부 최종! MVC 패턴 적용하기 (0) | 2024.07.17 |
[실습/JAVA] 캐릭터와 무기 (+풀이 0712) (0) | 2024.07.12 |
[실습/JAVA] 포켓몬 프로그램에 추상화, 캡슐화 더하기 (2) | 2024.07.12 |
[실습/JAVA] 동물의 숲 주민 만들기 (0) | 2024.07.04 |