1. package 분리
2. Scanner에서 자주 사용되는 기능 모듈화
package domain;
public class Student {
// toString 정의
public String toString() {
return String.format(" %5s%5s \t %3d \t %3d \t %3d \t %3d \t %2.2f",
no, name, kor, eng, mat, sum(), avg());
}
}
- toString 적용 예시
// toString 적용
public void register() { // 등록 기능 구현
System.out.println("등록 기능 구현");
// 한 줄로 변경
students[cnt++] = new Student(nextLine("학번 >"), nextLine("이름 >"), nextInt("국어 >"), nextInt("영어 >"), nextInt("수학 >"));
System.out.println("정상 등록 되었습니다.");
}
3. 모든 필드에 private 적용(getter/setter 제작 사용)
package domain;
public class Student {
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMat() {
return mat;
}
public void setMat(int mat) {
this.mat = mat;
}
}
4. 삭제 기능 구현
// 4. 삭제하기
public void remove() {
System.out.println("삭제 기능 구현");
// [1, 2, 3, 4, 5] >> 3번학생 삭제시 [1, 2, 4, 5]
int idx = findIndexBy(nextLine("삭제할 학생의 학번 >"));
if (idx == -1) {
System.out.println("존재하지 않는 학번입니다.");
return;
}
System.arraycopy(students, idx + 1, students, idx, cnt-- - idx + 1);
System.out.println("삭제 완료 되었습니다.");
}
private Student findBy (String no) {
int idx = findIndexBy(no);
if (idx == -1) {
return null;
}
return students[idx];
}
private int findIndexBy (String no) {
int ret = -1;
for (int i = 0; i < cnt; i++) {
if (students[i].getNo().equals(no)) {
ret = i;
break;
}
}
return ret;
}
- findBy 활용하여 '수정 기능' 간소화
// 3. 수정하기
public void modify() { // 수정 기능 구현
System.out.println("수정 기능 구현");
// 학번으로 학생을 탐색 후 학생 데이터 중 이름, 국어, 영어, 수학점수를 수정
Student student = findBy(nextLine("수정할 학생의 학번 >"));
if (student == null) {
System.out.println("존재하지 않는 학번입니다");
return;
}
student.setName(nextLine("이름 >"));
student.setKor(nextInt("국어 >"));
student.setEng(nextInt("영어 >"));
student.setMat(nextInt("수학 >"));
}
- app : class StudentEx
package app;
import static utils.StudentUtil.*;
import service.StudentService;
public class StudentEx {
public static void main(String[] args) {
StudentService service = new StudentService();
// 1. 목록 조회 2. 학생 등록 3. 학생 정보 수정 4. 학생 삭제 5. 종료
for (boolean b = true ; b ;) {
int input = nextInt("1. 목록 조회 2. 학생 등록 3. 학생 정보 수정 4. 학생 삭제 5. 종료\n");
switch (input) {
case 1:
System.out.println("목록 조회입니다.");
service.list();
break;
case 2:
System.out.println("학생 등록입니다.");
service.register();
break;
case 3:
System.out.println("학생 정보 수정입니다.");
service.modify();
break;
case 4:
System.out.println("학생 삭제입니다.");
service.remove();
break;
case 5:
System.out.println("종료합니다.");
b = false;
break;
default:
System.out.println("올바른 번호를 입력하세요.");
break;
}
}
}
}
- domain : class Student
package domain;
// VO : Value Object : 값을 저장할 목적의 객체
// source generate
public class Student {
// 필드 : 학번, 이름, 국어, 영어, 수학
private String no;
private String name;
private int kor;
private int eng;
private int mat;
// 생성자
public Student() {
// TODO Auto-generated constructor stub
}
public Student(String no, String name, int kor, int eng, int mat) {
super();
this.no = no;
this.name = name;
this.kor = kor;
this.eng = eng;
this.mat = mat;
}
// 메서드
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMat() {
return mat;
}
public void setMat(int mat) {
this.mat = mat;
}
// 총점, 평균
public int sum () {
return kor + eng + mat;
}
public double avg () {
return (int)(sum() / 3d * 100) / 100d;
}
// toString 정의
public String toString() {
return String.format(" %5s%5s \t %3d \t %3d \t %3d \t %3d \t %2.2f",
no, name, kor, eng, mat, sum(), avg());
}
}
- service : class StudentService
package service;
import static utils.StudentUtil.*;
import app.StudentEx;
import domain.Student;
// 기능 담당
public class StudentService {
Student[] students = new Student[10]; // 학생들
private int cnt; // 학생의 인원수
{
String[] names = { "김경보", "김동엽", "김상현", "김승종", "김예찬", "김경보", "김태윤" };
for (int i = 0; i < names.length; i++) {
students[cnt] = new Student(22000 + cnt + 1 + "", names[cnt], getScore(), getScore(), getScore());
cnt++;
}
System.out.println("임시 데이터 초기화 완료");
}
int getScore() {
return (int) (Math.random() * 41) + 60; // 국어, 영어, 수학 점수 랜덤 출력
}
// 1. 조회하기
public void list() { // 조회 기능 구현
System.out.println("조회 기능 구현");
System.out.printf(" 학번 \t 이름 \t 국어 \t 영어 \t 수학 \t 총점 \t 평균 %n");
System.out.printf("======================================================%n");
for (int i = 0; i < cnt; i++) {
System.out.println(students[i]);
}
}
// 2. 등록하기
public void register() { // 등록 기능 구현
System.out.println("등록 기능 구현");
// 한 줄로 변경
students[cnt++] = new Student(nextLine("학번 >"), nextLine("이름 >"), nextInt("국어 >"), nextInt("영어 >"), nextInt("수학 >"));
System.out.println("정상 등록 되었습니다.");
}
// 3. 수정하기
public void modify() { // 수정 기능 구현
System.out.println("수정 기능 구현");
// 학번으로 학생을 탐색 후 학생 데이터 중 이름, 국어, 영어, 수학점수를 수정
Student student = findBy(nextLine("수정할 학생의 학번 >"));
if (student == null) {
System.out.println("존재하지 않는 학번입니다");
return;
}
student.setName(nextLine("이름 >"));
student.setKor(nextInt("국어 >"));
student.setEng(nextInt("영어 >"));
student.setMat(nextInt("수학 >"));
}
// 4. 삭제하기
public void remove() {
System.out.println("삭제 기능 구현");
// [1, 2, 3, 4, 5] >> 3번학생 삭제시 [1, 2, 4, 5]
int idx = findIndexBy(nextLine("삭제할 학생의 학번 >"));
if (idx == -1) {
System.out.println("존재하지 않는 학번입니다.");
return;
}
System.arraycopy(students, idx + 1, students, idx, cnt-- - idx + 1);
System.out.println("삭제 완료 되었습니다.");
}
private Student findBy (String no) {
int idx = findIndexBy(no);
if (idx == -1) {
return null;
}
return students[idx];
}
private int findIndexBy (String no) {
int ret = -1;
for (int i = 0; i < cnt; i++) {
if (students[i].getNo().equals(no)) {
ret = i;
break;
}
}
return ret;
}
}
- utils : class StudentUtil
package utils;
import java.util.Scanner;
public class StudentUtil {
private static Scanner scanner = new Scanner(System.in);
public static String nextLine(String input) {
System.out.print(input);
return scanner.nextLine();
}
public static int nextInt(String input) {
return Integer.parseInt(nextLine(input));
}
}