코딩항해기

[실습/JAVA] 학생부에 컬렉션프레임워크 더하기 (+풀이 0715) 본문

problem solving/과제&실습 코딩

[실습/JAVA] 학생부에 컬렉션프레임워크 더하기 (+풀이 0715)

miniBcake 2024. 7. 15. 17:12

 

 

 

기존 진행해오던 학생부 프로그램에 컬렉션 프레임워크를 더해보자.

이번 실습 때 사용할 컬렉션 프레임워크는 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문으로 정확하게 일치하는 값을 찾아 해당 인덱스를 가진 값을 지워주는게 안전하다.