문제) 성적 처리 -> ArrayList 컬렉션, RecordDTO 클래스 이용. 메뉴 구성 추가
여러명의 이름, 국어, 영어, 수학 입력 받아서 총점, 평균 계산해서 출력. 출력시 이름 오름차순 정렬해서 출력.
실행 예)
======== 성적 처리 ==============
1. 성적 입력
2. 성적 전체 출력
3. 이름 검색 출력
4. 성적 수정
5. 성적 삭제
선택(1~5, -1 종료)->1
1번 학생 성적 입력(이름 국어 영어 수학)?park 80 75 60
2번 학생 성적 입력(이름 국어 영어 수학)?hong 100 90 80
3번 학생 성적 입력(이름 국어 영어 수학)?kim 80 85 80
4번 학생 성적 입력(이름 국어 영어 수학)?-1
======== 성적 처리 ==============
1. 성적 입력
2. 성적 전체 출력
3. 이름 검색 출력
4. 성적 수정
5. 성적 삭제
선택(1~5, -1 종료)->2
이름 국어 영어 수학 총점 평균
hong 100 90 80 XXX XXX.X
kim 80 85 80 XXX XXX.X
park 80 75 60 XXX XXX.X
======== 성적 처리 ==============
1. 성적 입력
2. 성적 전체 출력
3. 이름 검색 출력
4. 성적 수정
5. 성적 삭제
선택(1~5, -1 종료)->3
검색하려는 이름?kim
이름 국어 영어 수학 총점 평균
kim 80 85 80 XXX XXX.X
======== 성적 처리 ==============
1. 성적 입력
2. 성적 전체 출력
3. 이름 검색 출력
4. 성적 수정
5. 성적 삭제
선택(1~5, -1 종료)->3
검색하려는 이름?choi
검색 결과가 없습니다.
======== 성적 처리 ==============
1. 성적 입력
2. 성적 전체 출력
3. 이름 검색 출력
4. 성적 수정
5. 성적 삭제
선택(1~5, -1 종료)->-1
프로그램이 종료되었습니다.
//ScoreDTO.java
//Process.java
//Class70.java
package com.test;
public class ScoreDTO {
//자료 처리 전용 클래스
private int kor, eng, mat, total;
private double avg;
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return 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 getTotal() {
total = getKor() + getEng() + getMat();
return total;
}
public double getAvg() {
avg = getTotal() / 3.0;
return avg;
}
}
package com.test;
import java.util.*;
public class Process {
//메뉴별 액션 처리
//컬렉션 멤버변수 처리(현재 초기화 수식으로 초기화 한것)
private ArrayList<ScoreDTO> lists = new ArrayList<ScoreDTO>();
Scanner sc = new Scanner (System.in);
public void menuInsert() {
int a = lists.size();
do{
System.out.printf("%d번 학생 성적 입력(이름 국어 영어 수학)?", ++a);
String name = sc.next();
if(name.equals("-1")) {
break;
}
int kor = sc.nextInt();
int eng = sc.nextInt();
int mat = sc.nextInt();
ScoreDTO obj = new ScoreDTO();
obj.setName(name);
obj.setKor(kor);
obj.setEng(eng);
obj.setMat(mat);
lists.add(obj);
}while(true);
}
public void menuSelect() {
//익명클래스는 인터페이스의 객체 생성이 불가능하므로 추가적인 클래스 생성 없이 짧은 코딩으로 해결하기 위해
//아래의 용법처럼 사용함. 익명클래스는 거의 이럴때만 사용되므로 별로도 암기 ㅇㅇ
Comparator<ScoreDTO> comp = new Comparator<ScoreDTO>() {
@Override
public int compare(ScoreDTO o1, ScoreDTO o2) {
//compareTo() 메소드는 문자열 비교하여 1 아니면 -1을 리턴함.
return o1.getName().compareTo(o2.getName()); // 앞 뒤를 비교하여 abc 순으로 정렬함.
}
};
Collections.sort(lists, comp);
System.out.println("-----------------------------------");
System.out.printf("전체 회원수: %d 명%n", lists.size());
System.out.println("-----------------------------------");
System.out.println("이름 국어 영어 수학 총점 평균");
System.out.println("-----------------------------------");
for (ScoreDTO obj : lists) {
System.out.printf("%4s %5d %5d %5d %5d %.1f%n", obj.getName()
, obj.getKor()
, obj.getEng()
, obj.getMat()
, obj.getTotal()
, obj.getAvg());
}
System.out.println("-----------------------------------");
}
public void menuSearch() {
System.out.print("검색하려는 이름?");
String name = sc.next();
System.out.println("-----------------------------------");
System.out.println("이름 국어 영어 수학 총점 평균");
System.out.println("-----------------------------------");
StringBuilder sb = new StringBuilder();
for (ScoreDTO obj : lists) {
if(obj.getName().equals(name)) {
sb.append(String.format("%4s %5d %5d %5d %5d %.1f%n", obj.getName()
, obj.getKor()
, obj.getEng()
, obj.getMat()
, obj.getTotal()
, obj.getAvg()));
}
}
if (sb.length() > 0) {
System.out.print(sb.toString());
} else {
System.out.println("검색결과가 없습니다.");
}
System.out.println("-----------------------------------");
}
public void menuUpdate() {
//생략
}
public void menuDelete() {
//생략
}
}
package com.test;
import java.util.Scanner;
public class Class70 {
//화면상 메뉴 출력.
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Process process = new Process();
do{
System.out.println();
System.out.println();
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.print("선택(1~5, -1 종료)->");
int menu = sc.nextInt();
if (menu == -1) {
System.out.println("프로그램을 종료합니다.");
break;
}
switch (menu) {
case 1: process.menuInsert(); break;
case 2: process.menuSelect(); break;
case 3: process.menuSearch(); break;
case 4: process.menuUpdate(); break;
case 5: process.menuDelete(); break;
}
}while(true);
}
}
이름과 전화번호를 저장할 수 있는 자료형 만들기.
MemberDTO 클래스, ArrayList 컬렉션
출력시 이름 오름차순 출력
======= 회원 관리 ========
1. 회원 입력
2. 회원 전체 출력
3. 이름 검색 출력
실행 예)
이름 전화번호(1)?홍길동 010-123-1234
이름 전화번호(2)?김길동 010-222-3333
--------------------
이름 전화번호
--------------------
홍길동 010-123-1234
김길동 010-222-3333
--------------------
//문제임 알아서 풀어보세용~ㅋㅋ
ScoreDAO, ScoreDTO 클래스.
ArrayList 컬렉션
======== 성적 처리 ==============
1. 성적 입력
2. 성적 전체 출력
3. 이름 검색 출력
4. 성적 수정
5. 성적 삭제
선택(1~5, -1 종료)->3
//ScoreDTO.java -> 자료 처리 전용 클래스
//ScoreDAO.java -> 데이터 엑세스 전용 클래스
//Process2.java -> 메뉴 액션 처리 전용 클래스
//Class72.java -> main() 메소드 추가. 메뉴 출력
package com.test;
public class ScoreDTO {
//자료 처리 전용 클래스
private int kor, eng, mat, total;
private double avg;
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return 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 getTotal() {
total = getKor() + getEng() + getMat();
return total;
}
public double getAvg() {
avg = getTotal() / 3.0;
return avg;
}
}
package com.test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class ScoreDAO {
//데이터 액세스 전용 클래스
//-> 데이터 저장소(컬렉션)에 데이터를 입력하거나 출력하는 전용 클래스
private ArrayList<ScoreDTO> lists = new ArrayList<ScoreDTO>();
public int count() {
return this.lists.size();
}
public void setMember(ScoreDTO dto) {
lists.add(dto);
}
//컬렉션의 내용중 이름을 기준으로 정렬하는 메소드
public void sort() {
Comparator<ScoreDTO> comp = new Comparator<ScoreDTO>() {
@Override
public int compare(ScoreDTO o1, ScoreDTO o2) {
//compareTo() 메소드는 문자열 비교하여 1 아니면 -1을 리턴함.
return o1.getName().compareTo(o2.getName()); // 앞 뒤를 비교하여 abc 순으로 정렬함.
}
};
Collections.sort(lists, comp);
}
public ArrayList<ScoreDTO> getLists() {
return lists;
}
//메소드 오버로딩
public ArrayList<ScoreDTO> getLists(String name) {
ArrayList<ScoreDTO> result = new ArrayList<ScoreDTO>();
for(ScoreDTO obj : lists) {
if (obj.getName().equals(name)) {
result.add(obj);
}
}
return result;
}
}
package com.test;
import java.util.Scanner;
public class Process2 {
//메뉴별 액션 처리
//컬렉션 멤버변수 처리(현재 초기화 수식으로 초기화 한것)
Scanner sc = new Scanner (System.in);
ScoreDAO dao = new ScoreDAO();
public void menuInsert() {
int a = dao.count();
do{
System.out.printf("%d번 학생 성적 입력(이름 국어 영어 수학)?", ++a);
String name = sc.next();
if(name.equals("-1")) {
break;
}
int kor = sc.nextInt();
int eng = sc.nextInt();
int mat = sc.nextInt();
ScoreDTO obj = new ScoreDTO();
obj.setName(name);
obj.setKor(kor);
obj.setEng(eng);
obj.setMat(mat);
dao.setMember(obj);
}while(true);
}
public void menuSelect() {
dao.sort();
System.out.println("-----------------------------------");
System.out.printf("전체 회원수: %d 명%n", dao.count());
System.out.println("-----------------------------------");
System.out.println("이름 국어 영어 수학 총점 평균");
System.out.println("-----------------------------------");
for (ScoreDTO obj : dao.getLists()) {
System.out.printf("%4s %5d %5d %5d %5d %.1f%n", obj.getName()
, obj.getKor()
, obj.getEng()
, obj.getMat()
, obj.getTotal()
, obj.getAvg());
}
System.out.println("-----------------------------------");
}
public void menuSearch() {
System.out.print("검색하려는 이름?");
String name = sc.next();
System.out.println("-----------------------------------");
System.out.println("이름 국어 영어 수학 총점 평균");
System.out.println("-----------------------------------");
StringBuilder sb = new StringBuilder();
for (ScoreDTO obj : lists) {
if(obj.getName().equals(name)) {
sb.append(String.format("%4s %5d %5d %5d %5d %.1f%n", obj.getName()
, obj.getKor()
, obj.getEng()
, obj.getMat()
, obj.getTotal()
, obj.getAvg()));
}
}
if (sb.length() > 0) {
System.out.print(sb.toString());
} else {
System.out.println("검색결과가 없습니다.");
}
System.out.println("-----------------------------------");
}
public void menuUpdate() {
//생략
}
public void menuDelete() {
//생략
}
}
package com.test;
import java.util.*;
public class Class72 {
//화면상 메뉴 출력.
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Process2 process = new Process2();
do{
System.out.println();
System.out.println();
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.print("선택(1~5, -1 종료)->");
int menu = sc.nextInt();
if (menu == -1) {
System.out.println("프로그램을 종료합니다.");
break;
}
switch (menu) {
case 1: process.menuInsert(); break;
case 2: process.menuSelect(); break;/*
case 3: process.menuSearch(); break;
case 4: process.menuUpdate(); break;
case 5: process.menuDelete(); break;*/
}
}while(true);
}
}
Map 인터페이스를 구현한 TreeMap 클래스
1. 컬렉션 종류
◆ Collection 인터페이스
- Value의 집합체
- 특정 Value를 얻기 위해서는 검색 과정 필요.
◆ Map 인터페이스
- Key, Value의 집합체.
- Key을 제시하면 Value를 얻을 수 있는 구조.
**개별정리내용**
TreeMap에서 자동인덱스가 아닌 키값 구분 인덱스 이기때문에 단일 출력에는 편리하나,
전체출력을 할 경우 while 문을 통해 출력해야 하며, 이때 , Iterator클래스를 사용해야 함.
ex)
Iterator<Integer> it = tm.keySet().iterator(); //Integer > 키자료형
while(it.hasNext()) {
int key = it.next();
System.out.printf("%d %s %d %d %d %d %.1f %n"
, key
, tm.get(key).getName()
, tm.get(key).getKor()
, tm.get(key).getEng()
, tm.get(key).getMat()
, tm.get(key).getTotal()
, tm.get(key).getAve());
}
//Class73.java ->TreeMap에서의 선언, 자료 입력, 출력.
package com.test;
import java.util.*;
public class Class73 {
public static void main(String[] args) {
//Key 역할을 할 자료형 지정 필요
//Value 역할을 할 자료형 지정 필요.
TreeMap<String, String> tm = new TreeMap<String, String>();
//입력 -> Key, Value를 입력
tm.put("kim", "김길동");
tm.put("park", "박길동");
tm.put("choi", "최길동");
//출력 ->Key를 제시하면 Value를 얻을 수 있다.
System.out.println(tm.get("kim")); //-> 김길동 리턴
tm.get("park");
tm.get("choi");
//전체출력
//->인덱스를 제공하지 않는다.
//->Iterator 제공 (제네릭은 key의 자료형) (key들을 순차적으로 접근할 때 사용)
Iterator<String> it = tm.keySet().iterator(); // keyset() : 키들만 모여져있는 것. iterator():
while(it.hasNext()) { // hasnext()는 next() 대상이 존재하는지 여부 리턴.
//next()는 key집합에서 해당번째 key를 리턴
String key = it.next();
//get()은 특정 key에 해당하는 value를 리턴
System.out.println(tm.get(key));
}
//->Map 구조 특성상 전체 출력은 입력순서 또는 정렬 상태로 출력되지 않는다.
}
}
문제) 성적 처리 -> TreeMap 컬렉션, ScoreDTO 클래스, ScoreDAO 클래스 이용,
메뉴 구성 추가.
여러명의 학번, 이름, 국어, 영어, 수학 입력 받아서 총점, 평균 계산해서 출력.
학번은 Key로 사용하고, 이름~평균은 ScoreDTO 객체로 만들어서 Value로 사용한다.
실행 예)
======== 성적 처리 ==============
1. 성적 입력
2. 성적 전체 출력
3. 학번 검색 출력
4. 성적 수정
5. 성적 삭제
선택(1~5, -1 종료)->1
학생 성적 입력(학번 이름 국어 영어 수학)?1 park 80 75 60
학생 성적 입력(학번 이름 국어 영어 수학)?2 hong 100 90 80
학생 성적 입력(학번 이름 국어 영어 수학)?3 kim 80 85 80
학생 성적 입력(학번 이름 국어 영어 수학)?-1
======== 성적 처리 ==============
1. 성적 입력
2. 성적 전체 출력
3. 학번 검색 출력
4. 성적 수정
5. 성적 삭제
선택(1~5, -1 종료)->1
학생 성적 입력(학번 이름 국어 영어 수학)?3 choi 80 80 80
이미 입력된 학번입니다.
학생 성적 입력(학번 이름 국어 영어 수학)?4 choi 80 80 80
학생 성적 입력(학번 이름 국어 영어 수학)?-1
======== 성적 처리 ==============
1. 성적 입력
2. 성적 전체 출력
3. 학번 검색 출력
4. 성적 수정
5. 성적 삭제
선택(1~5, -1 종료)->2
학번 이름 국어 영어 수학 총점 평균
1 hong 100 90 80 XXX XXX.X
2 kim 80 85 80 XXX XXX.X
3 park 80 75 60 XXX XXX.X
4 choi 80 80 80 XXX XXX.X
======== 성적 처리 ==============
1. 성적 입력
2. 성적 전체 출력
3. 학번 검색 출력
4. 성적 수정
5. 성적 삭제
선택(1~5, -1 종료)->3
검색하려는 학번?2
학번 이름 국어 영어 수학 총점 평균
2 kim 80 85 80 XXX XXX.X
======== 성적 처리 ==============
1. 성적 입력
2. 성적 전체 출력
3. 학번 검색 출력
4. 성적 수정
5. 성적 삭제
선택(1~5, -1 종료)->3
검색하려는 학번?5
검색 결과가 없습니다.
======== 성적 처리 ==============
1. 성적 입력
2. 성적 전체 출력
3. 학번 검색 출력
4. 성적 수정
5. 성적 삭제
선택(1~5, -1 종료)->-1
프로그램이 종료되었습니다.
//ScoreDTO.java -> 동일(학번은 TreeMap의 키로만 사용되므로 DTO에는 학번이 없다)
//ScoreDAO3.java -> 변경(자료저장공간이 ArrayList 에서 TreeMap으로 변경되므로)
//Process3.java -> 변경(자료저장공간이 ArrayList 에서 TreeMap으로 변경되므로 관련 액션 수정)
//Class74.java -> 변경(이름 검색 출력을 학번 검색 출력으로 수정
//ScoreDTO.java -> 학번은 TreeMap의 Key로만 사용되므로 DTO에는 학번이 없다.
package com.test;
public class ScoreDTO {
//자료 처리 전용 클래스
//멤버변수
private String name;
private int kor, eng, mat;
private int total;
private double ave;
//getter, setter 등록
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 getTotal() {
total = kor + eng + mat;
return total;
}
public double getAve() {
ave = getTotal() / 3.0;
return ave;
}
}
//ScoreDAO3.java -> 자료 저장소 TreeMap으로 수정
package com.test;
import java.util.*;
public class ScoreDAO3 {
private TreeMap<Integer, ScoreDTO> tm
= new TreeMap<Integer, ScoreDTO>();
public void add(int key, ScoreDTO dto) {
tm.put(key, dto);
}
public boolean containsKey(int key) {
return tm.containsKey(key);
}
public TreeMap<Integer, ScoreDTO> getTm() {
return tm;
}
public ScoreDTO getTm(int key) {
return tm.get(key);
}
}
//Process3.java -> 자료 저장소가 TreeMap이므로 관련 액션을 수정
package com.test;
import java.util.*;
public class Process3 {
private Scanner sc = new Scanner(System.in);
private ScoreDAO3 dao = new ScoreDAO3();
public void menuInsert() {
do {
System.out.print("성적 입력(학번 이름 국어 영어 수학)?");
int key = sc.nextInt();
if (key == -1) {
break;
}
String name = sc.next();
int kor = sc.nextInt();
int eng = sc.nextInt();
int mat = sc.nextInt();
ScoreDTO dto = new ScoreDTO();
dto.setName(name);
dto.setKor(kor);
dto.setEng(eng);
dto.setMat(mat);
//Key에 대한 중복 여부 확인
//Key가 중복되면 Value는 덮어쓰기가 됨.
if (dao.containsKey(key)) {
System.out.println("이미 입력된 학번입니다.");
} else {
dao.add(key, dto);
}
}while(true);
}
public void menuSelect() {
System.out.println("-----------------------------");
System.out.println("학번 이름 국어 영어 수학 총점 평균");
System.out.println("-----------------------------");
TreeMap<Integer, ScoreDTO> tm = dao.getTm();
Iterator<Integer> it = tm.keySet().iterator();
while(it.hasNext()) {
int key = it.next();
System.out.printf("%d %s %d %d %d %d %.1f %n"
, key
, tm.get(key).getName()
, tm.get(key).getKor()
, tm.get(key).getEng()
, tm.get(key).getMat()
, tm.get(key).getTotal()
, tm.get(key).getAve());
}
System.out.println("-----------------------------");
}
public void menuSearch() {
System.out.print("검색하려는 학번?");
int key = sc.nextInt();
System.out.println("-----------------------------");
System.out.println("학번 이름 국어 영어 수학 총점 평균");
System.out.println("-----------------------------");
ScoreDTO dto = dao.getTm(key);
if (dto == null) {
System.out.println("검색 결과 없습니다.");
} else {
System.out.printf("%d %s %d %d %d %d %.1f %n"
, key
, dto.getName()
, dto.getKor()
, dto.getEng()
, dto.getMat()
, dto.getTotal()
, dto.getAve());
}
System.out.println("-----------------------------");
}
public void menuUpdate() {
//생략
}
public void menuDelete() {
//생략
}
}
//Class74.java -> 이름 검색 출력을 학번 검색 출력으로 수정
package com.test;
import java.util.Scanner;
public class Class74 {
//메뉴 출력
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Process3 obj = new Process3();
do {
System.out.println();
System.out.println();
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.print("선택(1~5, -1:종료)?");
int menu = sc.nextInt();
if (menu == -1) {
break;
}
switch(menu) {
case 1: obj.menuInsert(); break;
case 2: obj.menuSelect(); break;
case 3: obj.menuSearch(); break;
case 4: obj.menuUpdate(); break;
case 5: obj.menuDelete(); break;
}
}while(true);
}
}
JAVA SE 과목 끝.
예외처리 배우지 않았으므로 ORACLE 과목 종료되면 배워야함.