90 Java의정석定石 3판 - 연습문제풀이 Chapter 컬렉션프레임웍 Collections Framework

Similar documents
gnu-lee-oop-kor-lec11-1-chap15

07 자바의 다양한 클래스.key

PowerPoint Presentation

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

Microsoft PowerPoint - Java7.pptx

항상쌍 ( 키, 값 ) 으로만데이터를저장하는클래스 의최고조상 : Map - Map을조상으로하는클래스, HashTable, HashMap, LinkedHashMap, TreeMap 등은데이터를저장할때반드시 키 와 값 의쌍으로저장한다. - Map에저장되는 키 는중복되면안되

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

PowerPoint 프레젠테이션

Java ...

PowerPoint Presentation

슬라이드 1

비긴쿡-자바 00앞부속

PowerPoint Presentation

PowerPoint Presentation

ilist.add(new Integer(1))과 같이 사용하지 않고 ilist.add(1)과 같이 사용한 것은 자바 5.0에 추가된 기본 자료형과 해당 객체 자료 형과의 오토박싱/언박싱 기능을 사용한 것으로 오토박싱이란 자바 컴파일러가 객체를 요구하는 곳에 기본 자료형

Microsoft PowerPoint - 04-UDP Programming.ppt

제11장 프로세스와 쓰레드

09-interface.key

12-file.key

JAVA PROGRAMMING 실습 09. 예외처리

PowerPoint Presentation

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

TEST BANK & SOLUTION

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CC0E7B0EDB0FCB8AE5C53746F636B5F4D616E D656E74732E637070>

슬라이드 1

파일로입출력하기II - 파일출력클래스중에는데이터를일정한형태로출력하는기능을가지고있다. - PrintWriter와 PrintStream을사용해서원하는형태로출력할수있다. - PrintStream은구버전으로가능하면 PrintWriter 클래스를사용한다. PrintWriter

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

목차 INDEX JSON? - JSON 개요 - JSONObject - JSONArray 서울시공공데이터 API 살펴보기 - 요청인자살펴보기 - Result Code - 출력값 HttpClient - HttpHelper 클래스작성 - JSONParser 클래스작성 공공

rmi_박준용_final.PDF

Cluster management software

Microsoft Word - java18-1-final-answer.doc

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

C 언어 프로그래밊 과제 풀이

쉽게 풀어쓴 C 프로그래밍

JAVA PROGRAMMING 실습 02. 표준 입출력

Microsoft PowerPoint - Lect07.pptx

PowerPoint Presentation

PowerPoint Presentation

Spring Data JPA Many To Many 양방향 관계 예제

untitled

* Factory class for query and DML clause creation * tiwe * */ public class JPAQueryFactory implements JPQLQueryFactory private f

Microsoft PowerPoint - 2강

PowerPoint Presentation

02 C h a p t e r Java

5장.key

java_jungsuk3_슰ì−µë¬¸ì€œì€—ì²´_ hwp

JAVA PROGRAMMING 실습 08.다형성

PowerPoint Presentation

Java

JAVA PROGRAMMING 실습 02. 표준 입출력

chap 5: Trees

A Tour of Java V

Microsoft PowerPoint - CSharp-10-예외처리

JUNIT 실습및발표

Design Issues

교육자료

PowerPoint 프레젠테이션

슬라이드 1

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

C++ Programming

PowerPoint 프레젠테이션

ch09

자바 프로그래밍

32 Java 의정석定石 2 판 - 연습문제풀이 Chapter 6 객체지향프로그래밍 I Object-oriented Programming I

Microsoft PowerPoint - Lect04.pptx

Microsoft PowerPoint - CSharp-2-기초문법

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

4장.문장

Spring Boot/JDBC JdbcTemplate/CRUD 예제

[ 정보 ] 과학고 R&E 결과보고서 Monte Carlo Method 를이용한 고교배정시뮬레이션 연구기간 : ~ 연구책임자 : 강대욱 ( 전남대전자컴퓨터공학부 ) 지도교사 : 최미경 ( 전남과학고정보 컴퓨터과 ) 참여학생 : 박진명 ( 전

PowerPoint Presentation

Chapter 객체지향프로그래밍 I Object-oriented Programming I

Microsoft PowerPoint - lec12 [호환 모드]

PowerPoint 프레젠테이션

슬라이드 1

11 템플릿적용 - Java Program Performance Tuning (김명호기술이사)

PowerPoint Presentation

스레드의우선순위 우선순위설정메소드 : void setpriority(int newpriority) newpriority 에설정할수있는등급 : 1( 가장낮은우선순위 ) 부터 10( 가장높은우선순위 ) 가장높은우선순위 : MAX_PRIORITY, 보통우선순위 : NORM_

설계란 무엇인가?

자바-11장N'1-502

유니티 변수-함수.key

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

PowerPoint 프레젠테이션

쉽게 풀어쓴 C 프로그래밍

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

1

Microsoft PowerPoint - Introduction to Google Guava.pptx

신림프로그래머_클린코드.key

PowerPoint 프레젠테이션

강의 개요

Java ~ Java program: main() class class» public static void main(string args[])» First.java (main class ) /* The first simple program */ public class

쉽게 풀어쓴 C 프로그래밊

쉽게

int total = 0; for( int i=1; i<=5; i++ ) { for( int j=1; j<=i; i++ ) { total ++; System.out.println( total ); 대구분 : 객체와 Class 소구분 : 객체생성과사용 / Class 선언

PowerPoint 프레젠테이션

Transcription:

90 Chapter 컬렉션프레임웍 Collections Framework

91 [ 연습문제 ] [11-1] 다음은정수집합 1,2,3,4와 3,4,5,6 의교집합, 차집합, 합집합을구하는코드이 다. 코드를완성하여실행결과와같은결과를출력하시오. [Hint] ArrayList클래스의 addall(), removeall(), retainall() 을사용하라. [ 연습문제]/ch11/Exercise11_1.java import java.util.*; class Exercise11_1 { public static void main(string[] args) { ArrayList list1 = new ArrayList(); ArrayList list2 = new ArrayList(); ArrayList kyo = new ArrayList(); // 교집합 ArrayList cha = new ArrayList(); // 차집합 ArrayList hap = new ArrayList(); // 합집합 list1.add(1); list1.add(2); list1.add(3); list1.add(4); list2.add(3); list2.add(4); list2.add(5); list2.add(6); /* */ (1) 알맞은코드를넣어완성하시오. System.out.println("list1="+list1); System.out.println("list2="+list2); System.out.println("kyo="+kyo); System.out.println("cha="+cha); System.out.println("hap="+hap); 실행결과 [ ] list1=[1, 2, 3, 4] list2=[3, 4, 5, 6] kyo=[3, 4] cha=[1, 2] hap=[1, 2, 3, 4, 5, 6]

92 [11-2] 다음코드의실행결과를적으시오. [ 연습문제]/ch11/Exercise11_2.java import java.util.*; class Exercise11_2 { public static void main(string[] args) { ArrayList list = new ArrayList(); list.add(3); list.add(6); list.add(2); list.add(2); list.add(2); list.add(7); HashSet set = new HashSet(list); TreeSet tset = new TreeSet(set); Stack stack = new Stack(); stack.addall(tset); while(!stack.empty()) System.out.println(stack.pop()); [11-3] 다음중 ArrayList 에서제일비용이많이드는작업은? 단, 작업도중에 ArrayList 의크기변경이발생하지않는다고가정한다. a. b. c. d. 첫번째요소삭제 마지막요소삭제 마지막에새로운요소추가 중간에새로운요소추가 [11-4] LinkedList 클래스는이름과달리실제로는이중원형연결리스트(doubly circular linked list) 로구현되어있다. LinkedList인스턴스를생성하고 11개의요소를 추가했을때, 이 11 개의요소중접근시간(access time) 이가장오래걸리는요소는몇 번째요소인가?

93 [11-5] 다음에제시된 Student클래스가 Comparable인터페이스를구현하도록변경해서 이름(name) 이기본정렬기준이되도록하시오. [ 연습문제]/ch11/Exercise11_5.java import java.util.*; class Student { String name; int ban; int no; int kor, eng, math; Student(String name, int ban, int no, int kor, int eng, int math) { this.name = name; this.ban = ban; this.no = no; this.kor = kor; this.eng = eng; this.math = math; int gettotal() { return kor+eng+math; float getaverage() { return (int)((gettotal()/ 3f)*10+0.5)/10f; public String tostring() { return name +","+ban +","+no +","+kor +","+eng +","+math +","+gettotal() +","+getaverage(); class Exercise11_5 { public static void main(string[] args) { ArrayList list = new ArrayList(); list.add(new Student(" 홍길동",1,1,100,100,100)); list.add(new Student(" 남궁성",1,2,90,70,80)); list.add(new Student(" 김자바",1,3,80,80,90)); list.add(new Student(" 이자바",1,4,70,90,70)); list.add(new Student(" 안자바",1,5,60,100,80)); Collections.sort(list); Iterator it = list.iterator(); while(it.hasnext()) System.out.println(it.next()); [ 실행결과] 김자바,1,3,80,80,90,250,83.3 남궁성,1,2,90,70,80,240,80.0 안자바,1,5,60,100,80,240,80.0 이자바,1,4,70,90,70,230,76.7 홍길동,1,1,100,100,100,300,100.0

94 [11-6] 다음의코드는성적평균의범위별로학생수를세기위한것이다. TreeSet이학 생들의평균을기준으로정렬하도록 주면해당범위에속한학생의수를반환하는 [Hint] TreeSet의 subset(object from, Object to) 를사용하라. compare(object o1, Object o2) 와평균점수의범위를 getgroupcount() 를완성하라. [ 연습문제]/ch11/Exercise11_6.java import java.util.*; class Student implements Comparable { String name; int ban; int no; int kor; int eng; int math; Student(String name, int ban, int no, int kor, int eng, int math) { this.name = name; this.ban = ban; this.no = no; this.kor = kor; this.eng = eng; this.math = math; int gettotal() { return kor+eng+math; float getaverage() { return (int)((gettotal()/ 3f)*10+0.5)/10f; public String tostring() { return name +","+ban +","+no +","+kor +","+eng +","+math +","+gettotal() +","+getaverage() ; public int compareto(object o) { if(o instanceof Student) { Student tmp = (Student)o; return name.compareto(tmp.name); else { return -1; // class Student

95 class Exercise11_6 { static int getgroupcount(treeset tset, int from, int to) { /* (1) 알맞은코드를넣어완성하시오. */ public static void main(string[] args) { TreeSet set = new TreeSet(new Comparator() { public int compare(object o1, Object o2) { /* (2) 알맞은코드를넣어완성하시오. */ ); set.add(new Student(" 홍길동",1,1,100,100,100)); set.add(new Student(" 남궁성",1,2,90,70,80)); set.add(new Student(" 김자바",1,3,80,80,90)); set.add(new Student(" 이자바",1,4,70,90,70)); set.add(new Student(" 안자바",1,5,60,100,80)); Iterator it = set.iterator(); while(it.hasnext()) System.out.println(it.next()); System.out.println("[60~69] :"+getgroupcount(set,60,70)); System.out.println("[70~79] :"+getgroupcount(set,70,80)); System.out.println("[80~89] :"+getgroupcount(set,80,90)); System.out.println("[90~100] :"+getgroupcount(set,90,101)); [ 실행결과] 이자바,1,4,70,90,70,230,76.7 남궁성,1,2,90,70,80,240,80.0 김자바,1,3,80,80,90,250,83.3 홍길동,1,1,100,100,100,300,100.0 [60~69] :0 [70~79] :1 [80~89] :2 [90~100] :1

96 [11-7] 다음에제시된 BanNoAscending 클래스를완성하여, ArrayList에담긴 Student인 스턴스들이반(ban) 과번호(no) 로오름차순정렬되게하시오.( 반이같은경우번호를비 교해서정렬한다.) [ 연습문제]/ch11/Exercise11_7.java import java.util.*; class Student { String name; int ban; int no; int kor; int eng; int math; Student(String name, int ban, int no, int kor, int eng, int math) { this.name = name; this.ban = ban; this.no = no; this.kor = kor; this.eng = eng; this.math = math; int gettotal() { return kor+eng+math; float getaverage() { return (int)((gettotal()/ 3f)*10+0.5)/10f; public String tostring() { return name +","+ban +","+no +","+kor +","+eng +","+math +","+gettotal() +","+getaverage() ; // class Student class BanNoAscending implements Comparator { public int compare(object o1, Object o2) { /* (1) 알맞은코드를넣어완성하시오. */ class Exercise11_7 { public static void main(string[] args) { ArrayList list = new ArrayList(); list.add(new Student(" 이자바",2,1,70,90,70));

97 list.add(new Student(" 안자바",2,2,60,100,80)); list.add(new Student(" 홍길동",1,3,100,100,100)); list.add(new Student(" 남궁성",1,1,90,70,80)); list.add(new Student(" 김자바",1,2,80,80,90)); Collections.sort(list, new BanNoAscending()); Iterator it = list.iterator(); while(it.hasnext()) System.out.println(it.next()); [ 실행결과] 남궁성,1,1,90,70,80,240,80.0 김자바,1,2,80,80,90,250,83.3 홍길동,1,3,100,100,100,300,100.0 이자바,2,1,70,90,70,230,76.7 안자바,2,2,60,100,80,240,80.0

98 [11-8] 문제11-7의 Student 클래스에총점(total) 과전교등수(schoolRank) 를저장하기 위한인스턴스변수를추가하였다. Student 클래스의기본정렬을이름(name) 이아닌총점 (total) 을기준으로한내림차순으로변경한다음, 총점을기준으로각학생의전교등수 를계산하고전교등수를기준으로오름차순정렬하여출력하시오. [ 연습문제]/ch11/Exercise11_8.java import java.util.*; class Student implements Comparable { String name; int ban; int no; int kor; int eng; int math; int total; // 총점 int schoolrank; // 전교등수 Student(String name, int ban, int no, int kor, int eng, int math) { this.name = name; this.ban = ban; this.no = no; this.kor = kor; this.eng = eng; this.math = math; total = kor+eng+math; int gettotal() { return total; float getaverage() { return (int)((gettotal()/ 3f)*10+0.5)/10f; public int compareto(object o) { /* (1) 알맞은코드를넣어완성하시오. */ public String tostring() { return name +","+ban +","+no +","+kor +","+eng +","+math +","+gettotal() +","+getaverage() +","+schoolrank // 새로추가

99 ; // class Student class Exercise11_8 { public static void calculateschoolrank(list list) { Collections.sort(list); // 먼저 list 를총점기준내림차순으로정렬한다. int prevrank = -1; // 이전전교등수 int prevtotal = -1; // 이전총점 int length = list.size(); /* (2) 아래의로직에맞게코드를작성하시오. 1. 반복문을이용해서 list에저장된 Student 객체를하나씩읽는다. 1.1 총점(total) 이이전총점(prevTotal) 과같으면이전등수(prevRank) 를등수(schoolRank) 로한다. 1.2 총점이서로다르면, 등수(schoolRank) 의값을알맞게계산해서저장한다. 이전에동점자였다면, 그다음등수는동점자의수를고려해야한다. ( 실행결과참고) 1.3 현재총점과등수를이전총점(prevTotal) 과이전등수(prevRank) 에저장한다. */ public static void main(string[] args) { ArrayList list = new ArrayList(); list.add(new Student(" 이자바",2,1,70,90,70)); list.add(new Student(" 안자바",2,2,60,100,80)); list.add(new Student(" 홍길동",1,3,100,100,100)); list.add(new Student(" 남궁성",1,1,90,70,80)); list.add(new Student(" 김자바",1,2,80,80,90)); calculateschoolrank(list); Iterator it = list.iterator(); while(it.hasnext()) System.out.println(it.next()); [ 실행결과] 홍길동,1,3,100,100,100,300,100.0,1 김자바,1,2,80,80,90,250,83.3,2 안자바,2,2,60,100,80,240,80.0,3 남궁성,1,1,90,70,80,240,80.0,3 이자바,2,1,70,90,70,230,76.7,5

100 [11-9] 문제11-8의 Student 클래스에반등수(classRank) 를저장하기위한인스턴스변수 를추가하였다. 반등수를계산하고반과반등수로오름차순정렬하여결과를출력하시오. (1)~(2) 에알맞은코드를넣어완성하시오. [ 연습문제]/ch11/Exercise11_9.java import java.util.*; class Student implements Comparable { String name; int ban; int no; int kor; int eng; int math; int total; int schoolrank; // 전교등수 int classrank; // 반등수 Student(String name, int ban, int no, int kor, int eng, int math) { this.name = name; this.ban = ban; this.no = no; this.kor = kor; this.eng = eng; this.math = math; total = kor+eng+math; int gettotal() { return total; float getaverage() { return (int)((gettotal()/ 3f)*10+0.5)/10f; public int compareto(object o) { if(o instanceof Student) { Student tmp = (Student)o; return tmp.total - this.total; else { return -1; public String tostring() { return name +","+ban +","+no +","+kor +","+eng +","+math

101 +","+gettotal() +","+getaverage() +","+schoolrank +","+classrank // ; // class Student 새로추가 class ClassTotalComparator implements Comparator { public int compare(object o1, Object o2) { /* (1) 알맞은코드를넣어완성하시오. */ class Exercise11_9 { public static void calculateclassrank(list list) { // 먼저반별총점기준내림차순으로정렬한다. Collections.sort(list, new ClassTotalComparator()); int prevban = -1; int prevrank = -1; int prevtotal = -1; int length = list.size(); /* (2) 아래의로직에맞게코드를작성하시오. 1. 반복문을이용해서 list에저장된 Student 객체를하나씩읽는다. 1.1 반이달라지면,(ban과 prevban 이다르면) 이전등수(prevRank) 와이전총점(prevTotal) 을초기화한다. 1.2 총점(total) 이이전총점(prevTotal) 과같으면이전등수(prevRank) 를등수(classRank) 로한다. 1.3 총점이서로다르면, 등수(classRank) 의값을알맞게계산해서저장한다. 이전에동점자였다면, 그다음등수는동점자의수를고려해야한다. ( 실행결과참고) 1.4 현재반과총점과등수를이전반(prevBan), 이전총점(prevTotal), 이전등수(prevRank) 에저장한다. */ // public static void calculateclassrank(list list) { public static void calculateschoolrank(list list) { /* 내용생략 */ public static void main(string[] args) { ArrayList list = new ArrayList(); list.add(new Student(" 이자바",2,1,70,90,70)); list.add(new Student(" 안자바",2,2,60,100,80)); list.add(new Student(" 홍길동",1,3,100,100,100)); list.add(new Student(" 남궁성",1,1,90,70,80)); list.add(new Student(" 김자바",1,2,80,80,90));

102 calculateschoolrank(list); calculateclassrank(list); Iterator it = list.iterator(); while(it.hasnext()) System.out.println(it.next()); [ 실행결과] 홍길동,1,3,100,100,100,300,100.0,1,1 김자바,1,2,80,80,90,250,83.3,2,2 남궁성,1,1,90,70,80,240,80.0,3,3 안자바,2,2,60,100,80,240,80.0,3,1 이자바,2,1,70,90,70,230,76.7,5,2 [11-10] 다음예제의빙고판은 1~30 사이의숫자들로만든것인데, 숫자들의위치가잘 섞이지않는다는문제가있다. 이러한문제가발생하는이유와이문제를개선하기위한 방법을설명하고, 이를개선한새로운코드를작성하시오. [ 연습문제]/ch11/Exercise11_10.java import java.util.*; class Exercise11_10 { public static void main(string[] args) { Set set = new HashSet(); int[][] board = new int[5][5]; for(int i=0; set.size() < 25; i++) { set.add((int)(math.random()*30)+1+""); Iterator it = set.iterator(); for(int i=0; i < board.length; i++) { for(int j=0; j < board[i].length; j++) { board[i][j] = Integer.parseInt((String)it.next()); System.out.print((board[i][j] < 10? " " : " ") + board[i][j]); System.out.println(); // main

103 [11-11] 다음은 SutdaCard클래스를 HashSet 에저장하고출력하는예제이다. HashSet에 중복된카드가저장되지않도록 SutdaCard의 hashcode() 를알맞게오버라이딩하시오. [Hint] String클래스의 hashcode() 를사용하라. [ 연습문제]/ch11/Exercise11_11.java import java.util.*; class SutdaCard { int num; boolean iskwang; SutdaCard() { this(1, true); SutdaCard(int num, boolean iskwang) { this.num = num; this.iskwang = iskwang; public boolean equals(object obj) { if(obj instanceof SutdaCard) { SutdaCard c = (SutdaCard)obj; return num==c.num && iskwang==c.iskwang; else { return false; public String tostring() { return num + ( iskwang? "K":""); class Exercise11_11 { public static void main(string[] args) { SutdaCard c1 = new SutdaCard(3,true); SutdaCard c2 = new SutdaCard(3,true); SutdaCard c3 = new SutdaCard(1,true); HashSet set = new HashSet(); set.add(c1); set.add(c2); set.add(c3); System.out.println(set); 실행결과 [ ] [3K, 1K]

104 [11-12] 다음은섯다게임에서카드의순위를결정하는등급목록( 족보) 이다. HashMap에 등급과점수를저장하는 registerjokbo() 와게임참가자의점수를계산해서반환하는 getpoint() 를완성하시오. [ 참고] 섯다게임은두장의카드의숫자를더한값을 10 으로나눈나머지가높은쪽이이기는게임이다. 그외에 도특정숫자로구성된카드로이루어진등급( 족보) 이있어서높은등급의카드가이긴다. 카드1 카드2 점수 K K 4000 10 10 3100 9 9 3090 8 8 3080 7 7 3070 6 6 3060 5 5 3050 4 4 3040 3 3 3030 2 2 3020 1 1 3010 - - - 카드1 카드2 점수 1 2 2060 2 1 2060 1 4 2050 4 1 2050 1 9 2040 9 1 2040 1 10 2030 10 1 2030 4 10 2020 10 4 2020 4 6 2010 6 4 2010 [ 연습문제]/ch11/Exercise11_12.java import java.util.*; class Exercise11_12 { public static void main(string args[]) throws Exception { SutdaDeck deck = new SutdaDeck(); deck.shuffle(); Player p1 = new Player(" 타짜", deck.pick(), deck.pick()); Player p2 = new Player(" 고수", deck.pick(), deck.pick()); System.out.println(p1+" "+deck.getpoint(p1)); System.out.println(p2+" "+deck.getpoint(p2)); class SutdaDeck { final int CARD_NUM = 20; SutdaCard[] cards = new SutdaCard[CARD_NUM]; int pos = 0; // 다음에가져올카드의위치 HashMap jokbo = new HashMap(); // 족보를저장할 HashMap SutdaDeck() { for(int i=0;i < cards.length;i++) { int num = i%10+1; boolean iskwang = i < 10 && (num==1 num==3 num==8); cards[i] = new SutdaCard(num,isKwang);

105 registerjokbo(); // 족보를등록한다. void registerjokbo() { /* (1) 아래의로직에맞게코드를작성하시오. 1. jokbo(hashmap) 에족보를저장한다. 두카드의값을문자열로붙여서 key 로, 점수를 value 로저장한다. */ int getpoint(player p) { if(p==null) return 0; SutdaCard c1 = p.c1; SutdaCard c2 = p.c2; Integer result = 0; /* */ (2) 아래의로직에맞게코드를작성하시오. 1. 카드두장이모두광이면, jokbo 에서키를 "KK" 로해서점수를조회한다. 2. 두카드의숫자(num) 로 jokbo 에서등급을조회한다. 3. 해당하는등급이없으면, 아래의공식으로점수를계산한다. (c1.num + c2.num) % 10 + 1000 4. Player 의점수(point) 에계산한값을저장한다. return result.intvalue(); SutdaCard pick() throws Exception { SutdaCard c = null; if(0 <= pos && pos < CARD_NUM) { c = cards[pos]; cards[pos++] = null; else { throw new Exception(" 남아있는카드가없습니다."); return c; void shuffle() { for(int x=0; x < CARD_NUM * 2; x++) { int i = (int)(math.random() * CARD_NUM); int j = (int)(math.random() * CARD_NUM); SutdaCard tmp = cards[i]; cards[i] = cards[j]; cards[j] = tmp; // SutdaDeck

106 class Player { String name; SutdaCard c1; SutdaCard c2; int point; // 카드의등급에따른점수 - 새로추가 Player(String name, SutdaCard c1, SutdaCard c2) { this.name = name ; this.c1 = c1 ; this.c2 = c2 ; public String tostring() { return "["+name+"]"+ c1.tostring() +","+ c2.tostring(); // class Player class SutdaCard { int num; boolean iskwang; SutdaCard() { this(1, true); SutdaCard(int num, boolean iskwang) { this.num = num; this.iskwang = iskwang; public String tostring() { return num + ( iskwang? "K":""); [ 실행결과] [ 타짜]5,9 1004 [ 고수]1,1K 3010

107 [11-13] 다음코드는문제11-12를발전시킨것으로각 Player 들의점수를계산하고, 점 수가제일높은사람을출력하는코드이다. TreeMap의정렬기준을점수가제일높은사람 부터내림차순이되도록아래의코드를완성하시오. 단, 동점자처리는하지않는다. [ 연습문제]/ch11/Exercise11_13.java import java.util.*; class Exercise11_13 { public static void main(string args[]) throws Exception { SutdaDeck deck = new SutdaDeck(); deck.shuffle(); Player[] parr = { new Player(" 타짜", deck.pick(), deck.pick()), new Player(" 고수", deck.pick(), deck.pick()), new Player(" 물주", deck.pick(), deck.pick()), new Player(" 중수", deck.pick(), deck.pick()), new Player(" 하수", deck.pick(), deck.pick()) ; TreeMap rank = new TreeMap(new Comparator(){ public int compare(object o1, Object o2) { /* (1) 알맞은코드를넣어완성하시오. */ ); for(int i=0; i < parr.length;i++) { Player p = parr[i]; rank.put(p, deck.getpoint(p)); System.out.println(p+" "+deck.getpoint(p)); System.out.println(); System.out.println("1 위는 "+rank.firstkey()+" 입니다."); class SutdaDeck { final int CARD_NUM = 20; SutdaCard[] cards = new SutdaCard[CARD_NUM]; int pos = 0; // 다음에가져올카드의위치 HashMap jokbo = new HashMap(); // 족보를저장할 HashMap SutdaDeck() { for(int i=0;i < cards.length;i++) { int num = i%10+1; boolean iskwang = i < 10 && (num==1 num==3 num==8); cards[i] = new SutdaCard(num,isKwang);

108 registerjokbo(); // 족보를등록한다. void registerjokbo() { jokbo.put("kk", 4000); jokbo.put("1010",3100); jokbo.put("12", 2060); jokbo.put("99", 3090); jokbo.put("21", 2060); jokbo.put("88", 3080); jokbo.put("14", 2050); jokbo.put("77", 3070); jokbo.put("41", 2050); jokbo.put("66", 3060); jokbo.put("19", 2040); jokbo.put("55", 3050); jokbo.put("91", 2040); jokbo.put("44", 3040); jokbo.put("110", 2030); jokbo.put("33", 3030); jokbo.put("101", 2030); jokbo.put("22", 3020); jokbo.put("104", 2020); jokbo.put("11", 3010); jokbo.put("410", 2020); jokbo.put("46", 2010); jokbo.put("64", 2010); int getpoint(player p) { if(p==null) return 0; SutdaCard c1 = p.c1; SutdaCard c2 = p.c2; Integer result = 0; if(c1.iskwang && c2.iskwang) { result = (Integer)jokbo.get("KK"); else { result = (Integer)jokbo.get(""+c1.num+c2.num); if(result==null) { result = new Integer((c1.num + c2.num) % 10 + 1000); p.point = result.intvalue(); return result.intvalue(); SutdaCard pick() throws Exception { SutdaCard c = null; if(0 <= pos && pos < CARD_NUM) { c = cards[pos]; cards[pos++] = null; else { throw new Exception(" 남아있는카드가없습니다."); return c;

109 void shuffle() { for(int x=0; x < CARD_NUM * 2; x++) { int i = (int)(math.random() * CARD_NUM); int j = (int)(math.random() * CARD_NUM); SutdaCard tmp = cards[i]; cards[i] = cards[j]; cards[j] = tmp; // SutdaDeck class Player { String name; SutdaCard c1; SutdaCard c2; int point; Player(String name, SutdaCard c1, SutdaCard c2) { this.name = name ; this.c1 = c1 ; this.c2 = c2 ; public String tostring() { return "["+name+"]"+ c1.tostring() +","+ c2.tostring(); // class Player class SutdaCard { int num; boolean iskwang; SutdaCard() { this(1, true); SutdaCard(int num, boolean iskwang) { this.num = num; this.iskwang = iskwang; public String tostring() { return num + ( iskwang? "K":""); [ 실행결과] [ 타짜]7,2 1009 [ 고수]2,5 1007 [ 물주]1,7 1008 [ 중수]10,4 2020 [ 하수]9,6 1005 1 위는 [ 중수]10,4 입니다.

110 [11-14] 다음은성적처리프로그램의일부이다. Scanner클래스를이용해서화면으로부 터데이터를입력하고보여주는기능을완성하시오. [ 연습문제]/ch11/Exercise11_14.java import java.io.*; import java.util.*; class Exercise11_14 { static ArrayList record = new ArrayList(); // 성적데이터를저장할공간 static Scanner s = new Scanner(System.in); public static void main(string args[]) { while(true) { switch(displaymenu()) { case 1 : inputrecord(); break; case 2 : displayrecord(); break; case 3 : System.out.println(" 프로그램을종료합니다."); System.exit(0); // while(true) // menu를보여주는메서드 static int displaymenu(){ System.out.println("**************************************************"); System.out.println("* 성적관리프로그램 *"); System.out.println("**************************************************"); System.out.println(); System.out.println(" 1. 학생성적입력하기 "); System.out.println(); System.out.println(" 2. 학생성적보기"); System.out.println(); System.out.println(" 3. 프로그램종료 "); System.out.println(); System.out.print(" 원하는메뉴를선택하세요.(1~3) : "); int menu = 0; /* */ (1) 아래의로직에맞게코드를작성하시오. 1. 화면으로부터메뉴를입력받는다. 메뉴의값은 1~3 사이의값이어야한다. 2. 1~3 사이의값을입력받지않으면, 메뉴의선택이잘못되었음을알려주고다시입력받는다.( 유효한값을입력받을때까지반복해서입력받는다.) return menu; // public static int displaymenu(){ // 데이터를입력받는메서드

111 static void inputrecord() { System.out.println("1. 학생성적입력하기"); System.out.println(" 이름, 반, 번호, 국어성적, 영어성적, 수학성적' 의순서로공백없이입력하세요."); System.out.println(" 입력을마치려면 q 를입력하세요. 메인화면으로돌아갑니다."); while(true) { System.out.print(">>"); /* (2) 아래의로직에맞게코드를작성하시오. 1. Scanner 를이용해서화면으로부터데이터를입력받는다.(',' 를구분자로) 2. 입력받은값이 q 또는 Q 이면메서드를종료하고, 그렇지않으면입력받은값으로 Student인스턴스를생성하고 record 에추가한다. 3. 입력받은데이터에서예외가발생하면, " 입력오류입니다." 를보여주고다시입력받는다. 4. q 또는 Q가입력될때까지 2~3 의작업을반복한다. */ // end of while // public static void inputrecord() { // 데이터목록을보여주는메서드 static void displayrecord() { int koreantotal = 0; int englishtotal = 0; int mathtotal = 0; int total = 0; int length = record.size(); if(length > 0) { System.out.println(); System.out.println(" 이름반번호국어영어수학총점평균전교등수반등수"); System.out.println("===================================================="); for (int i = 0; i < length ; i++) { Student student = (Student)record.get(i); System.out.println(student); koreantotal += student.kor; mathtotal += student.math; englishtotal += student.eng; total += student.total; System.out.println("===================================================="); System.out.println(" 총점: "+koreantotal+" "+englishtotal +" "+mathtotal+" "+total); System.out.println(); else { System.out.println("===================================================="); System.out.println(" 데이터가없습니다."); System.out.println("===================================================="); // static void displayrecord() {

112 class Student implements Comparable { String name; int ban; int no; int kor; int eng; int math; int total; int schoolrank; int classrank; // 반등수 Student(String name, int ban, int no, int kor, int eng, int math) { this.name = name; this.ban = ban; this.no = no; this.kor = kor; this.eng = eng; this.math = math; total = kor+eng+math; int gettotal() { return total; float getaverage() { return (int)((gettotal()/ 3f)*10+0.5)/10f; public int compareto(object o) { if(o instanceof Student) { Student tmp = (Student)o; return tmp.total - this.total; else { return -1; public String tostring() { return name +","+ban +","+no +","+kor +","+eng +","+math +","+gettotal() +","+getaverage() +","+schoolrank +","+classrank ; // class Student

113 [ 실행결과] ************************************************** * 성적관리프로그램 * ************************************************** 1. 학생성적입력하기 2. 학생성적보기 3. 프로그램종료 원하는메뉴를선택하세요.(1~3) : 5 메뉴를잘못선택하셨습니다. 다시입력해주세요. 원하는메뉴를선택하세요.(1~3) : 2 ==================================================== 데이터가없습니다. ==================================================== ************************************************** * 성적관리프로그램 * ************************************************** 1. 학생성적입력하기 2. 학생성적보기 3. 프로그램종료 원하는메뉴를선택하세요.(1~3) : 1 1. 학생성적입력하기이름, 반, 번호, 국어성적, 영어성적, 수학성적' 의순서로공백없이입력하세요. 입력을마치려면 q 를입력하세요. 메인화면으로돌아갑니다. >> 입력오류입니다. 이름, 반, 번호, 국어성적, 영어성적, 수학성적' 의순서로입력하세요. >> 자바짱,1,1,100,100,100 잘입력되었습니다. 입력을마치려면 q 를입력하세요. >> 김자바,1,2,80,80,80 잘입력되었습니다. 입력을마치려면 q 를입력하세요. >>q ************************************************** * 성적관리프로그램 * ************************************************** 1. 학생성적입력하기 2. 학생성적보기 3. 프로그램종료 원하는메뉴를선택하세요.(1~3) : 2 이름반번호국어영어수학총점평균전교등수반등수 ==================================================== 자바짱,1,1,100,100,100,300,100.0,0,0 김자바,1,2,80,80,80,240,80.0,0,0 ====================================================

114 총점 : 180 180 180 540 ************************************************** * 성적관리프로그램 * ************************************************** 1. 학생성적입력하기 2. 학생성적보기 3. 프로그램종료 원하는메뉴를선택하세요.(1~3) : 3 프로그램을종료합니다.

115 Chapter 지네릭스, 열거형, 애너테이션 Generics, Enumeration, Annotation

116 [ 연습문제 ] [12-1] 클래스 Box 가다음과같이정의되어있을때, 다음중오류가발생하는문장은? 경고가발생하는문장은? class Box<T> { // 지네릭타입 T를선언 T item; void setitem(t item) { this.item = item; T getitem() { return item; a. Box<Object> b = new Box<String>(); b. Box<Object> b = (Object)new Box<String>(); c. new Box<String>().setItem(new Object()); d. new Box<String>().setItem("ABC"); [12-2] 지네릭메서드 makejuice() 가아래와같이정의되어있을때, 이메서드를올바 르게호출한문장을모두고르시오. (Apple과 Grape는 Fruit 의자손이라고가정하자.) class Juicer { static <T extends Fruit> String makejuice(fruitbox<t> box) { String tmp = ""; for(fruit f : box.getlist()) tmp += f + " "; return tmp; a. Juicer.<Apple>makeJuice(new FruitBox<Fruit>()); b. Juicer.<Fruit>makeJuice(new FruitBox<Grape>()); c. Juicer.<Fruit>makeJuice(new FruitBox<Fruit>()); d. Juicer.makeJuice(new FruitBox<Apple>()); e. Juicer.makeJuice(new FruitBox<Object>()); [12-3] 다음중올바르지않은문장을모두고르시오. class Box<T extends Fruit> { // 지네릭타입 T를선언 T item; void setitem(t item) { this.item = item; T getitem() { return item; a. Box<?> b = new Box(); b. Box<?> b = new Box<>(); c. Box<?> b = new Box<Object>(); d. Box<Object> b = new Box<Fruit>(); e. Box b = new Box<Fruit>(); f. Box<? extends Fruit> b = new Box<Apple>(); g. Box<? extends Object> b = new Box<? extends Fruit>();

117 [12-4] 아래의메서드는두개의 ArrayList 를매개변수로받아서, 하나의새로운 ArrayList 로병합하는메서드이다. 이를지네릭메서드로변경하시오. public static ArrayList<? extends Product> merge( ArrayList<? extends Product> list, ArrayList<? extends Product> list2) { ArrayList<? extends Product> newlist = new ArrayList<>(list); newlist.addall(list2); return newlist; [12-5] 아래는예제7-3에열거형 Kind와 Number 를새로정의하여적용한것이다. (1) 에 알맞은코드를넣어예제를완성하시오. (Math.random() 을사용했으므로실행결과가달라 질수있다.) [ 연습문제]/ch12/Exercise12_5.java class DeckTest { public static void main(string args[]) { Deck d = new Deck(); // 카드한벌(Deck) 을만든다. Card c = d.pick(0); // 섞기전에제일위의카드를뽑는다. System.out.println(c); // System.out.println(c.toString()); 과같다. d.shuffle(); // 카드를섞는다. c = d.pick(0); // 섞은후에제일위의카드를뽑는다. System.out.println(c); class Deck { final int CARD_NUM = Card.Kind.values().length * Card.Number.values().length; // 카드의개수 Card cardarr[] = new Card[CARD_NUM]; // Card객체배열을포함 Deck () { /* (1) 알맞은코드를넣어서완성하시오. Deck 의카드를초기화한다. */ Card pick(int index) { // 지정된위치(index) 에있는카드하나를꺼내서반환 return cardarr[index]; Card pick() { // Deck 에서카드하나를선택한다. int index = (int)(math.random() * CARD_NUM); return pick(index); 카드의순서를섞는다 void shuffle() { //. for(int i=0; i < cardarr.length; i++) { int r = (int)(math.random() * CARD_NUM);

118 Card temp = cardarr[i]; cardarr[i] = cardarr[r]; cardarr[r] = temp; // Deck클래스의끝 // Card 클래스 class Card { enum Kind { CLOVER, HEART, DIAMOND, SPADE enum Number { ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING Kind kind; Number num; Card() { this(kind.spade, Number.ACE); Card(Kind kind, Number num) { this.kind = kind; this.num = num; public String tostring() { return "[" + kind.name() + "," + num.name() + "]"; // tostring() 의끝 // Card 클래스의끝 실행결과 [ ] [CLOVER,ACE] [HEART,TEN] [12-6] 다음중메타애너테이션이아닌것을모두고르시오. a. Documented b. Target c. Native d. Inherited

119 [12-7] 애너테이션 TestInfo 가다음과같이정의되어있을대, 이애너테이션이올바르 게적용되지않은것은? @interface TestInfo { int count() default 1; String[] value() default "aaa"; a. @TestInfo class Exercise12_7 { b. @TestInfo(1) class Exercise12_7 { c. @TestInfo("bbb") class Exercise12_7 { d. @TestInfo("bbb","ccc") class Exercise12_7 {