seunghyun Note

JAVA 성적 DTO 만들기 본문

스터디/JAVA

JAVA 성적 DTO 만들기

승숭슝현 2024. 1. 5. 09:21
728x90
반응형

파일 구조 

 sungJuk
    ├── SungJuk.java
    ├── SungJukDTO.java
    ├── SungJukDelete.java
    ├── SungJukInsert.java
    ├── SungJukMain.java
    ├── SungJukPrint.java
    ├── SungJukService.java
    ├── SungJukSort.java
    └── SungJukUpdate.java

혼자 끄적인 구조도😂

그림을 그렸지만... 나만 이해가 된다

 


SungJukMain.java

리모콘의 전원 ▶️ 같은 느낌이다. menu 버튼을 누르면 서비스가 시작 된다.

public class SungJukMain {

	public static void main(String[] args) {

		SungJukService sungJukservice = new SungJukService();
		sungJukservice.menu();
	}

}

SungJukService.java

리모콘의 번호키 부분이다. 

번호키를 while문에 넣어서 작동시키고 

버튼을 누르기 전에 정보를 준다(SungJukDTO)

package sungJuk;

import java.util.ArrayList;
import java.util.Scanner;

public class SungJukService {

	private ArrayList<SungJukDTO> list = new ArrayList<SungJukDTO>();

	SungJuk sungJuk = null;

	public void menu() {
		Scanner sc = new Scanner(System.in);
		boolean run = true;
		while (run) {
			System.out.println("****************");
			System.out.println("	1. input");
			System.out.println("	2. print");
			System.out.println("	3. modify");
			System.out.println("	4. delete");
			System.out.println("	5. sort");
			System.out.println("	6. exit");
			System.out.println("****************");
			System.out.println(" number : ");
			int num = sc.nextInt();
			switch (num) {
			case 1:
				sungJuk = new SungJukInsert();
				break;
			case 2:
				sungJuk = new SungJukPrint();
				break;
			case 3:
				sungJuk = new SungJukUpdate();
			case 4:
				sungJuk = new SungJukDelete();
				break;
			case 5:
				sungJuk = new SungJukSort();
			case 6:
				System.out.println("프로그램 종료");
				run = false;
				break;
			}
			sungJuk.execute(list);

		}
	}
}

SungJukDTO.java

information 부분이다. 

나중에 list를 그냥 출력하면 코드가 길어지기때문에 toString을 override해서 수정해놨다.

package sungJuk;

public class SungJukDTO {
	private String no;
	private String name;
	private int kor;
	private int eng;
	private int mat;
	private int tot;
	private float avg;

	public SungJukDTO(String no, String name, int kor, int eng, int mat, int tot, float avg) {
		this.no = no;
		this.name = name;
		this.kor = kor;
		this.eng = eng;
		this.mat = mat;
		this.tot = tot;
		this.avg = avg;

	}

	public void setNo(String no) {
		this.no = no;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setKor(int kor) {
		this.kor = kor;
	}

	public void setEng(int eng) {
		this.eng = eng;
	}

	public void setMat(int mat) {
		this.mat = mat;
	}

	public void setTot(int tot) {
		this.tot = tot;
	}

	public void setAvg(float avg2) {
		this.avg = avg2;
	}

	@Override
	public String toString() {
		return no + "\t" + name + "\t" + kor + "\t" + eng + "\t" + mat + "\t" + tot + "\t" + String.format("%.2f", avg);
	}
}

SungJuk.java (interface)

인터페이스이다.

interface를 사용해서 나중에 기능들을 override해서 같은 함수 내에 다른 기능을 부여한다.

package sungJuk;

import java.util.ArrayList;

public interface SungJuk {

	public void execute(ArrayList<SungJukDTO> list);
}

Function part

1. 삽입 : SungJukInsert.java

2. 출력 : SungJukPrint.java

3. 삭제 : SungJukDelete.java

4. 수정 : SungJukUpdate.java

5. 정렬 : SungJukSort.java

6. 종료

 

삽입 : SungJukInsert.java

tot, avg를 function 내에서 값을 계산

생성자에 값을 대입

package sungJuk;

import java.util.ArrayList;
import java.util.Scanner;

public class SungJukInsert implements SungJuk {

	private String no;
	private String name;
	private int kor;
	private int eng;
	private int mat;
	private int tot;
	private float avg;

	public SungJukInsert() {
		Scanner sc = new Scanner(System.in);

		System.out.print("번호 입력 : ");
		no = sc.next();
		System.out.print("이름 입력 : ");
		name = sc.next();
		System.out.print("국어 입력 : ");
		kor = sc.nextInt();
		System.out.print("영어 입력 : ");
		eng = sc.nextInt();
		System.out.print("수학 입력 : ");
		mat = sc.nextInt();
		tot = kor + eng + mat;
		avg = tot / 3;

	}

	@Override
	public void execute(ArrayList<SungJukDTO> list) {
		SungJukDTO sungJukDTO = new SungJukDTO(no, name, kor, eng, mat, tot, avg);

		list.add(sungJukDTO);
	}

}

 

출력: SungJukPrint.java

SungJukDTO를 이용해 반복문으로 순회시켜 출력

package sungJuk;

import java.util.ArrayList;

public class SungJukPrint implements SungJuk {

	@Override
	public void execute(ArrayList<SungJukDTO> list) {
		// TODO Auto-generated method stub

		for (SungJukDTO sungJukDTO : list) {
			System.out.println(sungJukDTO);
		}
	}
	
	public SungJukPrint() {

	}

}

 

삭제: SungJukDelete.java

list로 지우면 error..

Iterator에 list를 할당에서 remove()함수를 사용해 지운다.

ConcurrentModificationException은 자바에서 발생하는 예외 중 하나이다. 이것을 예방하기 위해 Iterator를 사용한다.
이 예외는 변경 동시 수정 예외 로 , 어떤 컬렉션을 반복 중에 그 구조를 수정하려고 할 때 발생한다.

즉 list로 그냥 해버리면 순회 도중에 구조가 변경 되기 때문에 ConcurrentModificationException 이 발생하기 때문에 Iterator를 사용해서 리스트의 요소를 안전하게 삭제할 수 있다.

문제를 피하는 방법은 삭제할 요소들을 모아두었다가 순회가 끝난 후 한꺼번에 삭제하는 방법도 있다. (번거로움)

cnt++를 추가해서 중복된 값들이 몇개인지 체크하기!

package sungJuk;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

public class SungJukDelete implements SungJuk {

	private String name;

	@Override
	public void execute(ArrayList<SungJukDTO> list) {
		Scanner sc = new Scanner(System.in);
		int cnt = 0;
		boolean found = false;

		Iterator<SungJukDTO> iterator = list.iterator();
		while (iterator.hasNext()) {
			SungJukDTO sungJukDTO = iterator.next();
			if (sungJukDTO.getName().equals(name)) {
				iterator.remove(); 
				cnt++;
				found = true;
			}
		}

		if (!found)
			System.out.println("회원의 정보가 없습니다.");
		else
			System.out.println(cnt + "건의 항목을 삭제하였습니다.");
	}

	public SungJukDelete() {
		Scanner sc = new Scanner(System.in);
		System.out.print("이름 입력 : ");
		name = sc.next();
	}
}

 

수정: SungJukUpdate.java

equals ()를 사용하여 같은 번호를 찾고 수정한다.

수정할 때는 SungJukDTO에 있는 setFunction()을 사용한다.

package sungJuk;

import java.util.ArrayList;
import java.util.Scanner;

public class SungJukUpdate implements SungJuk {

	private String no;
	private String name;
	private int kor;
	private int eng;
	private int mat;
	private int tot;
	private float avg;

	@Override
	public void execute(ArrayList<SungJukDTO> list) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		boolean found = false;
		for (SungJukDTO sungJukDTO : list) {
			if (sungJukDTO.getNo().equals(no)) {
				found = true;
				System.out.print("수정할 이름 입력 : ");
				name = sc.next();
				sungJukDTO.setName(name);
				System.out.print("수정할 국어 입력 : ");
				kor = sc.nextInt();
				sungJukDTO.setKor(kor);
				System.out.print("수정할 영어 입력 : ");
				eng = sc.nextInt();
				sungJukDTO.setEng(eng);
				System.out.print("수정할 수학 입력 : ");
				mat = sc.nextInt();
				sungJukDTO.setMat(mat);
				tot = kor + eng + mat;
				avg = tot / 3;
				sungJukDTO.setTot(tot);
				sungJukDTO.setAvg(avg);
			}
		}
		if (!found)
			System.out.println("해당 번호가 없습니다.");
	}

	public SungJukUpdate() {

		Scanner sc = new Scanner(System.in);
		System.out.print("번호 입력 : ");
		no = sc.next();

	}

}

 

정렬정렬 : SungJukSort.java

아직도 이해가 잘 되지는 않지만 Comparator를 사용한다

package sungJuk;

import java.util.ArrayList;
import java.util.Comparator;

public class SungJukSort implements SungJuk {

	@Override
	public void execute(ArrayList<SungJukDTO> list) {
		list.sort(Comparator.comparing(SungJukDTO::getName)); // 이름에 대해 오름차순으로 정렬

		// 정렬된 결과 출력
		for (SungJukDTO sungJukDTO : list) {
			System.out.println(sungJukDTO);
		}
	}

	public SungJukSort() {
	}
}

 

728x90
반응형

'스터디 > JAVA' 카테고리의 다른 글

DB 연결을 통한 학교 관리 시스템  (0) 2024.01.11
JAVA 자동 Calendar 만들기  (3) 2024.01.04