1. class Student에 Lombok 적용하기
- app : class StudentEx
package app;
import service.StudentService;
import service.StudentServiceImpl;
import utils.StudentUtil;
public class StudentEx {
public static void main(String[] args) {
StudentService service = new StudentServiceImpl();
// 1. 목록 조회 2. 학생 등록 3. 학생 정보 수정 4. 학생 삭제 5. 종료
for (boolean b = true ; b ;) {
try {
int input = StudentUtil.nextInt("1. 목록 조회 2. 학생 등록 3. 학생 정보 수정 4. 학생 삭제 5. 종료\n", 1, 5);
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;
}
} catch (NumberFormatException e) {
System.out.println("숫자 형식으로 입력해주세요.");
} catch (RuntimeException e) {
System.out.println(e.getMessage());
}
}
}
}
- domain : class Student
package domain;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
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) {
this(no, name, getScore(), getScore(), getScore());
}
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 int sum () {
return kor + eng + mat;
}
public double avg () {
return (int)(sum() / 3d * 100) / 100d;
}
// 점수 랜덤
private static int getScore() {
return (int) (Math.random() * 41) + 60; // 국어, 영어, 수학 점수 랜덤 출력
}
// 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 : interface StudentService
package service;
public interface StudentService {
void list();
void register();
void modify();
void remove();
}
- service : class StudentServiceImpl
package service;
import static utils.StudentUtil.*;
import java.util.ArrayList;
import java.util.List;
import domain.Student;
// 기능 담당
public class StudentServiceImpl implements StudentService {
List<Student> students = new ArrayList<Student>();
{
String[] names = { "김경보", "김동엽", "김상현", "김승종", "김예찬", "김경보", "김태윤" };
for (int i = 0; i < names.length; i++) {
students.add(new Student(22000 + i + 1 + "", names[i]));
}
System.out.println("임시 데이터 초기화 완료");
}
// 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 < students.size(); i++) {
System.out.println(students.get(i));
}
}
// 2. 등록하기
public void register() { // 등록 기능 구현
System.out.println("등록 기능 구현");
students.add(new Student(nextLine("학번 >"), nextLine("이름 >", true),
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("이름 >", true));
student.setKor(nextInt("국어 >"));
student.setEng(nextInt("영어 >"));
student.setMat(nextInt("수학 >"));
}
// 4. 삭제하기
public void remove() {
System.out.println("삭제 기능 구현");
students.remove(findIndexBy(nextLine("삭제할 학생의 학번 >")));
System.out.println("삭제 완료 되었습니다.");
}
private Student findBy (String no) {
Student student = null;
for (Student s : students) {
if (s.getNo().equals(no)) {
student = s;
}
}
return student;
}
private int findIndexBy (String no) {
int ret = -1;
for (int i = 0; i < students.size(); i++) {
if (students.get(i).getNo().equals(no)) {
ret = i;
break;
}
}
return ret;
}
}
- exception : class RangeException
package exception;
public class RangeException extends RuntimeException {
private int start;
private int end;
public RangeException() {
}
public RangeException(int start, int end) {
super(String.format("값의 범위를 %d ~ %d로 지정하세요.", start, end));
this.start = start;
this.end = end;
}
}
- utils : StudentUtil
package utils;
import java.util.Scanner;
import exception.RangeException;
public class StudentUtil {
private static Scanner scanner = new Scanner(System.in);
public static String nextLine(String input) {
return nextLine(input, false);
}
public static String nextLine(String input, boolean korean) {
System.out.print(input);
String str = scanner.nextLine();
if (korean) {
for (int i = 0 ; i < str.length() ; i++) {
if (str.charAt(i) < '가' || str.charAt(i) > '힣') {
throw new RuntimeException("한글로 입력해주세요.");
}
}
}
return str;
}
public static int nextInt(String input) {
return nextInt(input, 0, 100);
}
public static int nextInt(String input, int start, int end) {
int result = Integer.parseInt(nextLine(input));
if (start > result || end < result)
throw new RangeException(start, end);
return result;
}
}