개별정리 내용
* Comparator 인터페이스(오버라이딩 필수) 개별 공부
* 인터페이스를 new 키워드를 사용하여 객체를 생성한다는 것은 익명클래스로 처리하여 메소드를 오버라이딩하여 사용하겠다라는 의미
컬렉션(collection) - 중요 항목
1. 자료구조를 표현하는 방법.
2. 자료구조
-선형구조: 배열, 스택, 큐
-비선형구조: 트리, 그래프
배열 - 자료가 연속적으로 모여져있는 상태
스택 - 자료를 입력하는 입구와 출력하는 출구가 같은 상태. 선입후출 특성을 갖는 자료 구조. FILO
큐 - 자료를 입력하는 입구와 출력하는 출구가 반대 상태. 선입선출 특성을 갖는 자료 구조. FIFO
3. 컬렉션의 종류 (interface)
java.util.Collection - 순서없는 단순한 요소들의 집합(최상위 인터페이스)
java.util.Set - 중복을 허용하지 않는 단순한 요소들의 집합
java.util.List - 순차적 나열, 순서 지정이 가능한 단순한 요소들의 집합
java.util.SortedSet - 값들이 정렬된 Set
java.util.Map - Key와 Value로 구성된 구조(최상위 인터페이스)
java.util.SortedMap - Key가 정렬된 Map
4. Key, Value
Collection 구조-------------------------------------------
Value - 자료구조에 저장되는 데이터(값) 자신. 자동 인덱스
Key - Map 구조에서 사용되는 데이터(값)에 대한 사용자 정의 인덱스.
Value index->Key의 역할. 자동인덱스
------ -----
홍길동 0
김길동 1 ->자료를 탐색할 때 인덱스를 사용해서 탐색.
박길동 2
... ...
Map구조---------------------------------------------------
Value Key ->사용자 정의 인덱스
------ -----
홍길동 hong
김길동 kim ->자료를 탐색할 때 Key를 사용해서 탐색.
박길동 park
... ...
ArrayList 클래스
1. Collection 인터페이스를 상속 받은 List 인터페이스를 구현한 클래스.
2. 배열과 비슷한 특성을 가지면서 컬렉션의 특성(크기 지정 필요없음)을 가지고 있다.
3. 형태
-선언
ArrayList 변수 = new ArrayList(); //크기지정 불필요.
-입력
변수.add(값);
변수.add(값);
...
-출력 ->배열과 컬렉션만 지원하는 전용 for문 사용.(확장 for문) 단, 일반for문도 사용 가능.
for(변수의자료형 포문내에서사용할객체명 : 변수) { // (데이터의자료형 임의의변수명 : 데이터)
System.out.println(obj);
}
//Class60.java -> 배열사용
//Class61.java -> 컬렉션사용
package com.test;
import java.util.*;
public class Class60 {
public static void main(String[] args) {
//배열을 사용하는 경우
//배열선언 -> 크기지정 필수
Object[] arr = new Object[10];
//입력 -> 배열에서 모자라거나 낭비되는 요소가 발생될 수 있다.
arr[0] = 10; //int -> Object
arr[1] = "test"; //String -> Object
arr[2] = 10.123; //double -> Object
arr[3] = "홍길동"; //String -> Object
//출력 -> 확장 for 문
for (Object obj : arr) {
System.out.println(obj);
}
//출력 -> 일반 for 문
for (int a=0; a<arr.length; a++) {
System.out.println(arr[a]);
}
}
}
package com.test;
import java.util.*;
public class Class61 {
public static void main(String[] args) {
//컬렉션을 사용하는 경우
//컬렉션 선언 -> 크기지정 불필요
ArrayList arr = new ArrayList();
//입력 -> 모자라거나 낭비되는 공간이 없다.
arr.add(10); //int -> Object
arr.add("test"); //String -> Object
arr.add(10.123); //double -> Object
arr.add("홍길동"); //String -> Object
//출력 -> 확장 for문
for (Object obj : arr) {
System.out.println(obj);
}
//출력 -> 일반 for문
for(int a=0; a<arr.size(); a++) {
System.out.println(arr.get(a));
}
}
}
제네릭 표현을 사용한 컬렉션
1. 컬렉션에서 사용할 데이터의 자료형을 한정시키는 것.
2. 메소드나 멤버 변수의 기능은 같지만 그것을 필요로 하는 곳에 따라 넘겨받는 결과의 자료형이 서로 다를 때 틀이 되는 하나의 메소드나 멤버 변수를 정의해놓고 호출하는 쪽에서 요구하는 자료형의 값을 갖도록 하는 것.
//Class62.java -> 제네릭 사용전
//Class63.java -> 제네릭 사용후
package com.test;
import java.util.ArrayList;
public class Class62 {
public static void main(String[] args) {
//제네릭 표현이 없는 경우
//=> 출력시 자료형 검사 과정 필요.
ArrayList arr = new ArrayList();
//입력 -> 모자라거나 낭비되는 공간이 없다.
arr.add(10); //int -> Object
arr.add("test"); //String -> Object
arr.add(10.123); //double -> Object
arr.add("홍길동"); //String -> Object
for (Object obj : arr) {
if(obj instanceof Integer) { // obj변수가 가지고 있는 데이터의 실제 자료형이 Integer인가를 확인하는 연산자
//Object -> Integer -> int
System.out.printf("%d %n", ((Integer)obj).intValue());
}
if(obj instanceof String) { // obj변수가 가지고 있는 데이터의 실제 자료형이 String인가를 확인하는 연산자
System.out.printf("%s %n", (String)obj);
}
if(obj instanceof Double) { // obj변수가 가지고 있는 데이터의 실제 자료형이 Double인가를 확인하는 연산자
//Object -> Double -> double // Double은 클래스 자료형이니 double 로 바꿔야함.
System.out.printf("%f %n", ((Double)obj).doubleValue());
}
}
}
}
package com.test;
import java.util.ArrayList;
public class Class63 {
public static void main(String[] args) {
//제네릭 표현이 있는 경우
//-> 컬렉션에서 사용가능한 자료형이 한정.
ArrayList<Integer> arr = new ArrayList<Integer>();
arr.add(10); //O. int -> Integer : 박싱(boxing) //int-기본자료형 , Integer-참조형
//arr.add("test"); //X
//arr.add(10.123); //X
//arr.add("홍길동"); //X
//자료형 검사과정이 필요하지 않다.
for (Integer obj : arr) {
System.out.printf("%d %n", obj.intValue());
}
//Integer(Wrapper class) -> int : 오토언박싱(auto unboxing)
//Wrapper class: 기본 자료형을 참조형으로 표현한 클래스
for (int obj : arr) {
System.out.printf("%d %n", obj);
}
}
}
제네릭(Generic) 지원 클래스 만들기
1. 제네릭을 지원하기 위해서는 데이터형 인자를 클래스 정의시에 지정해야 하며, 일반적으로 데이터형 인자는 1글자의 영문 대문자로 인자의 수만큼 사용한다.
2. 형태
접근지정자 class 클래스명<데이터형인자, > {
}
//Class64.java
package com.test;
class Generic<T> {
private T var;
public void set(T var) {
this.var = var;
}
public T get() {
//var += 10; //아직 자료형이 결정되지 않았기 때문에 잘못된 표현임
return var;
}
}
public class Class64 {
public static void main(String[] args) {
Generic<Integer> obj1 = new Generic<Integer>();
//객체가 생성되는 순간 Generic 클래스의 내부적인 소스코드가 바뀌게 된다.
obj1.set(10);
System.out.println(obj1.get());
Generic<String> obj2 = new Generic<String>();
obj2.set("test");
System.out.println(obj2.get());
}
}
문제) 이름과 전화번호를 저장할 수 있는 자료형 만들기. 컬렉션(ArrayList), Member클래스 이용.
실행 예)
이름 전화번호(1)? hong 111-1111
이름 전화번호(2)? kim 222-2222
이름 전화번호(3)? -1 -> 입력 종료
이름 전화번호
----------------
hong 111-1111
kim 222-2222
park 333-3333
----------------
//MemberDTO.java
//Class65.java
package com.test;
public class MemberDTO {
//멤버변수
private String name;
private String tel;
//getter, setter 구현
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
}
package com.test;
import java.util.*;
public class Class65 {
public static void main(String[] args) {
//1단계. 컬렉션 선언
ArrayList<MemberDTO> arr = new ArrayList<MemberDTO>();
//2단계. 컬렉션 요소 입력
Scanner sc = new Scanner(System.in);
int num = 1;
do {
System.out.printf("이름:전화번호(%d)?", num++);
String name = sc.next(); //이름
if (name.equals("-1")){
System.out.println("프로그램을 종료합니다.");
break;
}
String tel = sc.next(); //전화번호
MemberDTO dto = new MemberDTO();
dto.setName(name);
dto.setTel(tel);
//MemberDTO 객체를 컬렉션에 저장하는 과정
arr.add(dto);
}while(true);
//3단계. 컬렉션 요소 출력
//확장for문 사용
System.out.println("----------------");
System.out.printf("전체 회원수: %d명%n", arr.size()); // size() 는 arr 컬렉션의 크기를 반환하는 메소드 즉, length와 같은 기능
System.out.println("----------------");
System.out.println("이름 전화번호");
for(MemberDTO dto1 : arr) {
//MemberDTO 객체에서 게터 메소드 이용
System.out.printf("%s %s %n", dto1.getName(), dto1.getTel());
}
System.out.println("----------------");
}
}
문제) 외부에서 임의의 여러개의 숫자를 입력받고 정렬해서 출력. 컬렉션 이용
실행 예)
숫자 입력(1)?
숫자 입력(2)?
숫자 입력(3)?
숫자 입력(4)?
숫자 입력(5)? -1 > 입력끝 지정 필요
원본:
정렬:
//Class66.java
package com.test;
import java.util.*;
public class Class66 {
public static void main(String[] args) {
//입력
ArrayList<Integer> lists = new ArrayList<Integer>(); // int -> Integer (박싱)
Scanner sc = new Scanner(System.in);
int a = 1;
do{
System.out.printf("숫자 입력(%d)?", a++);
int b = sc.nextInt();
if (b == -1) {
break;
}
lists.add(b);
}while(true);
//처리
StringBuilder sb = new StringBuilder();
sb.append("원본 : ");
for(int obj : lists){ //Integer -> int (언박싱)
sb.append(String.format("%d ", obj));
}
sb.append(String.format("%n"));
//오름차순 정렬
Collections.sort(lists); // 컬렉션 전용 소트 메소드. Arrays.sort()와 효과는 동일.
//내림차순 정렬
//Collections.sort(lists, Collections.reverseOrder());
sb.append("정렬 : ");
for(int obj : lists){ //Integer -> int (언박싱)
sb.append(String.format("%d ", obj));
}
sb.append(String.format("%n"));
//출력
System.out.println(sb.toString());
}
}
문제)여러명의 성적을 입력 받고, 점수가 높은 순으로 등수 부여해서 출력. 컬렉션, RecordDTO 이용.
실행 예)
이름 점수(1)?kim 80
이름 점수(2)?park 90
이름 점수(3)?choi 100
이름 점수(4)?hong 70
이름 점수(5)?kang 60->-1 입력끝 지정 필요
-----------------------
1등 choi 100
2등 park 90
3등 kim 80
4등 hong 70
5등 kang 60
//RecordDTO.java
//Class67.java
package com.test;
public class RecordDTO {
private String name;
private int score;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
package com.test;
import java.util.*;
public class Class67 {
public static void main(String[] args) {
//입력
ArrayList<RecordDTO> lists = new ArrayList<RecordDTO>();
Scanner sc = new Scanner(System.in);
int a=1;
do {
System.out.printf("이름 점수(%d)", a++);
String name = sc.next();
if (name.equals("-1")){
System.out.println("프로그램을 종료합니다.");
break;
}
int score = sc.nextInt();
RecordDTO dto = new RecordDTO();
dto.setName(name);
dto.setScore(score);
lists.add(dto);
}while(true);
//처리
//객체간의 비교 및 정렬을 위해서 Comparator 인터페이스를 구현한 익명 클래스가 필요하다.
Comparator<RecordDTO> comp = new Comparator<RecordDTO>() {//익명클래스는 상위클래스의 메소드를 오버라이딩 할때 사용.
@Override
public int compare(RecordDTO o1, RecordDTO o2) { //0, 1 , -1 의 세가지 값으로 두개를 비교해 같거나, 크거나, 작은 상황에 따라 리턴값을 다르게 set
// 내림차순 정렬
return (o1.getScore() < o2.getScore()) ? 1 : -1;
// 오름차순 정렬
//return (o1.getScore() > o2.getScore()) ? 1 : -1;
}
}; -> 객체 생성이 아닌 익명 클래스
Collections.sort(lists, comp);
//출력
System.out.println("---------------------");
for (int n=0; n<lists.size() ; n++){
System.out.printf("%d등 %s %d%n", n+1, lists.get(n).getName(), lists.get(n).getScore());
// lists.get(n) 이것은 lists라는 컬렉션에 몇번째항목을 불러올지 지정할 수 있음.
}
System.out.println("---------------------");
}
}
문제) 여러명의 국,영,수 점수를 입력 받아서 총점, 평균, 판정 결과 출력.
컬렉션, DTO 클래스, Collections.sort(), Comparator 이용.
판정 기준은
합격 -> 과목별로 40점 이상이면서, 평균이 60점 이상.
과락 -> 과목중 40점 미만이 있고, 평균이 60이상.
불합격 -> 평균이 60점 미만
평균이 60점 이상 -> 합격 또는 과락 -> 국영수 점수가 모두 40점 이상인지 확인.
평균이 60점 이하 -> 불합격
정렬 기준은 총점 기준으로 내림차순 정렬.
실행 예)
성적 입력(이름 국어 영어 수학)?hong 100 100 100
성적 입력(이름 국어 영어 수학)?kim 80 90 80
성적 입력(이름 국어 영어 수학)?-1 -> 입력끝 지정 필요
------------------------------------------
이름 국어 영어 수학 총점 평균 판정
------------------------------------------
hong 100 100 100 300 100.0 합격
kim 80 90 80 .. .. 합격
------------------------------------------
//ScoreDTO.java
//Class68.java
package com.test;
public class ScoreDTO {
private String name;
private int kor, eng, mat, total;
private double avg;
private String grade = "";
public String getName() {
return name;
}
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 int getKor(){
return kor;
}
public int getEng(){
return eng;
}
public int getMat(){
return mat;
}
public int getTotal(){
return kor + eng + mat;
}
public double getAvg(){
return (kor + eng + mat) / 3.0;
}
public String getGrade(){
if (getAvg() >= 60) {
if (getKor() >= 40 && getEng() >= 40 && getMat() >= 40){
grade = "합격";
} else {
grade = "과락";
}
} else {
grade = "불합격";
}
return grade;
}
}
package com.test;
import java.util.*;
public class Class68 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<ScoreDTO> lists = new ArrayList<ScoreDTO>();
do{
System.out.print("성적 입력(이름 국어 영어 수학)?");
String name = sc.next();
if(name.equals("-1")) {
System.out.println("입력을 종료하고, 결과를 출력합니다.");
break;
}
int kor = sc.nextInt();
int eng = sc.nextInt();
int mat = sc.nextInt();
ScoreDTO scoreobj = new ScoreDTO();
scoreobj.setName(name);
scoreobj.setKor(kor);
scoreobj.setEng(eng);
scoreobj.setMat(mat);
lists.add(scoreobj);
}while(true);
//처리
//실제 처리는 DTO클래스에서 처리.
//컬렉션 정렬
Comparator<ScoreDTO> comp = new Comparator<ScoreDTO>(){
@Override
public int compare(ScoreDTO o1, ScoreDTO o2) {
if (o1.getTotal() < o2.getTotal()) {
return 1;
} else {
return -1;
}
}
};
Collections.sort(lists, comp);
//출력
System.out.println("------------------------------------------");
System.out.println("이름 국어 영어 수학 총점 평균 판정");
System.out.println("------------------------------------------");
for (ScoreDTO obj : lists) {
System.out.printf("%4s %4d %4d %4d %4d %3.1f %s%n", obj.getName(), obj.getKor(), obj.getEng(), obj.getMat(), obj.getTotal(), obj.getAvg(), obj.getGrade
());
}
System.out.println("------------------------------------------");
}
}
문제) 여러명의 국,영,수 점수를 입력 받아서 총점, 평균, 판정 결과 출력.
컬렉션, DTO 클래스, Collections.sort(), Comparator 이용.
판정 기준은
합격 -> 과목별로 40점 이상이면서, 평균이 60점 이상.
과락 -> 과목중 40점 미만이 있고, 평균이 60이상.
불합격 -> 평균이 60점 미만
평균이 60점 이상 -> 합격 또는 과락 -> 국영수 점수가 모두 40점 이상인지 확인.
평균이 60점 이하 -> 불합격
정렬없이 등수를 판별해서 출력.
실행 예)
성적 입력(이름 국어 영어 수학)?hong 100 100 100
성적 입력(이름 국어 영어 수학)?kim 80 90 80
성적 입력(이름 국어 영어 수학)?-1 -> 입력끝 지정 필요
------------------------------------------------
이름 국어 영어 수학 총점 평균 판정 등수
------------------------------------------------
hong 100 100 100 300 100.0 합격 2등
kim 80 90 80 .. .. 합격 1등
------------------------------------------------
//ScoreDTO.java
//Class69.java
package com.test;
public class Score1DTO {
private String name;
private int kor, eng, mat, total;
private double avg;
private String grade = "";
private int rank = 1;
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank += rank;
}
public String getName() {
return name;
}
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 int getKor(){
return kor;
}
public int getEng(){
return eng;
}
public int getMat(){
return mat;
}
public int getTotal(){
return kor + eng + mat;
}
public double getAvg(){
return (kor + eng + mat) / 3.0;
}
public String getGrade(){
if (getAvg() >= 60) {
if (getKor() >= 40 && getEng() >= 40 && getMat() >= 40){
grade = "합격";
} else {
grade = "과락";
}
} else {
grade = "불합격";
}
return grade;
}
}
package com.test;
import java.util.*;
public class Class69 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ArrayList<Score1DTO> lists = new ArrayList<Score1DTO>();
do{
System.out.print("성적 입력(이름 국어 영어 수학)?");
String name = sc.next();
if(name.equals("-1")) {
System.out.println("입력을 종료하고, 결과를 출력합니다.");
break;
}
int kor = sc.nextInt();
int eng = sc.nextInt();
int mat = sc.nextInt();
Score1DTO scoreobj = new Score1DTO();
scoreobj.setName(name);
scoreobj.setKor(kor);
scoreobj.setEng(eng);
scoreobj.setMat(mat);
lists.add(scoreobj);
}while(true);
//처리
//실제 처리는 DTO클래스에서 처리.
//등수 비교하여 DTO클래스 멤버변수 rank에 값1씩 증가시키기 즉, 석차 알고리즘 사용.
for(int a=0; a<lists.size(); a++) {
for (int b=0; b<lists.size(); b++) {
if (a == b) {
continue;
}
if ( (lists.get(a)).getTotal() > (lists.get(b)).getTotal() ) {
(lists.get(b)).setRank(1);
}
}
}
//출력
System.out.println("-------------------------------------------------");
System.out.println("이름 국어 영어 수학 총점 평균 판정 등수");
System.out.println("-------------------------------------------------");
for (Score1DTO obj : lists) {
System.out.printf("%4s %4d %4d %4d %4d %3.1f %6s %2d등%n", obj.getName(), obj.getKor(), obj.getEng(), obj.getMat(), obj.getTotal(), obj.getAvg(),
obj.getGrade(), obj.getRank());
}
System.out.println("-------------------------------------------------");
}
}