전체적인 코드
package edu.kh.collection.model.service;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
import edu.kh.collection.model.vo.Student;
public class StudentManagementService {
private Scanner sc = new Scanner(System.in);
private List<Student> stdList = new ArrayList<Student>();
public void displayMenu() { //메뉴 출력
int sel = 0;
do {
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("0. 종료");
System.out.print("메뉴 선택 >> ");
try {
sel = sc.nextInt(); // sel이라는 변수에 입력받기
sc.nextLine(); // 개행문자 제거
switch(sel) {
case 1 : selectAll(); break;
case 2 : addStudent(); break; // 3.예외처리가 여기까지 왔는데 여기는 try-catch문이 있기때문에 예외처리가 가능
case 3 : updateStudent(); break;
case 4 : deleteStudent(); break;
case 5 : searchStudentName(); break;
case 6 : selectIndex(); break;
case 0 : System.out.println("프로그램 종료"); break;
default : System.out.println("메뉴에 있는 번호만 입력해주세요.");
}
}catch (InputMismatchException e) {
System.out.println("정수만 입력해주세요.");
sel = -1; // 맨 처음 sel == 0 인경우 바로 종료되는 것을 방지하기 위해 -1 값 넣기
sc.nextLine(); // 입력버퍼에 남아있는 잘못 입력한 내용 제거
}
}while(sel != 0);
}
//case문들 추가
}
CASE 1
1. 학생 전체 조회 메서드 생성
출력 예상 결과
학생 정보가 있을 경우 : 1번 이름 나이 학년 성별 키
학생 정보가 없을 경우 : "입력된 학생 정보가 없습니다."
private void selectAll() {
System.out.println("[학생 전체 조회]");
// if(stdList == null) -> 컬렉션이 비어있다고 이건 안됨
// -> JAVA에서 null은 참조하는 주소가 없음을 의미. (비어 있다x)
if(stdList.isEmpty() ) { // stdList가 참조하는게 아무것도 없다면 == 비어있다면
System.out.println("입력된 학생 정보가 없습니다. ");
} else { //stdList가 비어있지 않다면
//일반 for문
for(int i = 0; i<stdList.size(); i++) {
// stdList의 i번째 인덱스 요소를 얻어와 Student 참조변수 s에 대입 -> 얕으 ㄴ복사
Student s = stdList.get(i);
System.out.printf("%d번 %s %d세 %d학년\n", i+1, s.getName(), s.getAge(), s.getGrade() );
// i+1 : 0번부터 시작하니깐 +1 해주기
// 위에서 얕은복사를 했기 때문에 stdList.get(i).getName() -> s.getName() ==> 코드길이 감소
}
}
}
➡ ⭐ boolean isEmpty() 메서드
: 컬렉션이 비어 있으면 true, 아니면 false 반환( 자주쓰임!!!)
CASE 2,3 추상화 과정
2,3번 메뉴용 학생 정보 입력 메서드를 따로 만들어서 2,3번 만들때 코드의 중복 막기
private Student inputStudent() throws InputMismatchException{ // 1. addStudent() 로 예외를 던져버린다.
//메서드 수행 중 예외 발생 시 ex) 나이에 십칠세라고 입력된 경우
// 별도의 처리 구문(try- catch)가 없을 경우
// 호출한 메서드로 예외를 던진다. (throws)-- throws는 안써도 되어있지만 명시적(쓰여있다는걸 보여주기위해)_으로 적어줌
System.out.print("이름 : ");
String name = sc.next();
System.out.print("나이 : ");
int age = sc.nextInt();
System.out.print("학년 : ");
int grade = sc.nextInt();
//입력 받은 값을 이용해 Student 객체를 생성 및 초기화한 후 해당 객체의 주소를 반환
return new Student(name, age, grade);
//학생객체 생성하는 객체
}
CASE 2
2. 학생 정보 추가 addStudent()
private void addStudent() throws InputMismatchException{ //2. 던지기해서 얘는 호출한데가 displaymenu의 case2 까지 예외가 던져졌다
System.out.println("[학생 정보 추가]");
// 이름, 나이, 학년을 입력 받아 stdList에 추가
// 입력 받은 값으로 생성한 학생 객체를 반환 받아 stdList에 추가
//stdList는 list니깐 추가하고싶으면 add
stdList.add( inputStudent()); // 학생 객체 반환
}
CASE 3
3. 학생 정보 수정
문제 푸는 방법
이름, 나이, 학년을 입력 받아 특정 index에 있는 학생 정보를 수정
학생 정보가 있는지 먼저 확인 후 수정하기 해당 인덱스에 값이 존재하는가
인덱스 번호를 입력 받아야 한다.
문제를 푸는 방법
1. 인덱스 번호 입력 받기
2. 해당 인덱스가 stdList에 있는지 검사
2-1) 비어있는지 2-2) 음수 입력 확인 2-3) 입력된 인덱스가 stdList범위 내에 있는지 확인
3-1. 인덱스가 있을 경우 학생 정보를 입력 받아 수정
3-2. 인덱스가 없을 경우 "index가 존재하지 않음" 구문 출력
private void updateStudent() throws InputMismatchException{
// 1) 인덱스 번호 입력 받기
System.out.print("수정할 학생의 인덱스 번호 입력 : ");
int inputIndex1 = sc.nextInt();
sc.nextLine(); // 입력 버퍼에서 개행 문자 제거
// 2) 해당 인덱스가 stdList에 있는지 검사
// 2-1) 비어있는지 확인
if(stdList.isEmpty() ) { //학생 정보가 없다면
System.out.println("입력된 학생 정보가 없습니다.");
} else { // 중첩if로 위의 조건은 만족한 상태에서 재조건
// 2-2) 음수 입력 확인
if(inputIndex1 < 0) {
System.out.println("음수는 입력할 수 없습니다.");
}else {
// 2-3) 입력된 인덱스가 stdList 범위 내에 있는지 확인
if( inputIndex1 < stdList.size() ) {
// 3-1) 인덱스가 있을 경우 학생 정보를 입력 받아 수정
stdList.set(inputIndex1, inputStudent());
// -> Student 객체 주소 반환
}else {
// 3-2) 인덱스가 없을 경우 "index가 존재하지 않음" 구문 출력
System.out.println("index가 존재하지 않음");
}
}
}
}
CASE 4
4. 학생 정보 제거
출력 예상 결과
학생 정보가 있을 경우 : 1번 이름 나이 학년 성별 키
학생 정보가 없을 경우 : "입력된 학생 정보가 없습니다."
private void deleteStudent() {
System.out.println("[학생 정보 제거]");
// 인덱스 번호를 입력 받아 해당 인덱스 학생 정보를 삭제
System.out.println("삭제할 학생 인덱스 번호 입력 : ");
int inputIndex = sc.nextInt();
sc.nextLine();
//3과 같은 내용으로 진행하지만 다른 조건 생각해보기
if( !stdList.isEmpty() ) { //stdList가 비어있지 않다면
if( inputIndex >=0) { // 입력 받은 index가 0 또는 양수( 정상범위)
if(inputIndex < stdList.size()) { // 존재하는 index인 경우
stdList.remove(inputIndex);
System.out.println("삭제 되었습니다.");
} else { // 존재하지 않는 index
System.out.println("Index가 존재하지 않는다.");
` }
}else {//음수
System.out.println("음수는 입력할 수 없습니다."); }
} else { //stdList가 비어있다면
System.out.println("입력된 학생 정보가 없습니다.");
}
}
CASE 5
5. 학생 이름 검색
출력 예상 결과
이름을 입력 받아 일치하는 학생의 인덱스 번호, 학생 정보를 출력
없으면 "존재하지 않는 학생입니다" 출력
private void searchStudentName() {
// 1) 이름 입력
System.out.println("검색할 학생 이름 입력 : ");
String inputName = sc.next(); //한글이름은 띄어쓰기가 없으니 next만 해도 되지만 이름에 띄어쓰기 들어가는 경우 nextLine
sc.nextLine();
// 2-1) stdList가 비어있는지 검사
if( !stdList.isEmpty() ) { // stdList가 비어있지 않다면
boolean flag = true; //검색 결과 존재 여부에 대한 신호
// 2-2) 입력 받은 학생이 stdList에 있는지 검사
for(int i =0; i<stdList.size(); i++) {
// 3-1) 있으면 인덱스 + 학생정보 출력
if( inputName.equals ( stdList.get(i).getName() ) ) {
System.out.println("인덱스 번호 : " +i);
System.out.println("조회 시 출력 번호: "+ (i+1));
System.out.println(stdList.get(i)); //자동으로 toString() 메서드 호출
// break; 를 쓰지 않는이유 : 이름이다 보니 동명이인이 있을 수 있기 때문
flag = false;
} //else 문으로 3-2를 쓰면 맞을때까지 검색한 후 나오기 때문에 boolean flag사용
}
//for 문이 끝난 후 flag를 검사하는 if문
// 3-2) 없으면 "존재하지 않는 학생입니다"
if(flag) { //for문 반복 후에도 flag == true인 경우 == 검색 결과 x
System.out.println("존재하지 않는 학생입니다.");
}
} else {
System.out.println("입력된 학생 정보가 없습니다.");
}
} //flag를 바깥으로 빼면 전체 if문의 else문인 입력된 학생정보 없습니다가 같이 출력된다. (에러)
CASE 6
6. 이름, 나이, 학년
private void selectIndex(){
System.out.println("[이름, 나이, 학년이 일치하는 학생 인덱스 조회]");
// 1) 이름, 나이, 학년을 입력 받기
Student std = inputStudent(); //입력받은걸 std에 참조
std.getName(); //입력받은걸 꺼내기
std.getAge();
// 2) stdList에서 세개 모두 일치하는 학생의 인덱스를 출력
boolean flag = true;
for(int i =0; i<stdList.size(); i++) {
// 현재 접근한 stdList의 내부 객체를 s변수로 참조
Student s = stdList.get(i); //현재 참조중인 index번호를 s에 저장한다.
//이름, 나이 , 학년이 일치하는 경우
if( s.getName().equals( std.getName()) &&
s.getAge() == std.getAge() &&
s.getGrade() == std.getGrade() ) {
System.out.println("인덱스 번호 : " + i);
flag = false;
}
} // for end
if(flag) {
System.out.println("일치하는 학생이 존재하지 않습니다.");
}
}
CASE 7
7. 이름, 나이, 학년이 일치하는 학생 인덱스 조회 Ver2
private void selectIndex2() {
System.out.println();
//1) 이름, 나이, 학년 입력
Student std = inputStudent();
// 2) Object.equals() 메서드 -> 오버라이딩
// Student에서 진행
// 테스트
// System.out.println(std.equals( new Student("홍길동", 15, 2)) );
// 3) List. indexOf(Object o) 메서드
// -> 리스트에서 매개변수 o와 같은 객체가 존재하는 index를 반환, 없으면 -1 반환
//같은 객체임을 확인하는 equals() 오버라이딩 필수
// System.out.println(stdList.indexOf(std));
//stdList에 std와 같은 값을 가진 객체의 인덱스 출력
if( stdList.indexOf(std) != -1) {
System.out.println("인덱스 번호 : "+ stdList.indexOf(std));
} else {
System.out.println("일치하는 학생이 존재하지 않습니다.");
}
}
'Backend > 문제 풀이' 카테고리의 다른 글
컬렉션 예제1 _Student, ArrayStudent, CollectionStudent, CollectionRun (0) | 2021.10.04 |
---|---|
[Java] Polymorphism(다형성)_예제 (0) | 2021.09.11 |
[Java] Inheritance(상속) 예제 (0) | 2021.09.08 |
[Java|연습] 2차원 Array(배열)_기초 문제 행,열 합 (0) | 2021.09.02 |
[Java|연습] Array(배열)_lotto(Math.random()) (0) | 2021.09.02 |