2 Java 의정석定石 2 판 - 연습문제풀이 안녕하십니까? Java 의정석의저자남궁성입니다. 요즘제가 Java예제를정리한 Java1000제를집필하고있는데요. Java의정석에연습문제가있었으면좋겠다는독자분들의요청을많이받았습니다. 그래서 Java1000제의일부를연습문제로만

Size: px
Start display at page:

Download "2 Java 의정석定石 2 판 - 연습문제풀이 안녕하십니까? Java 의정석의저자남궁성입니다. 요즘제가 Java예제를정리한 Java1000제를집필하고있는데요. Java의정석에연습문제가있었으면좋겠다는독자분들의요청을많이받았습니다. 그래서 Java1000제의일부를연습문제로만"

Transcription

1 Java 의정석定石 2 판 - 연습문제풀이 1 연습문제풀이 ver v1

2 2 Java 의정석定石 2 판 - 연습문제풀이 안녕하십니까? Java 의정석의저자남궁성입니다. 요즘제가 Java예제를정리한 Java1000제를집필하고있는데요. Java의정석에연습문제가있었으면좋겠다는독자분들의요청을많이받았습니다. 그래서 Java1000제의일부를연습문제로만들어서추가한 Java의정석 2판을펴내게되었습니다. 연습문제풀이를작성하다보니기존의연습문제에부족한부분도있고해서약간보완을했습니다. 책의연습문제를풀기전에이문서의연습문제도함께보실것을부탁드리는바입니다. 연습문제의답만간단히적는것보다는보다자세한풀이과정을넣는것이좋을것같아서작성하는데시간이좀오래걸렸습니다.(Java의정석을보지않은사람도이해할수있도록설명하고자노력하였습니다.) 앞으로부족했던동영상도곧마무리하겠습니다.( 예제소스나동영상및강의자료ppt등은 castello /javachobo로로그인하시면얻을수있습니다.) 연습문제가좀어려우실수도있는데, 책안에답이있는경우가많이있습니다. 문제가안풀릴때는책을다시한번살펴보시고요. 바로답을보기보다는제가운영하는카페 자바초보스터디 ( 에오셔서질문하시면힌트를드리겠습니다. 연습문제를못푼다고해서큰문제가되는것은아닙니다. 고민하고생각하고자신의생각을정리하는방법을배우는것이중요한것이죠. 프로그래밍이라는것은반드시창의적일필요는없다고생각합니다. 기존의것을잘활용하는것으로도충분합니다. 문제의답을보고, 아, 이렇게하는구나. 라고이해하시고비슷한상황에서응용하실수있으면됩니다. 이문서는 e-book의특성을살려서시간되는대로틈틈이업데이트할예정입니다. 첫번째페이지의버전을꼭확인해주세요. 그리고좋은문제나오탈자, 문제점등이있으면 castello@naver.com으로메일주세요. 단, 메일로질문은사절합니다. 질문은카페게시판을이용해주세요. 마지막으로이문서는상업적인용도가아닌경우에는얼마든지자유롭게배포하실수있 습니다. 이문서가 Java 를공부하시는많은분들에게도움이되길바랍니다. 감사합니다 년 3 월 10 일 남궁성

3 Java 의정석定石 2 판 - 연습문제풀이 3 [ 개정이력 ] Java 의정석 2 판의연습문제를바탕으로처음으로작성. (ver v1)

4 4 Java 의정석定石 2 판 - 연습문제풀이 [How to use] 연습문제의답을보다가원하지않는다른답을보게되지않도록배려했습니다. 북마크 를이용해서원하는문제의답으로바로이동하시기바랍니다. 연습문제의답을보려면, 아래의그림처럼 Acrobat Reader 로본문서를열어놓은상태에 서좌측의북마크아이콘을클릭합니다. 그러면아래의그림과같이북마크의목록이나타납니다. 여기서 연습문제풀이 의옆에있는 '+' 를펼치면각장별로연습문제의답의북마크가저장되어있습니다. 예를들어문제10-1의답을보고싶다면, 10장내부클래스 옆의 + 를눌러서해당문제를클릭하면됩니다.

5 Java 의정석定石 2 판 - 연습문제풀이 5 Chapter 2 변수 Variable

6 6 Java 의정석定石 2 판 - 연습문제풀이 [ 연습문제 ] [2-1] 다음표의빈칸에 8 개의기본형 (primitive type) 을알맞은자리에넣으시오. 종류 논리형 크기 1 byte 2 byte 4 byte 8 byte 문자형 정수형 실수형 [2-2] 주민등록번호를숫자로저장하고자한다. 이값을저장하기위해서는어떤자료형 (data type) 을선택해야할까? regno 라는이름의변수를선언하고자신의주민등록번호로 초기화하는한줄의코드를적으시오. [2-3] 다음의문장에서리터럴, 변수, 상수, 키워드를적으시오. int i = 100; long l =100L; final float PI = 3.14f; - 리터럴 : - 변수 : - 키워드 : - 상수 : [2-4] 다음중기본형 (primitive type) 이아닌것은? a. int b. Byte c. double d. boolean [2-5] 다음문장들의출력결과를적으세요. 오류가있는문장의경우, 괄호안에 오 류 라고적으시오. System.out.println( ) ( ) System.out.println(true + ) ( ) System.out.println( A' + 'B') ( ) System.out.println('1' + 2) ( ) System.out.println('1' + '2') ( ) System.out.println('J' + ava ) ( ) System.out.println(true + null) ( )

7 Java 의정석定石 2 판 - 연습문제풀이 7 [2-6] 다음중키워드가아닌것은?( 모두고르시오 ) a. if b. True c. NULL d. Class e. System [2-7] 다음중변수의이름으로사용할수있는것은? ( 모두고르시오 ) a. $ystem b. channel#5 c. 7eleven d. If e. 자바 f. new g. $MAX_NUM h. hello@com [2-8] 참조형변수 (reference type) 와같은크기의기본형 (primitive type) 은? ( 모두고르시오 ) a. int b. long c. short d. float e. double [2-9] 다음중형변환을생략할수있는것은? ( 모두고르시오 ) byte b = 10; char ch = 'A'; int i = 100; long l = 1000L; a. b = (byte)i; b. ch = (char)b; c. short s = (short)ch; d. float f = (float)l; e. i = (int)ch; [2-10] char 타입의변수에저장될수있는정수값의범위는? (10 진수로적으시오 )

8 8 Java 의정석定石 2 판 - 연습문제풀이 [2-11] 다음중변수를잘못초기화한것은? ( 모두고르시오 ) a. byte b = 256; b. char c = ''; c. char answer = 'no'; d. float f = 3.14 e. double d = 1.4e3f; [2-12] 다음중 main메서드의선언부로알맞은것은? ( 모두고르시오 ) a. public static void main(string[] args) b. public static void main(string args[]) c. public static void main(string[] arv) d. public void static main(string[] args) e. static public void main(string[] args) [2-13] 다음중타입과기본값이잘못연결된것은? ( 모두고르시오 ) a. boolean - false b. char - '\u0000' c. float d. int - 0 e. long - 0 f. String - ""

9 Java 의정석定石 2 판 - 연습문제풀이 9 Chapter 3 연산자 Operator

10 10 Java 의정석定石 2 판 - 연습문제풀이 [ 연습문제 ] [3-1] 다음연산의결과를적으시오. [ 연습문제 ]/ch3/exercise3_1.java class Exercise3_1 { public static void main(string[] args) { int x = 2; int y = 5; char c = 'A'; // 'A' 의문자코드는 65 System.out.println(1 + x << 33); System.out.println(y >= 5 x < 0 && x > 2); System.out.println(y += 10 - x++); System.out.println(x+=2); System.out.println(!('A' <= c && c <='Z') ); System.out.println('C'-c); System.out.println('5'-'0'); System.out.println(c+1); System.out.println(++c); System.out.println(c++); System.out.println(c); [3-2] 아래의코드는사과를담는데필요한바구니 ( 버켓 ) 의수를구하는코드이다. 만일 사과의수가 123 개이고하나의바구니에는 10 개의사과를담을수있다면, 13 개의바구니 가필요할것이다. (1) 에알맞은코드를넣으시오. [ 연습문제 ]/ch3/exercise3_2.java class Exercise3_2 { public static void main(string[] args) { int numofapples = 123; // 사과의개수 int sizeofbucket = 10; // 바구니의크기 ( 바구니에담을수있는사과의개수 ) int numofbucket = ( /* (1) */ ); // 모든사과를담는데필요한바구니의수 System.out.println(" 필요한바구니의수 :"+numofbucket); [ 실행결과 ] 13

11 Java 의정석定石 2 판 - 연습문제풀이 11 [3-3] 아래는변수 num 의값에따라 양수, 음수, 0 을출력하는코드이다. 삼항연산 자를이용해서 (1) 에알맞은코드를넣으시오. [Hint] 삼항연산자를두번사용하라. [ 연습문제 ]/ch3/exercise3_3.java class Exercise3_3 { public static void main(string[] args) { int num = 10; System.out.println( /* (1) */ ); [ 실행결과 ] 양수 [3-4] 아래는변수 num 의값중에서백의자리이하를버리는코드이다. 만일변수 num 의값이 456 이라면 400 이되고, 111 이라면 100 이된다. (1) 에알맞은코드를넣으 시오. [ 연습문제 ]/ch3/exercise3_4.java class Exercise3_4 { public static void main(string[] args) { int num = 456; System.out.println( /* (1) */ ); [ 실행결과 ] 400 [3-5] 아래는변수 num 의값중에서일의자리를 1 로바꾸는코드이다. 만일변수 num 의 값이 333 이라면 331 이되고, 777 이라면 771 이된다. (1) 에알맞은코드를넣으시오. [ 연습문제 ]/ch3/exercise3_5.java class Exercise3_5 { public static void main(string[] args) { int num = 333; System.out.println( /* (1) */ ); [ 실행결과 ] 331

12 12 Java 의정석定石 2 판 - 연습문제풀이 [3-6] 아래는변수 num의값보다크면서도가장가까운 10의배수에서변수 num의값을뺀나머지를구하는코드이다. 예를들어, 24의크면서도가장가까운 10의배수는 30이다. 19의경우 20이고, 81의경우 90이된다. 30에서 24를뺀나머지는 6이기때문에변수 num의값이 24라면 6을결과로얻어야한다. (1) 에알맞은코드를넣으시오. [Hint] 나머지연산자를사용하라. [ 연습문제 ]/ch3/exercise3_6.java class Exercise3_6 { public static void main(string[] args) { int num = 24; System.out.println( /* (1) */ ); [ 실행결과 ] 6 [3-7] 아래는화씨 (Fahrenheit) 를섭씨 (Celcius) 로변환하는코드이다. 변환공식이 'C = 5/9 (F - 32)' 라고할때, (1) 에알맞은코드를넣으시오. 단, 변환결과값은소수점 셋째자리에서반올림해야한다.(Math.round() 를사용하지않고처리할것 ) [ 연습문제 ]/ch3/exercise3_7.java class Exercise3_7 { public static void main(string[] args) { int fahrenheit = 100; float celcius = ( /* (1) */ ); System.out.println("Fahrenheit:"+fahrenheit); System.out.println("Celcius:"+celcius); [ 실행결과 ] Fahrenheit:100 Celcius:37.78

13 Java 의정석定石 2 판 - 연습문제풀이 13 [3-8] 아래코드의문제점을수정해서실행결과와같은결과를얻도록하시오. [ 연습문제 ]/ch3/exercise3_8.java class Exercise3_8 { public static void main(string[] args) { byte a = 10; byte b = 20; byte c = a + b; char ch = 'A'; ch = ch + 2; float f = 3 / 2; long l = 3000 * 3000 * 3000; float f2 = 0.1f; double d = 0.1; boolean result = d==f2; System.out.println("c="+c); System.out.println("ch="+ch); System.out.println("f="+f); System.out.println("l="+l); System.out.println("result="+result); [ 실행결과 ] c=30 ch=c f=1.5 l = result=true [3-9] 다음은문자형변수 ch 가영문자 ( 대문자또는소문자 ) 이거나숫자일때만변수 b 의값이 true 가되도록하는코드이다. (1) 에알맞은코드를넣으시오. [ 연습문제 ]/ch3/exercise3_9.java class Exercise3_9 { public static void main(string[] args) { char ch = 'z'; boolean b = ( /* (1) */ ); System.out.println(b); [ 실행결과 ] true

14 14 Java 의정석定石 2 판 - 연습문제풀이 [3-10] 다음은소문자를대문자로변경하는코드인데, 문자 ch 에저장된문자가대문자 인경우에만소문자로변경한다. 문자코드는소문자가대문자보다 32 만큼더크다. 예를 들어 'A 의코드는 65 이고 a' 의코드는 97 이다. (1)~(2) 에알맞은코드를넣으시오. [ 연습문제 ]/ch3/exercise3_10.java class Exercise3_10 { public static void main(string[] args) { char ch = 'A'; char lowercase = ( /* (1) */ )? ( /* (2) */ ) : ch; System.out.println("upperCase:"+ch); System.out.println("lowerCase:"+lowerCase); [ 실행결과 ] uppercase:a lowercase:a

15 Java 의정석定石 2 판 - 연습문제풀이 15 Chapter 4 조건문과반복문 if, switch, for, while

16 16 Java 의정석定石 2 판 - 연습문제풀이 [ 연습문제 ] [4-1] 다음의문장들을조건식으로표현하라. 1. int형변수 x가 10보다크고 20보다작을때 true인조건식 2. char형변수 ch가공백이나탭이아닐때 true인조건식 3. char형변수 ch가 x' 또는 X' 일때 true인조건식 4. char형변수 ch가숫자 ( 0 ~ 9 ) 일때 true인조건식 5. char형변수 ch가영문자 ( 대문자또는소문자 ) 일때 true인조건식 6. int형변수 year가 400으로나눠떨어지거나또는 4로나눠떨어지고 100으로나눠떨어지지않을때 true인조건식 7. boolean형변수 poweron가 false일때 true인조건식 8. 문자열참조변수 str이 yes 일때 true인조건식 [4-2] 1 부터 20 까지의정수중에서 2 또는 3 의배수가아닌수의총합을구하시오. [4-3] 1+(1+2)+(1+2+3)+( )+...+( ) 의결과를계산하시오. [4-4] 1+(-2)+3+(-4)+... 과같은식으로계속더해나갔을때, 몇까지더해야총합이 100 이상이되는지구하시오. [4-5] 다음의 for 문을 while 문으로변경하시오. [ 연습문제 ]/ch4/exercise4_5.java public class Exercise4_5 { public static void main(string[] args) { for(int i=0; i<=10; i++) { for(int j=0; j<=i; j++) System.out.print("*"); System.out.println(); // end of main // end of class [4-6] 두개의주사위를던졌을때, 눈의합이 6 이되는모든경우의수를출력하는프 로그램을작성하시오.

17 Java 의정석定石 2 판 - 연습문제풀이 17 [4-7] Math.random() 을이용해서 1 부터 6 사이의임의의정수를변수 value 에저장하는 코드를완성하라. (1) 에알맞은코드를넣으시오. [ 연습문제 ]/ch4/exercise4_7.java class Exercise4_7 { public static void main(string[] args) { int value = ( /* (1) */ ); System.out.println("value:"+value); [4-8] 방정식 2x+4y=10 의모든해를구하시오. 단, x 와 y 는정수이고각각의범위는 0<=x<=10, 0<=y<=10 이다. [ 실행결과 ] x=1, y=2 x=3, y=1 x=5, y=0 [4-9] 숫자로이루어진문자열 str이있을때, 각자리의합을더한결과를출력하는코드를완성하라. 만일문자열이 "12345" 라면, 의결과인 15를출력이출력되어야한다. (1) 에알맞은코드를넣으시오. [Hint] String 클래스의 charat(int i) 을사용 [ 연습문제 ]/ch4/exercise4_9.java class Exercise4_9 { public static void main(string[] args) { String str = "12345"; int sum = 0; for(int i=0; i < str.length(); i++) { /* (1) 알맞은코드를넣어완성하시오. */ System.out.println("sum="+sum); [ 실행결과 ] 15

18 18 Java 의정석定石 2 판 - 연습문제풀이 [4-10] int 타입의변수 num 이있을때, 각자리의합을더한결과를출력하는코드를 완성하라. 만일변수 num 의값이 라면, 의결과인 15 를출력하라. (1) 에알맞은코드를넣으시오. [ 주의 ] 문자열로변환하지말고숫자로만처리해야한다. [ 연습문제 ]/ch4/exercise4_10.java class Exercise4_10 { public static void main(string[] args) { int num = 12345; int sum = 0; /* (1) 알맞은코드를넣어완성하시오. */ System.out.println("sum="+sum); [ 실행결과 ] 15 [4-11] 피보나치 (Fibonnaci) 수열 ( 數列 ) 은앞을두수를더해서다음수를만들어나가는수열이다. 예를들어앞의두수가 1과 1이라면그다음수는 2가되고그다음수는 1과 2를더해서 3이되어서 1,1,2,3,5,8,13,21,... 과같은식으로진행된다. 1과 1부터시작하는피보나치수열의 10번째수는무엇인지계산하는프로그램을완성하시오. [ 연습문제 ]/ch4/exercise4_11.java public class Exercise4_11 { public static void main(string[] args) { // Fibonnaci 수열의시작의첫두숫자를 1, 1 로한다. int num1 = 1; int num2 = 1; int num3 = 0; // 세번째값 System.out.print(num1+","+num2); for (int i = 0 ; i < 8 ; i++ ) { /* (1) 알맞은코드를넣어완성하시오. */ // end of main // end of class [ 실행결과 ] 1,1,2,3,5,8,13,21,34,55

19 Java 의정석定石 2 판 - 연습문제풀이 19 [4-12] 구구단의일부분을다음과같이출력하시오. [ 실행결과 ] 2*1=2 3*1=3 4*1=4 2*2=4 3*2=6 4*2=8 2*3=6 3*3=9 4*3=12 5*1=5 6*1=6 7*1=7 5*2=10 6*2=12 7*2=14 5*3=15 6*3=18 7*3=21 8*1=8 9*1=9 8*2=16 9*2=18 8*3=24 9*3=27 [4-13] 다음은주어진문자열 (value) 이숫자인지를판별하는프로그램이다. (1) 에알맞 은코드를넣어서프로그램을완성하시오. [ 연습문제 ]/ch4/exercise4_13.java class Exercise4_13 { public static void main(string[] args) { String value = "12o34"; char ch = ' '; boolean isnumber = true; // 반복문과 charat(int i) 를이용해서문자열의문자를 // 하나씩읽어서검사한다. for(int i=0; i < value.length() ;i++) { /* (1) 알맞은코드를넣어완성하시오. */ if (isnumber) { System.out.println(value+" 는숫자입니다."); else { System.out.println(value+" 는숫자가아닙니다."); // end of main // end of class [ 실행결과 ] 12o34 는숫자가아닙니다.

20 20 Java 의정석定石 2 판 - 연습문제풀이 [4-14] 다음은숫자맞추기게임을작성한것이다. 1과 100사이의값을반복적으로입력해서컴퓨터가생각한값을맞추면게임이끝난다. 사용자가값을입력하면, 컴퓨터는자신이생각한값과비교해서결과를알려준다. 사용자가컴퓨터가생각한숫자를맞추면게임이끝나고몇번만에숫자를맞췄는지알려준다. (1)~(2) 에알맞은코드를넣어프로그램을완성하시오. [ 연습문제 ]/ch4/exercise4_14.java class Excercise4_14 { public static void main(string[] args) { // 1~100사이의임의의값을얻어서 answer에저장한다. int answer = /* (1) */; int input = 0; // 사용자입력을저장할공간 int count = 0; // 시도횟수를세기위한변수 // 화면으로부터사용자입력을받기위해서 Scanner 클래스사용 java.util.scanner s = new java.util.scanner(system.in); do { count++; System.out.print("1 과 100 사이의값을입력하세요 :"); input = s.nextint(); // 입력받은값을변수 input 에저장한다. /* (2) 알맞은코드를넣어완성하시오. */ while(true); // 무한반복문 // end of main // end of class HighLow [ 실행결과 ] 1 과 100 사이의값을입력하세요 :50 더큰수를입력하세요. 1 과 100 사이의값을입력하세요 :75 더큰수를입력하세요. 1 과 100 사이의값을입력하세요 :87 더작은수를입력하세요. 1 과 100 사이의값을입력하세요 :80 더작은수를입력하세요. 1 과 100 사이의값을입력하세요 :77 더작은수를입력하세요. 1 과 100 사이의값을입력하세요 :76 맞췄습니다. 시도횟수는 6 번입니다.

21 Java 의정석定石 2 판 - 연습문제풀이 21 [4-15] 다음은회문수를구하는프로그램이다. 회문수 (palindrome) 란, 숫자를거꾸로읽어도앞으로읽는것과같은수를말한다. 예를들면 이나 같은수를말한다. (1) 에알맞은코드를넣어서프로그램을완성하시오. [Hint] 나머지연산자를이용하시오. [ 연습문제 ]/ch4/exercise4_15.java class Exercise4_15 { public static void main(string[] args) { int number = 12321; int tmp = number; int result =0; // 변수 number 를거꾸로변환해서담을변수 while(tmp!=0) { /* (1) 알맞은코드를넣어완성하시오. */ if(number == result) System.out.println( number + " 는회문수입니다."); else System.out.println( number + " 는회문수가아닙니다."); // main [ 실행결과 ] 는회문수입니다.

22 22 Java 의정석定石 2 판 - 연습문제풀이 Chapter 5 배열 Array

23 Java 의정석定石 2 판 - 연습문제풀이 23 [ 연습문제 ] [5-1] 다음은배열을선언하거나초기화한것이다. 잘못된것을고르고그이유를설명하시오. a. int[] arr[]; b. int[] arr = {1,2,3,; c. int[] arr = new int[5]; d. int[] arr = new int[5]{1,2,3,4,5; e. int arr[5]; f. int[] arr[] = new int[3][]; [5-2] 다음과같은배열이있을때, arr[3].length 의값은얼마인가? int[][] arr = { { 5, 5, 5, 5, 5, { 10, 10, 10, { 20, 20, 20, 20, { 30, 30 ; [5-3] 배열 arr 에담긴모든값을더하는프로그램을완성하시오. [ 연습문제 ]/ch5/exercise5_3.java class Exercise5_3 { public static void main(string[] args) { int[] arr = {10, 20, 30, 40, 50; int sum = 0; /* */ (1) 알맞은코드를넣어완성하시오. System.out.println("sum="+sum); [ 실행결과 ] sum=150

24 24 Java 의정석定石 2 판 - 연습문제풀이 [5-4] 2 차원배열 arr2 에담긴모든값의총합과평균을구하는프로그램을완성하시오. [ 연습문제 ]/ch5/exercise5_4.java class Exercise5_4 { public static void main(string[] args) { int[][] arr = { { 5, 5, 5, 5, 5, {10,10,10,10,10, {20,20,20,20,20, {30,30,30,30,30 ; int total = 0; float average = 0; /* */ (1) 알맞은코드를넣어완성하시오. System.out.println("totat="+total); System.out.println("average="+average); // end of main // end of class [ 실행결과 ] totat=325 average=16.25

25 Java 의정석定石 2 판 - 연습문제풀이 25 [5-5] 다음은 1 과 9 사이의중복되지않은숫자로이루어진 3 자리숫자를만들어내는프 로그램이다. (1)~(2) 에알맞은코드를넣어서프로그램을완성하시오. [ 참고 ] Math.random() 을사용했기때문에실행결과와다를수있다. [ 연습문제 ]/ch5/exercise5_5.java class Exercise5_5 { public static void main(string[] args) { int[] ballarr = {1,2,3,4,5,6,7,8,9; int[] ball3 = new int[3]; // 배열 ballarr 의임의의요소 2 개를골라서위치를바꾼다. 20 번반복 for(int x=0;x < 20;x++) { int i = (int)(math.random() * ballarr.length); int j = (int)(math.random() * ballarr.length); int tmp = 0; /* */ (1) 알맞은코드를넣어완성하시오. // 배열 ballarr 의앞에서 3 개의수를배열 ball3 로복사한다. /* (2) */ for(int i=0;i<ball3.length;i++) { System.out.print(ball3[i]); // end of main // end of class [ 실행결과 ] 486

26 26 Java 의정석定石 2 판 - 연습문제풀이 [5-6] 다음은거스름돈을몇개의동전으로지불할수있는지를계산하는문제이다. 변수 money의금액을동전으로바꾸었을때각각몇개의동전이필요한지계산해서출력하라. 단, 가능한한적은수의동전으로거슬러주어야한다. (1) 에알맞은코드를넣어서프로그램을완성하시오. [Hint] 나눗셈연산자와나머지연산자를사용해야한다. [ 연습문제 ]/ch5/exercise5_6.java class Exercise5_6 { public static void main(string args[]) { // 큰금액의동전을우선적으로거슬러줘야한다. int[] coinunit = {500, 100, 50, 10; int money = 2680; System.out.println("money="+money); for(int i=0;i<coinunit.length;i++) { /* (1) 알맞은코드를넣어완성하시오. */ // main [ 실행결과 ] money= 원 : 원 : 1 50 원 : 1 10 원 : 3

27 Java 의정석定石 2 판 - 연습문제풀이 27 [5-7] 문제 5-6에동전의개수를추가한프로그램이다. 커맨드라인으로부터거슬러줄금액을입력받아계산한다. 보유한동전의개수로거스름돈을지불할수없으면, 거스름돈이부족합니다. 라고출력하고종료한다. 지불할돈이충분히있으면, 거스름돈을지불한만큼가진돈에서빼고남은동전의개수를화면에출력한다. (1) 에알맞은코드를넣어서프로그램을완성하시오. [ 연습문제 ]/ch5/exercise5_7.java class Exercise5_7 { public static void main(string args[]) { if(args.length!=1) { System.out.println("USAGE: java Exercise5_7 3120"); System.exit(0); // 문자열을숫자로변환한다. 입력한값이숫자가아닐경우예외가발생한다. int money = Integer.parseInt(args[0]); System.out.println("money="+money); int[] coinunit = {500, 100, 50, 10 ; // 동전의단위 int[] coin = {5, 5, 5, 5; // 단위별동전의개수 for(int i=0;i<coinunit.length;i++) { int coinnum = 0; /* (1) 아래의로직에맞게코드를작성하시오. 1. 금액 (money) 을동전단위로나눠서필요한동전의개수 (coinnum) 를구한다. 2. 배열 coin 에서 coinnum 만큼의동전을뺀다. ( 만일충분한동전이없다면배열 coin 에있는만큼만뺀다.) 3. 금액에서동전의개수 (coinnum) 와동전단위를곱한값을뺀다. */ System.out.println(coinUnit[i]+" 원 : "+coinnum); if(money > 0) { System.out.println(" 거스름돈이부족합니다."); System.exit(0); // 프로그램을종료한다. System.out.println("= 남은동전의개수 ="); for(int i=0;i<coinunit.length;i++) { System.out.println(coinUnit[i]+" 원 :"+coin[i]); // main [ 참고 ] 실행결과는다음페이지에있다.

28 28 Java 의정석定石 2 판 - 연습문제풀이 [ 실행결과 ] C:\jdk1.5\work\ch5>java Exercise5_7 USAGE: java Exercise5_ C:\jdk1.5\work\ch5>java Exercise5_ money= 원 : 원 : 5 50 원 : 3 10 원 : 2 = 남은동전의개수 = 500 원 :0 100 원 :0 50 원 :2 10 원 :3 C:\jdk1.5\work\ch5>java Exercise5_ money= 원 : 원 : 5 50 원 : 5 10 원 : 5 거스름돈이부족합니다. [5-8] 다음은배열 answer 에담긴데이터를읽고각숫자의개수를세어서개수만큼 * 을찍어서그래프를그리는프로그램이다. (1)~(2) 에알맞은코드를넣어서완성하시오. [ 연습문제 ]/ch5/exercise5_8.java class Exercise5_8 { public static void main(string[] args) { int[] answer = { 1,4,4,3,1,4,4,2,1,3,2 ; int[] counter = new int[4]; for(int i=0; i < answer.length;i++) { /* (1) 알맞은코드를넣어완성하시오. */ for(int i=0; i < counter.length;i++) { /* (2) 알맞은코드를넣어완성하시오. */ System.out.println(); // end of main // end of class [ 실행결과 ] 3*** 2** 2** 4****

29 Java 의정석定石 2 판 - 연습문제풀이 29 [5-9] 주어진배열을시계방향으로 90 도회전시켜서출력하는프로그램을완성하시오. [ 연습문제 ]/ch5/exercise5_9.java class Exercise5_9 { public static void main(string[] args) { char[][] star = { {'*','*',' ',' ',' ', {'*','*',' ',' ',' ', {'*','*','*','*','*', {'*','*','*','*','*' ; char[][] result = new char[star[0].length][star.length]; for(int i=0; i < star.length;i++) { for(int j=0; j < star[i].length;j++) { System.out.print(star[i][j]); System.out.println(); System.out.println(); for(int i=0; i < star.length;i++) { for(int j=0; j < star[i].length;j++) { /* (1) 알맞은코드를넣어완성하시오. */ for(int i=0; i < result.length;i++) { for(int j=0; j < result[i].length;j++) { System.out.print(result[i][j]); System.out.println(); // end of main // end of class [ 실행결과 ] ** ** ***** ***** **** **** ** ** **

30 30 Java 의정석定石 2 판 - 연습문제풀이 [5-10] 다음은알파벳과숫자를아래에주어진암호표로암호화하는프로그램이다. (1) 에알맞은코드를넣어서완성하시오. a b c d e f g h i j k l m n o p q r s t ` # $ % ^ & * ( ) - _ + = [ ] { u v w x y z ; :,. / q w e r t y u i o p [ 연습문제 ]/ch5/exercise5_10.java class Exercise5_10 { public static void main(string[] args) { char[] abccode = { '`','~','!','@','#','$','%','^','&','*', '(',')','-','_','+','=',' ','[',']','{', '',';',':',',','.','/'; // char[] numcode = {'q','w','e','r','t','y','u','i','o','p'; String src = "abc123"; String result = ""; // 문자열 src 의문자를 charat() 으로하나씩읽어서변환후 result 에저장 for(int i=0; i < src.length();i++) { char ch = src.charat(i); /* (1) 알맞은코드를넣어완성하시오. */ System.out.println("src:"+src); System.out.println("result:"+result); // end of main // end of class [ 실행결과 ] src:abc123 result:`~!wer

31 Java 의정석定石 2 판 - 연습문제풀이 31 [5-11] 주어진 2 차원배열의데이터보다가로와세로로 1 이더큰배열을생성해서배열 의행과열의마지막요소에각열과행의총합을저장하고출력하는프로그램이다. (1) 에알맞은코드를넣어서완성하시오. [ 연습문제 ]/ch5/exercise5_11.java class Exercise5_11 { public static void main(string[] args) { int[][] score = { {100, 100, 100, {20, 20, 20, {30, 30, 30, {40, 40, 40, {50, 50, 50 ; int[][] result = new int[score.length+1][score[0].length+1]; for(int i=0; i < score.length;i++) { for(int j=0; j < score[i].length;j++) { /* (1) 알맞은코드를넣어완성하시오. */ for(int i=0; i < result.length;i++) { for(int j=0; j < result[i].length;j++) { System.out.printf("%4d",result[i][j]); System.out.println(); // main [ 실행결과 ]

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

33 Java 의정석定石 2 판 - 연습문제풀이 33 [ 연습문제 ] [6-1] 다음과같은멤버변수를갖는 SutdaCard클래스를정의하시오. 타입 변수명 설명 int num 카드의숫자.(1~10사이의정수 ) boolean iskwang 광 ( 光 ) 이면 true, 아니면 false [6-2] 문제 6-1 에서정의한 StudaCard 클래스에두개의생성자와 info() 를추가해서실행 결과와같은결과를얻도록하시오. [ 연습문제 ]/ch6/exercise6_2.java class Exercise6_2 { public static void main(string args[]) { SutdaCard card1 = new SutdaCard(3, false); SutdaCard card2 = new SutdaCard(); System.out.println(card1.info()); System.out.println(card2.info()); class SutdaCard { /* (1) 알맞은코드를넣어완성하시오. */ [ 실행결과 ] 3 1K [6-3] 다음과같은멤버변수를갖는 Student 클래스를정의하시오. 타입 변수명 설명 String name 학생이름 int ban 반 int no 번호 int kor 국어점수 int eng 영어점수 int math 수학점수

34 34 Java 의정석定石 2 판 - 연습문제풀이 [6-4] 문제 6-3 에서정의한 Student 클래스에다음과같이정의된두개의메서드 gettotal() 과 getaverage() 를추가하시오. 1. 메서드명 : gettotal 기능 : 국어 (kor), 영어 (eng), 수학 (math) 의점수를모두더해서반환한다. 반환타입 : int 매개변수 : 없음 2. 메서드명 : getaverage 기능 : 총점 ( 국어점수 + 영어점수 + 수학점수 ) 을과목수로나눈평균을구한다. 소수점둘째자리에서반올림할것. 반환타입 : float 매개변수 : 없음 [ 연습문제 ]/ch6/exercise6_4.java class Exercise6_4 { public static void main(string args[]) { Student s = new Student(); s.name = " 홍길동 "; s.ban = 1; s.no = 1; s.kor = 100; s.eng = 60; s.math = 76; System.out.println(" 이름 :"+s.name); System.out.println(" 총점 :"+s.gettotal()); System.out.println(" 평균 :"+s.getaverage()); class Student { /* (1) 알맞은코드를넣어완성하시오. */ [ 실행결과 ] 이름 : 홍길동총점 :236 평균 :78.7

35 Java 의정석定石 2 판 - 연습문제풀이 35 [6-5] 다음과같은실행결과를얻도록 Student 클래스에생성자와 info() 를추가하시오. [ 연습문제 ]/ch6/exercise6_5.java class Exercise6_5 { public static void main(string args[]) { Student s = new Student(" 홍길동 ",1,1,100,60,76); System.out.println(s.info()); class Student { /* (1) 알맞은코드를넣어완성하시오. */ [ 실행결과 ] 홍길동,1,1,100,60,76,236,78.7 [6-6] 두점의거리를계산하는 getdistance() 를완성하시오. [Hint] 제곱근계산은 Math.sqrt(double a) 를사용하면된다. [ 연습문제 ]/ch6/exercise6_6.java class Exercise6_6 { // 두점 (x,y) 와 (x1,y1) 간의거리를구한다. static double getdistance(int x, int y, int x1, int y1) { /* (1) 알맞은코드를넣어완성하시오. */ public static void main(string args[]) { System.out.println(getDistance(1,1,2,2)); [ 실행결과 ]

36 36 Java 의정석定石 2 판 - 연습문제풀이 [6-7] 문제 6-6 에서작성한클래스메서드 getdistance() 를 MyPoint 클래스의인스턴스메서 드로정의하시오. [ 연습문제 ]/ch6/exercise6_7.java class MyPoint { int x; int y; MyPoint(int x, int y) { this.x = x; this.y = y; /* */ (1) 인스턴스메서드 getdistance 를작성하시오. class Exercise6_7 { public static void main(string args[]) { MyPoint p = new MyPoint(1,1); // p(1,1) 과 (2,2) 의거리를구한다. System.out.println(p.getDistance(2,2)); [ 실행결과 ] [6-8] 다음의코드에정의된변수들을종류별로구분해서적으시오. class PlayingCard { int kind; int num; static int width; static int height; PlayingCard(int k, int n) { kind = k; num = n; public static void main(string args[]) { PlayingCard card = new PlayingCard(1,1); - 클래스변수 (static 변수 ) : - 인스턴스변수 : - 지역변수 :

37 Java 의정석定石 2 판 - 연습문제풀이 37 [6-9] 다음은컴퓨터게임의병사 (marine) 를클래스로정의한것이다. 이클래스의멤버 중에 static 을붙여야하는것은어떤것들이고그이유는무엇인가? ( 단, 모든병사의공격력과방어력은같아야한다.) class Marine { int x=0, y=0; // Marine의위치좌표 (x,y) int hp = 60; // 현재체력 int weapon = 6; // 공격력 int armor = 0; // 방어력 void weaponup() { weapon++; void armorup() { armor++; void move(int x, int y) { this.x = x; this.y = y; [6-10] 다음중생성자에대한설명으로옳지않은것은? ( 모두고르시오 ) a. 모든생성자의이름은클래스의이름과동일해야한다. b. 생성자는객체를생성하기위한것이다. c. 클래스에는생성자가반드시하나이상있어야한다. d. 생성자가없는클래스는컴파일러가기본생성자를추가한다. e. 생성자는오버로딩할수없다. [6-11] 다음중 this에대한설명으로맞지않은것은? ( 모두고르시오 ) a. 객체자신을가리키는참조변수이다. b. 클래스내에서라면어디서든사용할수있다. c. 지역변수와인스턴스변수를구별할때사용한다. d. 클래스메서드내에서는사용할수없다. [6-12] 다음중오버로딩이성립하기위한조건이아닌것은? ( 모두고르시오 ) a. 메서드의이름이같아야한다. b. 매개변수의개수나타입이달라야한다. c. 리턴타입이달라야한다. d. 매개변수의이름이달라야한다.

38 38 Java 의정석定石 2 판 - 연습문제풀이 [6-13] 다음중아래의 add 메서드를올바르게오버로딩한것은? ( 모두고르시오 ) long add(int a, int b) { return a+b; a. long add(int x, int y) { return x+y; b. long add(long a, long b) { return a+b; c. int add(byte a, byte b) { return a+b; d. int add(long a, int b) { return (int)(a+b); [6-14] 다음중초기화에대한설명으로옳지않은것은? ( 모두고르시오 ) a. 멤버변수는자동초기화되므로초기화하지않고도값을참조할수있다. b. 지역변수는사용하기전에반드시초기화해야한다. c. 초기화블럭보다생성자가먼저수행된다. d. 명시적초기화를제일우선적으로고려해야한다. e. 클래스변수보다인스턴스변수가먼저초기화된다. [6-15] 다음중인스턴스변수의초기화순서가올바른것은? a. 기본값-명시적초기화-초기화블럭-생성자 b. 기본값-명시적초기화-생성자-초기화블럭 c. 기본값-초기화블럭-명시적초기화-생성자 d. 기본값-초기화블럭-생성자-명시적초기화 [6-16] 다음중지역변수에대한설명으로옳지않은것은? ( 모두고르시오 ) a. 자동초기화되므로별도의초기화가필요없다. b. 지역변수가선언된메서드가종료되면지역변수도함께소멸된다. c. 매서드의매개변수로선언된변수도지역변수이다. d. 클래스변수나인스턴스변수보다메모리부담이적다. e. 힙 (heap) 영역에생성되며가비지컬렉터에의해소멸된다. [6-17] 호출스택이다음과같은상황일때옳지않은설명은? ( 모두고르시오 ) println method1 method2 main a. 제일먼저호출스택에저장된것은 main 메서드이다. b. println 메서드를제외한나머지메서드들은모두종료된상태이다. c. method2 메서드를호출한것은 main 메서드이다. d. println 메서드가종료되면 method1 메서드가수행을재개한다. e. main-method2-method1-println 의순서로호출되었다. f. 현재실행중인메서드는 println 뿐이다.

39 Java 의정석定石 2 판 - 연습문제풀이 39 [6-18] 다음의코드를컴파일하면에러가발생한다. 컴파일에러가발생하는라인과그 이유를설명하시오. class MemberCall { int iv = 10; static int cv = 20; int iv2 = cv; static int cv2 = iv; // 라인 A static void staticmethod1() { System.out.println(cv); System.out.println(iv); // 라인 B void instancemethod1() { System.out.println(cv); System.out.println(iv); // 라인 C static void staticmethod2() { staticmethod1(); instancemethod1(); // 라인 D void instancemethod2() { staticmethod1(); // 라인 E instancemethod1(); [6-19] 다음코드의실행결과를예측하여적으시오. [ 연습문제 ]/ch6/exercise6_19.java class Exercise6_19 { public static void change(string str) { str += "456"; public static void main(string[] args) { String str = "ABC123"; System.out.println(str); change(str); System.out.println("After change:"+str);

40 40 Java 의정석定石 2 판 - 연습문제풀이 [6-20] 다음과같이정의된메서드를작성하고테스트하시오. [ 주의 ] Math.random() 을사용하는경우실행결과와다를수있음. 메서드명 : shuffle 기능 : 주어진배열에담긴값의위치를바꾸는작업을반복하여뒤섞이게한다. 처리한배열을반환한다. 반환타입 : int[] 매개변수 : int[] arr - 정수값이담긴배열 [ 연습문제 ]/ch6/exercise6_20.java class Exercise6_20 { /* (1) shuffle 메서드를작성하시오. */ public static void main(string[] args) { int[] original = {1,2,3,4,5,6,7,8,9; System.out.println(java.util.Arrays.toString(original)); int[] result = shuffle(original); System.out.println(java.util.Arrays.toString(result)); [ 실행결과 ] [1, 2, 3, 4, 5, 6, 7, 8, 9] [4, 6, 8, 3, 2, 9, 7, 1, 5] [6-21] Tv 클래스를주어진로직대로완성하시오. 완성한후에실행해서주어진실행결과 와일치하는지확인하라. [ 참고 ] 코드를단순히하기위해서유효성검사는로직에서제외했다. [ 연습문제 ]/ch6/exercise6_21.java class MyTv { boolean ispoweron; int channel; int volume; final int MAX_VOLUME = 100; final int MIN_VOLUME = 0; final int MAX_CHANNEL = 100; final int MIN_CHANNEL = 1; void turnonoff() { // (1) ispoweron 의값이 true 면 false 로, false 면 true 로바꾼다.

41 Java 의정석定石 2 판 - 연습문제풀이 41 void volumeup() { // (2) volume 의값이 MAX_VOLUME 보다작을때만값을 1 증가시킨다. void volumedown() { // (3) volume 의값이 MIN_VOLUME 보다클때만값을 1 감소시킨다. void channelup() { // (4) channel 의값을 1 증가시킨다. // 만일 channel 이 MAX_CHANNEL 이면, channel 의값을 MIN_CHANNEL 로바꾼다. void channeldown() { // (5) channel 의값을 1 감소시킨다. // 만일 channel 이 MIN_CHANNEL 이면, channel 의값을 MAX_CHANNEL 로바꾼다. // class MyTv class Exercise6_21 { public static void main(string args[]) { MyTv t = new MyTv(); t.channel = 100; t.volume = 0; System.out.println("CH:"+t.channel+", VOL:"+ t.volume); t.channeldown(); t.volumedown(); System.out.println("CH:"+t.channel+", VOL:"+ t.volume); t.volume = 100; t.channelup(); t.volumeup(); System.out.println("CH:"+t.channel+", VOL:"+ t.volume); [ 실행결과 ] CH:100, VOL:0 CH:99, VOL:0 CH:100, VOL:100

42 42 Java 의정석定石 2 판 - 연습문제풀이 [6-22] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : isnumber 기능 : 주어진문자열이모두숫자로만이루어져있는지확인한다. 모두숫자로만이루어져있으면 true 를반환하고, 그렇지않으면 false 를반환한다. 만일주어진문자열이 null 이거나빈문자열 이라면 false 를반환한다. 반환타입 : boolean 매개변수 : String str - 검사할문자열 [Hint] String 클래스의 charat(int i) 메서드를사용하면문자열의 i 번째위치한문자를얻을수있다. [ 연습문제 ]/ch6/exercise6_22.java class Exercise6_22 { /* (1) isnumber 메서드를작성하시오. */ public static void main(string[] args) { String str = "123"; System.out.println(str+" 는숫자입니까? "+isnumber(str)); str = "1234o"; System.out.println(str+" 는숫자입니까? "+isnumber(str)); [ 실행결과 ] 123 는숫자입니까? true 1234o 는숫자입니까? false [6-23] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : max 기능 : 주어진 int형배열의값중에서제일큰값을반환한다. 만일주어진배열이 null이거나크기가 0인경우, 를반환한다. 반환타입 : int 매개변수 : int[] arr - 최대값을구할배열 [ 연습문제 ]/ch6/exercise6_23.java class Exercise6_23{ /* (1) max 메서드를작성하시오. */

43 Java 의정석定石 2 판 - 연습문제풀이 43 public static void main(string[] args) { int[] data = {3,2,9,4,7; System.out.println(java.util.Arrays.toString(data)); System.out.println(" 최대값 :"+max(data)); System.out.println(" 최대값 :"+max(null)); System.out.println(" 최대값 :"+max(new int[]{)); // 크기가 0 인배열 [ 실행결과 ] [3, 2, 9, 4, 7] 최대값 :9 최대값 : 최대값 : [6-24] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : abs 기능 : 주어진값의절대값을반환한다. 반환타입 : int 매개변수 : int value [ 연습문제 ]/ch6/exercise6_24.java class Exercise6_24 { /* (1) abs 메서드를작성하시오. */ public static void main(string[] args) { int value = 5; System.out.println(value+" 의절대값 :"+abs(value)); value = -10; System.out.println(value+" 의절대값 :"+abs(value)); [ 실행결과 ] 5 의절대값 :5-10 의절대값 :10

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

45 Java 의정석定石 2 판 - 연습문제풀이 45 [ 연습문제 ] [7-1] 섯다카드 20장을포함하는섯다카드한벌 (SutdaDeck클래스) 을정의한것이다. 섯다카드 20장을담는 SutdaCard배열을초기화하시오. 단, 섯다카드는 1부터 10까지의숫자가적힌카드가한쌍씩있고, 숫자가 1, 3, 8인경우에는둘중의한장은광 (Kwang) 이어야한다. 즉, SutdaCard의인스턴스변수 iskwang의값이 true이어야한다. [ 연습문제 ]/ch7/exercise7_1.java class SutdaDeck { final int CARD_NUM = 20; SutdaCard[] cards = new SutdaCard[CARD_NUM]; SutdaDeck() { /* (1) 배열 SutdaCard 를적절히초기화하시오. */ class SutdaCard { int num; boolean iskwang; SutdaCard() { this(1, true); SutdaCard(int num, boolean iskwang) { this.num = num; this.iskwang = iskwang; // info() 대신 Object 클래스의 tostring() 을오버라이딩했다. public String tostring() { return num + ( iskwang? "K":""); class Exercise7_1 { public static void main(string args[]) { SutdaDeck deck = new SutdaDeck(); for(int i=0; i < deck.cards.length;i++) System.out.print(deck.cards[i]+","); [ 실행결과 ] 1K,2,3K,4,5,6,7,8K,9,10,1,2,3,4,5,6,7,8,9,10,

46 46 Java 의정석定石 2 판 - 연습문제풀이 [7-2] 문제 7-1 의 SutdaDeck 클래스에다음에정의된새로운메서드를추가하고테스트하 시오. [ 주의 ] Math.random() 을사용하는경우실행결과와다를수있음. 1. 메서드명 : shuffle 기능 : 배열 cards에담긴카드의위치를뒤섞는다.(math.random() 사용 ) 반환타입 : 없음매개변수 : 없음 2. 메서드명 : pick 기능 : 배열 cards에서지정된위치의 SutdaCard를반환한다. 반환타입 : SutdaCard 매개변수 : int index - 위치 3. 메서드명 : pick 기능 : 배열 cards에서임의의위치의 SutdaCard를반환한다.(Math.random() 사용 ) 반환타입 : SutdaCard 매개변수 : 없음 [ 연습문제 ]/ch7/exercise7_2.java class SutdaDeck { final int CARD_NUM = 20; SutdaCard[] cards = new SutdaCard[CARD_NUM]; SutdaDeck() { /* 문제 7-1 의답이므로내용생략 */ /* (1) 위에정의된세개의메서드를작성하시오. */ // SutdaDeck class SutdaCard { int num; boolean iskwang; SutdaCard() { this(1, true); SutdaCard(int num, boolean iskwang) { this.num = num; this.iskwang = iskwang; public String tostring() {

47 Java 의정석定石 2 판 - 연습문제풀이 47 return num + ( iskwang? "K":""); class Exercise7_2 { public static void main(string args[]) { SutdaDeck deck = new SutdaDeck(); System.out.println(deck.pick(0)); System.out.println(deck.pick()); deck.shuffle(); for(int i=0; i < deck.cards.length;i++) System.out.print(deck.cards[i]+","); System.out.println(); System.out.println(deck.pick(0)); [ 실행결과 ] 1K 7 2,6,10,1K,7,3,10,5,7,8,5,1,2,9,6,9,4,8K,4,3K, 2 [7-3] 오버라이딩의정의와필요성에대해서설명하시오. [7-4] 다음중오버라이딩의조건으로옳지않은것은? ( 모두고르시오 ) a. 조상의메서드와이름이같아야한다. b. 매개변수의수와타입이모두같아야한다. c. 리턴타입이같아야한다. d. 접근제어자는조상의메서드보다좁은범위로만변경할수있다. e. 조상의메서드보다더많은수의예외를선언할수있다.

48 48 Java 의정석定石 2 판 - 연습문제풀이 [7-5] 다음의코드는컴파일하면에러가발생한다. 그이유를설명하고에러를수정하기 위해서는코드를어떻게바꾸어야하는가? [ 연습문제 ]/ch7/exercise7_5.java class Product { int price; // 제품의가격 int bonuspoint; // 제품구매시제공하는보너스점수 Product(int price) { this.price = price; bonuspoint =(int)(price/10.0); class Tv extends Product { Tv() { public String tostring() { return "Tv"; class Exercise7_5 { public static void main(string[] args) { Tv t = new Tv(); [7-6] 자손클래스의생성자에서조상클래스의생성자를호출해야하는이유는무엇인 가?

49 Java 의정석定石 2 판 - 연습문제풀이 49 [7-7] 다음코드의실행했을때호출되는생성자의순서와실행결과를적으시오. [ 연습문제 ]/ch7/exercise7_7.java class Parent { int x=100; Parent() { this(200); Parent(int x) { this.x = x; int getx() { return x; class Child extends Parent { int x = 3000; Child() { this(1000); Child(int x) { this.x = x; class Exercise7_7 { public static void main(string[] args) { Child c = new Child(); System.out.println("x="+c.getX());

50 50 Java 의정석定石 2 판 - 연습문제풀이 [7-8] 다음중접근제어자를접근범위가넓은것에서좁은것의순으로바르게나열한것은? a. public-protected-(default)-private b. public-(default)-protected-private c. (default)-public-protected-private d. private-protected-(default)-public [7-9] 다음중제어자 final을붙일수있는대상과붙였을때그의미를적은것이다. 옳지않은것은? ( 모두고르시오 ) a. 지역변수 - 값을변경할수없다. b. 클래스 - 클래스에새로운멤버를추가할수없다. c. 메서드 - 오버로딩을할수없다. d. 멤버변수 - 값을변경할수없다. [7-10] MyTv2 클래스의멤버변수 ispoweron, channel, volume 을클래스외부에서접근할 수없도록제어자를붙이고대신이멤버변수들의값을어디서나읽고변경할수있도록 getter 와 setter 메서드를추가하라. [ 연습문제 ]/ch7/exercise7_10.java class MyTv2 { boolean ispoweron; int channel; int volume; final int MAX_VOLUME = 100; final int MIN_VOLUME = 0; final int MAX_CHANNEL = 100; final int MIN_CHANNEL = 1; /* */ (1) 알맞은코드를넣어완성하시오. class Exercise7_10 { public static void main(string args[]) { MyTv2 t = new MyTv2(); t.setchannel(10); System.out.println("CH:"+t.getChannel()); t.setvolume(20); System.out.println("VOL:"+t.getVolume()); [ 실행결과 ] CH:10 VOL:20

51 Java 의정석定石 2 판 - 연습문제풀이 51 [7-11] 문제 7-10 에서작성한 MyTv2 클래스에이전채널 (previous channel) 로이동하는 기능의메서드를추가해서실행결과와같은결과를얻도록하시오. [Hint] 이전채널의값을저장할멤버변수를정의하라. 메서드명 : gotoprevchannel 기능 : 현재채널을이전채널로변경한다. 반환타입 : 없음매개변수 : 없음 [ 연습문제 ]/ch7/exercise7_11.java class MyTv2 { /* (1) 문제 7-10 의 MyTv2 클래스에 gotoprevchannel 메서드를추가하여완성하시오. */ class Exercise7_11 { public static void main(string args[]) { MyTv2 t = new MyTv2(); t.setchannel(10); System.out.println("CH:"+t.getChannel()); t.setchannel(20); System.out.println("CH:"+t.getChannel()); t.gotoprevchannel(); System.out.println("CH:"+t.getChannel()); t.gotoprevchannel(); System.out.println("CH:"+t.getChannel()); [ 실행결과 ] CH:10 CH:20 CH:10 CH:20 [7-12] 다음중접근제어자에대한설명으로옳지않은것은? ( 모두고르시오 ) a. public은접근제한이전혀없는접근제어자이다. b. (default) 가붙으면, 같은패키지내에서만접근이가능하다. c. 지역변수에도접근제어자를사용할수있다. d. protected가붙으면, 같은패키지내에서도접근이가능하다. e. protected가붙으면, 다른패키지의자손클래스에서접근이가능하다. [7-13] Math 클래스의생성자는접근제어자가 private 이다. 그이유는무엇인가?

52 52 Java 의정석定石 2 판 - 연습문제풀이 [7-14] 문제 7-1 에나오는섯다카드의숫자와종류 (iskwang) 는사실한번값이지정되면 변경되어서는안되는값이다. 카드의숫자가한번잘못바뀌면똑같은카드가두장이 될수도있기때문이다. 이러한문제점이발생하지않도록아래의 SutdaCard 를수정하시 오. [ 연습문제 ]/ch7/exercise7_14.java 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":""); class Exercise7_14 { public static void main(string args[]) { SutdaCard card = new SutdaCard(1, true); [7-15] 클래스가다음과같이정의되어있을때, 형변환을올바르게하지않은것은? ( 모두고르시오.) class Unit { class AirUnit extends Unit { class GroundUnit extends Unit { class Tank extends GroundUnit { class AirCraft extends AirUnit { Unit u = new GroundUnit(); Tank t = new Tank(); AirCraft ac = new AirCraft(); a. u = (Unit)ac; b. u = ac; c. GroundUnit gu = (GroundUnit)u; d. AirUnit au = ac; e. t = (Tank)u; f. GroundUnit gu = t;

53 Java 의정석定石 2 판 - 연습문제풀이 53 [7-16] 다음중연산결과가 true 가아닌것은? ( 모두고르시오 ) class Car { class FireEngine extends Car implements Movable { class Ambulance extends Car { FireEngine fe = new FireEngine(); a. fe instanceof FireEngine b. fe instanceof Movable c. fe instanceof Object d. fe instanceof Car e. fe instanceof Ambulance [7-17] 아래세개의클래스로부터공통부분을뽑아서 Unit 이라는클래스를만들고, 이 클래스를상속받도록코드를변경하시오. class Marine { // 보병 int x, y; // 현재위치 void move(int x, int y) { /* 지정된위치로이동 */ void stop() { /* 현재위치에정지 */ void stimpack() { /* 스팀팩을사용한다.*/ class Tank { // 탱크 int x, y; // 현재위치 void move(int x, int y) { /* 지정된위치로이동 */ void stop() { /* 현재위치에정지 */ void changemode() { /* 공격모드를변환한다. */ class Dropship { // 수송선 int x, y; // 현재위치 void move(int x, int y) { /* 지정된위치로이동 */ void stop() { /* 현재위치에정지 */ void load() { /* 선택된대상을태운다.*/ void unload() { /* 선택된대상을내린다.*/

54 54 Java 의정석定石 2 판 - 연습문제풀이 [7-18] 다음과같은실행결과를얻도록코드를완성하시오. [Hint] instanceof 연산자를사용해서형변환한다. 메서드명 : action 기능 : 주어진객체의메서드를호출한다. DanceRobot인경우, dance() 를호출하고, SingRobot인경우, sing() 을호출하고, DrawRobot인경우, draw() 를호출한다. 반환타입 : 없음매개변수 : Robot r - Robot인스턴스또는 Robot의자손인스턴스 [ 연습문제 ]/ch7/exercise7_18.java class Exercise7_18 { /* (1) action 메서드를작성하시오. */ public static void main(string[] args) { Robot[] arr = { new DanceRobot(), new SingRobot(), new DrawRobot(); for(int i=0; i< arr.length;i++) action(arr[i]); // main class Robot { class DanceRobot extends Robot { void dance() { System.out.println(" 춤을춥니다."); class SingRobot extends Robot { void sing() { System.out.println(" 노래를합니다."); class DrawRobot extends Robot { void draw() { System.out.println(" 그림을그립니다."); [ 실행결과 ] 춤을춥니다. 노래를합니다. 그림을그립니다.

55 Java 의정석定石 2 판 - 연습문제풀이 55 [7-19] 다음은물건을구입하는사람을정의한 Buyer클래스이다. 이클래스는멤버변수로돈 (money) 과장바구니 (cart) 를가지고있다. 제품을구입하는기능의 buy메서드와장바구니에구입한물건을추가하는 add메서드, 구입한물건의목록과사용금액, 그리고남은금액을출력하는 summary메서드를완성하시오. 1. 메서드명 : buy 기능 : 지정된물건을구입한다. 가진돈 (money) 에서물건의가격을빼고, 장바구니 (cart) 에담는다. 만일가진돈이물건의가격보다적다면바로종료한다. 반환타입 : 없음매개변수 : Product p - 구입할물건 2. 메서드명 : add 기능 : 지정된물건을장바구니에담는다. 만일장바구니에담을공간이없으면, 장바구니의크기를 2배로늘린다음에담는다. 반환타입 : 없음매개변수 : Product p - 구입할물건 3. 메서드명 : summary 기능 : 구입한물건의목록과사용금액, 남은금액을출력한다. 반환타입 : 없음매개변수 : 없음 [ 연습문제 ]/ch7/exercise7_19.java class Exercise7_19 { public static void main(string args[]) { Buyer b = new Buyer(); b.buy(new Tv()); b.buy(new Computer()); b.buy(new Tv()); b.buy(new Audio()); b.buy(new Computer()); b.buy(new Computer()); b.buy(new Computer()); b.summary(); class Buyer { int money = 1000; Product[] cart = new Product[3]; // 구입한제품을저장하기위한배열 int i = 0; // Product배열 cart에사용될 index void buy(product p) { /* (1) 아래의로직에맞게코드를작성하시오. 1.1 가진돈과물건의가격을비교해서가진돈이적으면메서드를종료한다. 1.2 가진돈이충분하면, 제품의가격을가진돈에서빼고 1.3 장바구니에구입한물건을담는다.(add 메서드호출 )

56 56 Java 의정석定石 2 판 - 연습문제풀이 */ void add(product p) { /* (2) 아래의로직에맞게코드를작성하시오. 1.1 i 의값이장바구니의크기보다같거나크면 기존의장바구니보다 2 배큰새로운배열을생성한다 기존의장바구니의내용을새로운배열에복사한다 새로운장바구니와기존의장바구니를바꾼다. 1.2 물건을장바구니 (cart) 에저장한다. 그리고 i 의값을 1 증가시킨다. */ // add(product p) void summary() { /* (3) 아래의로직에맞게코드를작성하시오. 1.1 장바구니에담긴물건들의목록을만들어출력한다. 1.2 장바구니에담긴물건들의가격을모두더해서출력한다. 1.3 물건을사고남은금액 (money) 를출력한다. */ // summary() class Product { int price; // 제품의가격 Product(int price) { this.price = price; class Tv extends Product { Tv() { super(100); public String tostring() { return "Tv"; class Computer extends Product { Computer() { super(200); public String tostring() { return "Computer"; class Audio extends Product { Audio() { super(50); public String tostring() { return "Audio"; [ 실행결과 ] 잔액이부족하여 Computer 을 / 를살수없습니다. 구입한물건 :Tv,Computer,Tv,Audio,Computer,Computer, 사용한금액 :850 남은금액 :150

57 Java 의정석定石 2 판 - 연습문제풀이 57 [7-20] 다음의코드를실행한결과를적으시오. [ 연습문제 ]/ch7/exercise7_20.java class Exercise7_20 { public static void main(string[] args) { Parent p = new Child(); Child c = new Child(); System.out.println("p.x = " + p.x); p.method(); System.out.println("c.x = " + c.x); c.method(); class Parent { int x = 100; void method() { System.out.println("Parent Method"); class Child extends Parent { int x = 200; void method() { System.out.println("Child Method"); [7-21] 다음과같이 attack 메서드가정의되어있을때, 이메서드의매개변수로가능한 것두가지를적으시오. interface Movable { void move(int x, int y); void attack(movable f) { /* 내용생략 */

58 58 Java 의정석定石 2 판 - 연습문제풀이 [7-22] 아래는도형을정의한 Shape클래스이다. 이클래스를조상으로하는 Circle클래스와 Rectangle클래스를작성하시오. 이때, 생성자도각클래스에맞게적절히추가해야한다. (1) 클래스명 : Circle 조상클래스 : Shape 멤버변수 : double r - 반지름 (2) 클래스명 : Rectangle 조상클래스 : Shape 멤버변수 : int width - 폭 int height - 높이메서드 : 1. 메서드명 : issquare 기능 : 정사각형인지아닌지를알려준다. 반환타입 : boolean 매개변수 : 없음 [ 연습문제 ]/ch7/exercise7_22.java abstract class Shape { Point p; Shape() { this(new Point(0,0)); Shape(Point p) { this.p = p; abstract double calcarea(); // 도형의면적을계산해서반환하는메서드 Point getposition() { return p; void setposition(point p) { this.p = p; class Point { int x; int y; Point() { this(0,0); Point(int x, int y) { this.x=x; this.y=y;

59 Java 의정석定石 2 판 - 연습문제풀이 59 public String tostring() { return "["+x+","+y+"]"; [7-23] 문제 7-22 에서정의한클래스들의면적을구하는메서드를작성하고테스트하시 오. 1. 메서드명 : sumarea 기능 : 주어진배열에담긴도형들의넓이를모두더해서반환한다. 반환타입 : double 매개변수 : Shape[] arr [ 연습문제 ]/ch7/exercise7_23.java class Exercise7_23 { /* (1) sumarea 메서드를작성하시오. */ public static void main(string[] args) { Shape[] arr = {new Circle(5.0), new Rectangle(3,4), new Circle(1); System.out.println(" 면적의합 :"+sumarea(arr)); [ 실행결과 ] 면적의합 : [7-24] 다음중인터페이스의장점이아닌것은? a. 표준화를가능하게해준다. b. 서로관계없는클래스들에게관계를맺어줄수있다. c. 독립적인프로그래밍이가능하다. d. 다중상속을가능하게해준다. e. 패키지간의연결을도와준다.

60 60 Java 의정석定石 2 판 - 연습문제풀이 Chapter 8 예외처리 Exception Handling

61 Java 의정석定石 2 판 - 연습문제풀이 61 [ 연습문제 ] [8-1] 예외처리의정의와목적에대해서설명하시오. [8-2] 다음은실행도중예외가발생하여화면에출력된내용이다. 이에대한설명중옳 지않은것은? java.lang.arithmeticexception : / by zero at ExceptionEx18.method2(ExceptionEx18.java:12) at ExceptionEx18.method1(ExceptionEx18.java:8) at ExceptionEx18.main(ExceptionEx18.java:4) a. 위의내용으로예외가발생했을당시호출스택에존재했던메서드를알수있다. b. 예외가발생한위치는 method2 메서드이며, ExceptionEx18.java파일의 12번째줄이다. c. 발생한예외는 ArithmeticException이며, 0으로나누어서예외가발생했다. d. method2메서드가 method1메서드를호출하였고그위치는 ExceptionEx18.java파일의 8 번째줄이다. [8-3] 다음중오버라이딩이잘못된것은? ( 모두고르시오 ) void add(int a, int b) throws InvalidNumberException, NotANumberException { class NumberException extends Exception { class InvalidNumberException extends NumberException { class NotANumberException extends NumberException { a. void add(int a, int b) throws InvalidNumberException, NotANumberException { b. void add(int a, int b) throws InvalidNumberException { c. void add(int a, int b) throws NotANumberException { d. void add(int a, int b) throws Exception { e. void add(int a, int b) throws NumberException {

62 62 Java 의정석定石 2 판 - 연습문제풀이 [8-4] 다음과같은메서드가있을때, 예외를잘못처리한것은? ( 모두고르시오 ) void method() throws InvalidNumberException, NotANumberException { class NumberException extends RuntimeException { class InvalidNumberException extends NumberException { class NotANumberException extends NumberException { a. try {method(); catch(exception e) { b. try {method(); catch(numberexception e) { catch(exception e) { c. try {method(); catch(exception e) { catch(numberexception e) { d. try {method(); catch(invalidnumberexception e) { catch(notanumberexception e) { e. try {method(); catch(numberexception e) { f. try {method(); catch(runtimeexception e) { [8-5] 아래의코드가수행되었을때의실행결과를적으시오. [ 연습문제 ]/ch8/exercise8_5.java class Exercise8_5 { static void method(boolean b) { try { System.out.println(1); if(b) throw new ArithmeticException(); System.out.println(2); catch(runtimeexception r) { System.out.println(3); return; catch(exception e) { System.out.println(4); return; finally { System.out.println(5); System.out.println(6); public static void main(string[] args) { method(true); method(false); // main

63 Java 의정석定石 2 판 - 연습문제풀이 63 [8-6] 아래의코드가수행되었을때의실행결과를적으시오. [ 연습문제 ]/ch8/exercise8_6.java class Exercise8_6 { public static void main(string[] args) { try { method1(); catch(exception e) { System.out.println(5); static void method1() { try { method2(); System.out.println(1); catch(arithmeticexception e) { System.out.println(2); finally { System.out.println(3); System.out.println(4); // method1() static void method2() { throw new NullPointerException();

64 64 Java 의정석定石 2 판 - 연습문제풀이 [8-7] 아래의코드가수행되었을때의실행결과를적으시오. [ 연습문제 ]/ch8/exercise8_7.java class Exercise8_7 { static void method(boolean b) { try { System.out.println(1); if(b) System.exit(0); System.out.println(2); catch(runtimeexception r) { System.out.println(3); return; catch(exception e) { System.out.println(4); return; finally { System.out.println(5); System.out.println(6); public static void main(string[] args) { method(true); method(false); // main

65 Java 의정석定石 2 판 - 연습문제풀이 65 [8-8] 다음은 1~100 사이의숫자를맞추는게임을실행하던도중에숫자가아닌영문자를 넣어서발생한예외이다. 예외처리를해서숫자가아닌값을입력했을때는다시입력을 받도록보완하라. 1 과 100 사이의값을입력하세요 :50 더작은수를입력하세요. 1 과 100 사이의값을입력하세요 :asdf Exception in thread "main" java.util.inputmismatchexception at java.util.scanner.throwfor(scanner.java:819) at java.util.scanner.next(scanner.java:1431) at java.util.scanner.nextint(scanner.java:2040) at java.util.scanner.nextint(scanner.java:2000) at Exercise8_8.main(Exercise8_8.java:16) [ 연습문제 ]/ch8/exercise8_8.java import java.util.*; class Exercise8_8 { public static void main(string[] args) { // 1~100 사이의임의의값을얻어서 answer 에저장한다. int answer = (int)(math.random() * 100) + 1; int input = 0; // 사용자입력을저장할공간 int count = 0; // 시도횟수를세기위한변수 do { count++; System.out.print("1 과 100 사이의값을입력하세요 :"); input = new Scanner(System.in).nextInt(); if(answer > input) { System.out.println(" 더큰수를입력하세요."); else if(answer < input) { System.out.println(" 더작은수를입력하세요."); else { System.out.println(" 맞췄습니다."); System.out.println(" 시도횟수는 "+count+" 번입니다."); break; // do-while 문을벗어난다 while(true); // 무한반복문 // end of main // end of class HighLow [ 실행결과 ] 1 과 100 사이의값을입력하세요 :50 더작은수를입력하세요. 1 과 100 사이의값을입력하세요 :asdf 유효하지않은값입니다. 다시값을입력해주세요. 1 과 100 사이의값을입력하세요 :25 더큰수를입력하세요.

66 66 Java 의정석定石 2 판 - 연습문제풀이 1 과 100 사이의값을입력하세요 :38 더큰수를입력하세요. 1 과 100 사이의값을입력하세요 :44 맞췄습니다. 시도횟수는 5 번입니다. [8-9] 다음과같은조건의예외클래스를작성하고테스트하시오. [ 참고 ] 생성자는실행결과를보고알맞게작성해야한다. * 클래스명 : UnsupportedFuctionException * 조상클래스명 : RuntimeException * 멤버변수 : 이름 : ERR_CODE 저장값 : 에러코드타입 : int 기본값 : 100 제어자 : final private * 메서드 : 1. 메서드명 : geterrorcode 기능 : 에러코드 (ERR_CODE) 를반환한다. 반환타입 : int 매개변수 : 없음제어자 : public 2. 메서드명 : getmessage 기능 : 메세지의내용을반환한다.(Exception클래스의 getmessage() 를오버라이딩 ) 반환타입 : String 매개변수 : 없음제어자 : public [ 연습문제 ]/ch8/exercise8_9.java class Exercise8_9 { public static void main(string[] args) throws Exception { throw new UnsupportedFuctionException(" 지원하지않는기능입니다.",100); [ 실행결과 ] Exception in thread "main" UnsupportedFuctionException: [100] 지원하지않는기능입니다. at Exercise8_9.main(Exercise8_9.java:5)

67 Java 의정석定石 2 판 - 연습문제풀이 67 [8-10] 아래의코드가수행되었을때의실행결과를적으시오. [ 연습문제 ]/ch8/exercise8_10.java class Exercise8_10 { public static void main(string[] args) { try { method1(); System.out.println(6); catch(exception e) { System.out.println(7); static void method1() throws Exception { try { method2(); System.out.println(1); catch(nullpointerexception e) { System.out.println(2); throw e; catch(exception e) { System.out.println(3); finally { System.out.println(4); System.out.println(5); // method1() static void method2() { throw new NullPointerException();

68 68 Java 의정석定石 2 판 - 연습문제풀이 Chapter 9 java.lang 패키지 java.lang package

69 Java 의정석定石 2 판 - 연습문제풀이 69 [ 연습문제 ] [9-1] 다음과같은실행결과를얻도록 SutdaCard 클래스의 equals() 를멤버변수인 num, iskwang 의값을비교하도록오버라이딩하고테스트하시오. [ 연습문제 ]/ch9/exercise9_1.java class Exercise9_1 { public static void main(string[] args) { SutdaCard c1 = new SutdaCard(3,true); SutdaCard c2 = new SutdaCard(3,true); System.out.println("c1="+c1); System.out.println("c2="+c2); System.out.println("c1.equals(c2):"+c1.equals(c2)); 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) { /* (1) 매개변수로넘겨진객체의 num, iskwang 과멤버변수 num, iskwang 을비교하도록오버라이딩하시오. */ public String tostring() { return num + ( iskwang? "K":""); [ 실행결과 ] c1=3k c2=3k c1.equals(c2):true

70 70 Java 의정석定石 2 판 - 연습문제풀이 [9-2] 다음과같은실행결과를얻도록 Point3D 클래스의 equals() 를멤버변수인 x, y, z 의값을비교하도록오버라이딩하고, tostring() 은실행결과를참고해서적절히오버라이 딩하시오. [ 연습문제 ]/ch9/exercise9_2.java class Exercise9_2 { public static void main(string[] args) { Point3D p1 = new Point3D(1,2,3); Point3D p2 = new Point3D(1,2,3); System.out.println(p1); System.out.println(p2); System.out.println("p1==p2?"+(p1==p2)); System.out.println("p1.equals(p2)?"+(p1.equals(p2))); class Point3D { int x,y,z; Point3D(int x, int y, int z) { this.x=x; this.y=y; this.z=z; Point3D() { this(0,0,0); public boolean equals(object obj) { /* (1) 인스턴스변수 x, y, z 를비교하도록오버라이딩하시오. */ public String tostring() { /* (2) 인스턴스변수 x, y, z 의내용을출력하도록오버라이딩하시오. */ [ 실행결과 ] [1,2,3] [1,2,3] p1==p2?false p1.equals(p2)?true

71 Java 의정석定石 2 판 - 연습문제풀이 71 [9-3] 다음과같은실행결과가나오도록코드를완성하시오. [ 연습문제 ]/ch9/exercise9_3.java class Exercise9_3 { public static void main(string[] args) { String fullpath = "c:\\jdk1.5\\work\\pathseparatetest.java"; String path = ""; String filename = ""; /* */ (1) 알맞은코드를넣어완성하시오. System.out.println("fullPath:"+fullPath); System.out.println("path:"+path); System.out.println("fileName:"+fileName); [ 실행결과 ] fullpath:c:\jdk1.5\work\pathseparatetest.java path:c:\jdk1.5\work filename:pathseparatetest.java [9-4] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : printgraph 기능 : 주어진배열에담긴값만큼주어진문자를가로로출력한후, 값을출력한다. 반환타입 : 없음매개변수 : int[] dataarr - 출력할그래프의데이터 char ch - 그래프로출력할문자. [ 연습문제 ]/ch9/exercise9_4.java class Exercise9_4 { static void printgraph(int[] dataarr, char ch) { /* (1) printgraph 메서드를작성하시오. */ public static void main(string[] args) { printgraph(new int[]{3,7,1,4,'*'); [ 실행결과 ] ***3 *******7 *1 ****4

72 72 Java 의정석定石 2 판 - 연습문제풀이 [9-5] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : count 기능 : 주어진문자열 (src) 에찾으려는문자열 (target) 이몇번나오는지세어서반환한다. 반환타입 : int 매개변수 : String src String target [Hint] String 클래스의 indexof(string str, int fromindex) 를사용할것 [ 연습문제 ]/ch9/exercise9_5.java class Exercise9_5 { public static int count(string src, String target) { int count = 0; // 찾은횟수 int pos = 0; // 찾기시작할위치 /* */ (1) 반복문을사용해서아래의과정을반복한다. 1. src 에서 target 을 pos 의위치부터찾는다. 2. 찾으면 count 의값을 1 증가시키고, pos 의값을 target.length 만큼증가시킨다. 3. indexof 의결과가 -1 이면반복문을빠져나가서 count 를반환한다. public static void main(string[] args) { System.out.println(count("12345AB12AB345AB","AB")); System.out.println(count("12345","AB")); [ 실행결과 ] 3 0 [9-6] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : fillzero 기능 : 주어진문자열 ( 숫자 ) 로주어진길이의문자열로만들고, 왼쪽빈공간은 '0' 으로채운다. 만일주어진문자열이 null이거나문자열의길이가 length의값과같으면그대로반환한다. 만일주어진 length의값이 0보다같거나작은값이면, 빈문자열 ("") 을반환한다. 반환타입 : String 매개변수 : String src - 변환할문자열 int length - 변환한문자열의길이

73 Java 의정석定石 2 판 - 연습문제풀이 73 [ 연습문제 ]/ch9/exercise9_6.java class Exercise9_6 { public static String fillzero(string src, int length) { /* (1) fillzero 메서드를작성하시오. 1. src 가널이거나 src.length() 가 length 와같으면 src 를그대로반환한다. 2. length 의값이 0 보다같거나작으면빈문자열 ("") 을반환한다. 3. src 의길이가 length 의값보다크면 src 를 length 만큼잘라서반환한다. 4. 길이가 legnth 인 char 배열을생성핞다 에서생성한 char 배열을 '0' 으로채운다. 6. src 에서문자배열을뽑아내서 4 에서생성한배열에복사한다 에서생성한배열로 String 을생성해서반환한다. */ public static void main(string[] args) { String src = "12345"; System.out.println(fillZero(src,10)); System.out.println(fillZero(src,-1)); System.out.println(fillZero(src,3)); [ 실행결과 ] [9-7] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : contains 기능 : 첫번째문자열 (src) 에두번째문자열 (target) 이포함되어있는지확인한다. 포함되어있으면 true, 그렇지않으면 false를반환한다. 반환타입 : boolean 매개변수 : String src String target [Hint] String 클래스의 indexof() 를사용할것 [ 연습문제 ]/ch9/exercise9_7.java class Exercise9_7 { /* (1) contains 메서드를작성하시오. */ public static void main(string[] args) { System.out.println(contains("12345","23")); System.out.println(contains("12345","67")); [ 실행결과 ] true false

74 74 Java 의정석定石 2 판 - 연습문제풀이 [9-8] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : round 기능 : 주어진값을반올림하여, 소수점이하 n자리의값을반환한다. 예를들어 n의값이 3이면, 소수점 4째자리에서반올림하여소수점이하 3자리의수를반환한다. 반환타입 : double 매개변수 : double d - 변환할값 int n - 반올림한결과의소수점자리 [Hint] Math.round() 와 Math.pow() 를이용하라. [ 연습문제 ]/ch9/exercise9_8.java class Exercise9_8 { /* (1) round 메서드를작성하시오. */ public static void main(string[] args) { System.out.println(round(3.1415,1)); System.out.println(round(3.1415,2)); System.out.println(round(3.1415,3)); System.out.println(round(3.1415,4)); System.out.println(round(3.1415,5)); [ 실행결과 ]

75 Java 의정석定石 2 판 - 연습문제풀이 75 [9-9] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : delchar 기능 : 주어진문자열에서금지된문자들을제거하여반환한다. 반환타입 : String 매개변수 : String src - 변환할문자열 String delch - 제거할문자들로구성된문자열 [ 힌트 ] StringBuffer 와 String 클래스의 charat(int i) 과 indexof(int ch) 를사용하라. [ 연습문제 ]/ch9/exercise9_9.java class Exercise9_9 { /* (1) delchar 메서드를작성하시오. */ public static void main(string[] args) { System.out.println("(1!2@3^4~5)"+" -> " + delchar("(1!2@3^4~5)","~!@#$%^&*()")); System.out.println("( \t5)"+" -> " + delchar("( \t5)"," \t")); [ 실행결과 ] (1!2@3^4~5) -> ( ) -> (12345)

76 76 Java 의정석定石 2 판 - 연습문제풀이 [9-10] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : format 기능 : 주어진문자열을지정된크기의문자열로변환한다. 나머지공간은공백으로채운다. 반환타입 : String 매개변수 : String str - 변환할문자열 int length - 변환된문자열의길이 int alignment - 변환된문자열의정렬조건 (0: 왼쪽정렬, 1: 가운데정렬, 2: 오른쪽정렬 ) [ 연습문제 ]/ch9/exercise9_10.java class Exercise9_10 { /* (1) format 메서드를작성하시오. 1. length 의값이 str 의길이보다작으면 length 만큼만잘라서반환한다 의경우가아니면, length 크기의 char 배열을생성하고공백으로채운다. 3. 정렬조건 (alignment) 의값에따라문자열 (str) 을복사할위치를결정한다. (System.arraycopy() 사용 ) 4. 2 에서생성한 char 배열을문자열로만들어서반환한다. */ public static void main(string[] args) { String str = " 가나다 "; System.out.println(format(str,7,0)); // 왼쪽정렬 System.out.println(format(str,7,1)); // 가운데정렬 System.out.println(format(str,7,2)); // 오른쪽정렬 [ 실행결과 ] 가나다가나다가나다

77 Java 의정석定石 2 판 - 연습문제풀이 77 [9-11] 커맨드라인으로 2~9 사이의두개의숫자를받아서두숫자사이의구구단을출력 하는프로그램을작성하시오. 예를들어 3 과 5 를입력하면 3 단부터 5 단까지출력한다. [ 실행결과 ] C:\jdk1.5\work>java Exercise9_11 2 시작단과끝단, 두개의정수를입력해주세요. USAGE : GugudanTest 3 5 C:\jdk1.5\work>java Exercise9_ 단의범위는 2 와 9 사이의값이어야합니다. USAGE : GugudanTest 3 5 C:\jdk1.5\work\ch9>java Exercise9_ *1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45

78 78 Java 의정석定石 2 판 - 연습문제풀이 [9-12] 다음과같이정의된메서드를작성하고테스트하시오. [ 주의 ] Math.random() 을사용하는경우실행결과와다를수있음. 메서드명 : getrand 기능 : 주어진범위 (from~to) 에속한임의의정수값을반환한다. ( 양쪽경계값모두범위에포함 ) from의값이 to의값보다클경우도처리되어야한다. 반환타입 : int 매개변수 : int from - 범위의시작값 int to - 범위의끝값 [Hint] Math.random() 과절대값을반환하는 Math.abs(int a), 그리고둘중에작은값을반환하는 Math.min(int a, int b) 를사용하라. [ 연습문제 ]/ch9/exercise9_12.java class Exercise9_12 { /* (1) getrand 메서드를작성하시오. */ public static void main(string[] args) { for(int i=0; i< 20; i++) System.out.print(getRand(1,-3)+","); [ 실행결과 ] 0,-1,1,0,-2,-2,1,1,-3,0,-1,1,1,1,0,-1,1,0,-1,-3,

79 Java 의정석定石 2 판 - 연습문제풀이 79 Chapter 10 내부클래스 Inner class

80 80 Java 의정석定石 2 판 - 연습문제풀이 [ 연습문제 ] [10-1] Outer 클래스의내부클래스 Inner 의멤버변수 iv 의값을출력하시오. [ 연습문제 ]/ch10/exercise10_1.java class Outer { class Inner { int iv=100; class Exercise10_1 { public static void main(string[] args) { /* (1) 알맞은코드를넣어완성하시오. */ [ 실행결과 ] 100 [10-2] Outer 클래스의내부클래스 Inner 의멤버변수 iv 의값을출력하시오. [ 연습문제 ]/ch10/exercise10_2.java class Outer { static class Inner { int iv=200; class Exercise10_2 { public static void main(string[] args) { /* (1) 알맞은코드를넣어완성하시오. */ [ 실행결과 ] 200

81 Java 의정석定石 2 판 - 연습문제풀이 81 [10-3] 다음과같은실행결과를얻도록 (1)~(4) 의코드를완성하시오. [ 연습문제 ]/ch10/exercise10_3.java class Outer { int value=10; class Inner { int value=20; void method1() { int value=30; System.out.println(/* (1) */); System.out.println(/* (2) */); System.out.println(/* (3) */); // Inner클래스의끝 // Outer클래스의끝 class Exercise10_3 { public static void main(string args[]) { /* (4) 알맞은코드를넣어완성하시오. */ inner.method1(); [ 실행결과 ]

82 82 Java 의정석定石 2 판 - 연습문제풀이 [10-4] 아래의 EventHandler 를익명클래스 (anonymous class) 로변경하시오. [ 연습문제 ]/ch10/exercise10_4.java import java.awt.*; import java.awt.event.*; class Exercise10_4 { public static void main(string[] args) { Frame f = new Frame(); f.addwindowlistener(new EventHandler()); class EventHandler extends WindowAdapter { public void windowclosing(windowevent e) { e.getwindow().setvisible(false); e.getwindow().dispose(); System.exit(0); [10-5] 지역클래스에서외부클래스의인스턴스멤버와 static 멤버에모두접근할수 있지만, 지역변수는 final 이붙은상수만접근할수있는이유무엇인가?

83 Java 의정석定石 2 판 - 연습문제풀이 83 Chapter 11 컬렉션프레임웍과유용한클래스 Collection framework & Useful classes

84 84 Java 의정석定石 2 판 - 연습문제풀이 [ 연습문제 ] [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]

85 Java 의정석定石 2 판 - 연습문제풀이 85 [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) 이가장오래걸리는요소는몇번째요소인가?

86 86 Java 의정석定石 2 판 - 연습문제풀이 [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 +","+gettotal() +","+getaverage(); +","+eng +","+math 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

87 Java 의정석定石 2 판 - 연습문제풀이 87 [11-6] 다음의코드는성적평균의범위별로학생수를세기위한것이다. TreeSet이학생들의평균을기준으로정렬하도록 compare(object o1, Object o2) 와평균점수의범위를주면해당범위에속한학생의수를반환하는 getgroupcount() 를완성하라. [Hint] TreeSet 의 subset(object from, Object to) 를사용하라. [ 연습문제 ]/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

88 88 Java 의정석定石 2 판 - 연습문제풀이 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

89 Java 의정석定石 2 판 - 연습문제풀이 89 [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));

90 90 Java 의정석定石 2 판 - 연습문제풀이 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

91 Java 의정석定石 2 판 - 연습문제풀이 91 [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 // 새로추가

92 92 Java 의정석定石 2 판 - 연습문제풀이 ; // 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

93 Java 의정석定石 2 판 - 연습문제풀이 93 [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

94 94 Java 의정석定石 2 판 - 연습문제풀이 +","+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) 를등수 (schoolrank) 로한다. 1.3 총점이서로다르면, 등수 (schoolrank) 의값을알맞게계산해서저장한다. 이전에동점자였다면, 그다음등수는동점자의수를고려해야한다. ( 실행결과참고 ) 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));

95 Java 의정석定石 2 판 - 연습문제풀이 95 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

96 96 Java 의정석定石 2 판 - 연습문제풀이 [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]

97 Java 의정석定石 2 판 - 연습문제풀이 97 [11-12] 다음은섯다게임에서카드의순위를결정하는등급목록 ( 족보 ) 이다. HashMap에등급과점수를저장하는 registerjokbo() 와게임참가자의점수를계산해서반환하는 getpoint() 를완성하시오. [ 참고 ] 섯다게임은두장의카드의숫자를더한값을 10으로나눈나머지가높은쪽이이기는게임이다. 그외에도특정숫자로구성된카드로이루어진등급 ( 족보 ) 이있어서높은등급의카드가이긴다. 카드1 카드2 점수 K K 카드1 카드2 점수 [ 연습문제 ]/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);

98 98 Java 의정석定石 2 판 - 연습문제풀이 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) % 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

99 Java 의정석定石 2 판 - 연습문제풀이 99 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, [ 고수 ]1,1K 3010

100 100 Java 의정석定石 2 판 - 연습문제풀이 [11-13] 다음코드는문제 를발전시킨것으로각 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);

101 Java 의정석定石 2 판 - 연습문제풀이 101 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) % ); 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;

102 102 Java 의정석定石 2 판 - 연습문제풀이 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, [ 물주 ]1, [ 중수 ]10, [ 하수 ]9, 위는 [ 중수 ]10,4 입니다.

103 Java 의정석定石 2 판 - 연습문제풀이 103 [11-14] Calendar 클래스와 SimpleDateFormat 클래스를이용해서 2010 년의매월두번째 일요일의날짜를출력하시오. [ 실행결과 ] 은 2 번째일요일입니다 은 2 번째일요일입니다 은 2 번째일요일입니다 은 2 번째일요일입니다 은 2 번째일요일입니다 은 2 번째일요일입니다 은 2 번째일요일입니다 은 2 번째일요일입니다 은 2 번째일요일입니다 은 2 번째일요일입니다 은 2 번째일요일입니다 은 2 번째일요일입니다. [11-15] 어떤회사의월급날이매월 21 일이다. 두날짜사이에월급날이몇번있는지 계산해서반환하는메서드를작성하고테스트하시오. [ 연습문제 ]/ch11/exercise11_15.java import java.util.*; import java.text.*; class Exercise11_15 { static int paycheckcount(calendar from, Calendar to) { /* (1) 아래의로직에맞게코드를작성하시오. 1. from 또는 to 가 null 이면 0 을반환한다. 2. from 와 to 가같고날짜가 21 일이면 1 을반환한다. 3. to 와 from 이몇개월차이인지계산해서변수 mondiff 에담는다. 4. mondiff 가음수이면 0 을반환한다. 5. 만일 from 의일 (DAY_OF_MONTH) 이 21 일이거나이전이고 to 의일 (DAY_OF_MONTH) 이 21 일이거나이후이면 mondiff 의값을 1 증가시킨다. 6. 만일 from 의일 (DAY_OF_MONTH) 이 21 일이후고 to 의일 (DAY_OF_MONTH) 이 21 일이전이면 mondiff 의값을 1 감소시킨다. */ return mondiff; static void printresult(calendar from, Calendar to) { Date fromdate = from.gettime(); Date todate = to.gettime(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); System.out.print(sdf.format(fromDate)+" ~ "

104 104 Java 의정석定石 2 판 - 연습문제풀이 +sdf.format(todate)+":"); System.out.println(paycheckCount(from, to)); public static void main(string[] args) { Calendar fromcal = Calendar.getInstance(); Calendar tocal = Calendar.getInstance(); fromcal.set(2010,0,1); tocal.set(2010,0,1); printresult(fromcal, tocal); fromcal.set(2010,0,21); tocal.set(2010,0,21); printresult(fromcal, tocal); fromcal.set(2010,0,1); tocal.set(2010,2,1); printresult(fromcal, tocal); fromcal.set(2010,0,1); tocal.set(2010,2,23); printresult(fromcal, tocal); fromcal.set(2010,0,23); tocal.set(2010,2,21); printresult(fromcal, tocal); fromcal.set(2011,0,22); tocal.set(2010,2,21); printresult(fromcal, tocal); [ 실행결과 ] ~ : ~ : ~ : ~ : ~ : ~ :0 [11-16] 문자열 123,456,789.5 를소수점첫번째자리에서반올림하고, 그값을만 단위마다콤마 (,) 로구분해서출력하시오. [ 실행결과 ] data:123,456,789.5 반올림 : 만단위 :1,2345,6790

105 Java 의정석定石 2 판 - 연습문제풀이 105 [11-17] 화면으로부터날짜를 2007/05/11 의형태로입력받아서무슨요일인지출력하는프로그램을작성하시오. 단, 입력된날짜의형식이잘못된경우메세지를보여주고다시입력받아야한다. [ 실행결과 ] 날짜를 yyyy/mm/dd의형태로입력해주세요.( 입력예 :2007/05/11) >> 날짜를 yyyy/mm/dd의형태로입력해주세요.( 입력예 :2007/05/11) >>2009/12/12 입력하신날짜는토요일입니다. [11-18] 다음은화면으로부터전화번호의일부를입력받아일치하는전화번호를주어진 문자열배열에서찾아서출력하는프로그램이다. 알맞은코드를넣어프로그램을완성하 시오. [Hint] Pattern, Matcher 클래스를사용하라. [ 연습문제 ]/ch11/exercise11_18.java import java.util.*; import java.util.regex.*; class Exercise11_18 { public static void main(string[] args) { String[] phonenumarr = { " ", " ", " ", " " ; ArrayList list = new ArrayList(); Scanner s = new Scanner(System.in); while(true) { System.out.print(">>"); String input = s.nextline().trim(); if(input.equals("")) { continue; else if(input.equalsignorecase("q")) { System.exit(0); /* (1) 알맞은코드를넣어완성하시오. */ if(list.size()>0) { System.out.println(list); list.clear(); else {

106 106 Java 의정석定石 2 판 - 연습문제풀이 // main System.out.println(" 일치하는번호가없습니다."); [ 실행결과 ] >> >> >>asdf 일치하는번호가없습니다. >> >> >>0 [ , , , ] >>234 [ , ] >>7890 [ , ] >>q [11-19] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : getdaydiff 기능 : yyyymmdd형식의두문자열을넘겨받으면두날짜의차이를일 (day) 단위로반환한다. 단, 첫번째날짜빼기두번째날짜의결과를반환한다. 만일주어진문자열이유효하지않으면 0을반환한다. 반환타입 : int 매개변수 : String yyyymmdd1 - 시작날짜 String yyyymmdd2 - 끝날짜 [ 연습문제 ]/ch11/exercise11_19.java import java.util.*; class Exercise11_19 { /* (1) getdaydiff 메서드를작성하시오. */ public static void main(string[] args){ System.out.println(getDayDiff(" "," ")); System.out.println(getDayDiff(" "," ")); System.out.println(getDayDiff(" ","200103")); [ 실행결과 ] 2 0 0

107 Java 의정석定石 2 판 - 연습문제풀이 107 [11-20] 다음은성적처리프로그램의일부이다. Scanner 클래스를이용해서화면으로부 터데이터를입력하고보여주는기능을완성하시오. [ 연습문제 ]/ch11/exercise11_20.java import java.io.*; import java.util.*; class Exercise11_20 { 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(){ // 데이터를입력받는메서드

108 108 Java 의정석定石 2 판 - 연습문제풀이 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() {

109 Java 의정석定石 2 판 - 연습문제풀이 109 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

110 110 Java 의정석定石 2 판 - 연습문제풀이 [ 실행결과 ] ************************************************** * 성적관리프로그램 * ************************************************** 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 ====================================================

111 Java 의정석定石 2 판 - 연습문제풀이 111 총점 : ************************************************** * 성적관리프로그램 * ************************************************** 1. 학생성적입력하기 2. 학생성적보기 3. 프로그램종료 원하는메뉴를선택하세요.(1~3) : 3 프로그램을종료합니다.

112 112 Java 의정석定石 2 판 - 연습문제풀이 Chapter 12 쓰레드 Thread

113 Java 의정석定石 2 판 - 연습문제풀이 113 [ 연습문제 ] [12-1] 쓰레드를구현하는방법에는 Thread 클래스로부터상속받는것과 Runnable 인터페 이스를구현하는것두가지가있는데, 다음의코드는 Thread 클래스를상속받아서쓰레드 를구현한것이다. 이코드를 Runnable 인터페이스를구현하도록변경하시오. [ 연습문제 ]/ch12/exercise12_1.java class Exercise12_1 { public static void main(string args[]) { Thread1 th1 = new Thread1(); th1.start(); class Thread1 extends Thread { public void run() { for(int i=0; i < 300; i++) { System.out.print('-'); [12-2] 다음코드의실행결과로옳은것은? [ 연습문제 ]/ch12/exercise12_2.java class Exercise12_2 { public static void main(string[] args) { Thread2 t1 = new Thread2(); t1.run(); for(int i=0; i < 10; i++) System.out.print(i); class Thread2 extends Thread { public void run() { for(int i=0; i < 10; i++) System.out.print(i); a 처럼 0 부터 9 까지의숫자가섞여서출력된다. b 처럼 0 부터 9 까지의숫자가순서대로출력된다. c. IllegalThreadStateException 이발생한다.

114 114 Java 의정석定石 2 판 - 연습문제풀이 [12-3] 다음중쓰레드를일시정지상태 (WAITING) 로만드는것이아닌것은? ( 모두고르시오 ) a. suspend() b. resume() c. join() d. sleep() e. wait() f. notify() [12-4] 다음중 interrupt() 에의해서실행대기상태 (RUNNABLE) 가되지않는경우는? ( 모두고르시오 ) a. sleep() 에의해서일시정지상태인쓰레드 b. join() 에의해서일시정지상태인쓰레드 c. wait() 에의해서일시정지상태인쓰레드 d. suspend() 에의해서일시정지상태인쓰레드 [12-5] 다음의코드를실행한결과를예측하고, 직접실행한결과와비교하라. 만일예 측한결과와실행한결과의차이가있다면그이유를설명하라. [ 연습문제 ]/ch12/exercise12_5.java class Exercise12_5 { public static void main(string[] args) throws Exception { Thread3 th1 = new Thread3(); th1.start(); try { Thread.sleep(5*1000); catch(exception e) { throw new Exception(" 꽝 ~!!!"); class Thread3 extends Thread { public void run() { for(int i=0; i < 10; i++) { System.out.println(i); try { Thread.sleep(1000); catch(exception e) { // run()

115 Java 의정석定石 2 판 - 연습문제풀이 115 [12-6] 다음의코드를실행한결과를예측하고, 직접실행한결과와비교하라. 만일예 측한결과와실행한결과의차이가있다면그이유를설명하라. [ 연습문제 ]/ch12/exercise12_6.java class Exercise12_6 { public static void main(string[] args) throws Exception { Thread4 th1 = new Thread4(); th1.setdaemon(true); th1.start(); try { th1.sleep(5*1000); catch(exception e) { throw new Exception(" 꽝 ~!!!"); class Thread4 extends Thread { public void run() { for(int i=0; i < 10; i++) { System.out.println(i); try { Thread.sleep(1000); catch(exception e) { // run()

116 116 Java 의정석定石 2 판 - 연습문제풀이 [12-7] 다음의코드는쓰레드 th1을생성해서실행시킨다음 6초후에정지시키는코드이다. 그러나실제로실행시켜보면쓰레드를정지시킨다음에도몇초가지난후에서야멈춘다. 그이유를설명하고, 쓰레드를정지시키면지체없이바로정지되도록코드를개선하시오. [ 연습문제 ]/ch12/exercise12_7.java class Exercise12_7 { static boolean stopped = false; public static void main(string[] args) { Thread5 th1 = new Thread5(); th1.start(); try { Thread.sleep(6*1000); catch(exception e) { stopped = true; // 쓰레드를정지시킨다. System.out.println("stopped"); class Thread5 extends Thread { public void run() { // Exercise12_7.stopped 의값이 false 인동안반복한다. for(int i=0;!exercise12_7.stopped; i++) { System.out.println(i); try { Thread.sleep(3*1000); catch(exception e) { // run() [ 실행결과 ] stopped

117 Java 의정석定石 2 판 - 연습문제풀이 117 [12-8] 다음의코드는 '-' 를출력하는쓰레드와 ' ' 를출력하는쓰레드를생성해서실행시킨다. 이두개의쓰레드가실행결과처럼 '-' 와 ' ' 를한번씩갈아가며찍게하려면아래의코드를어떻게변경해야하는가? [ 참고 ] 쓰레드의불확실성때문에실행결과가다소다를수있다. [ 연습문제 ]/ch12/exercise12_8.java class Exercise12_8 { public static void main(string args[]) { Thread6_1 th1 = new Thread6_1(); Thread6_2 th2 = new Thread6_2(); th1.start(); th2.start(); class Thread6_1 extends Thread { public void run() { for(int i=0; i < 300; i++) { System.out.print('-'); class Thread6_2 extends Thread { public void run() { for(int i=0; i < 300; i++) { System.out.print(' '); [ 실행결과 ]

118 118 Java 의정석定石 2 판 - 연습문제풀이 [12-9] 다음의코드는텍스트기반의타자연습게임인데 WordGenerator 라는쓰레드가 Vector 에 2 초마다단어를하나씩추가하고, 사용자가단어를입력하면 Vector 에서일치하 는단어를삭제하도록되어있다. WordGenerator 의 run() 을완성하시오. [ 연습문제 ]/ch12/exercise12_9.java import java.util.*; class Exercise12_9 { Vector words = new Vector(); String[] data = {" 태연 "," 유리 "," 윤아 "," 효연 "," 수영 "," 서현 "," 티파니 "," 써니 "," 제시카 "; int interval = 2 * 1000; // 2 초 WordGenerator wg = new WordGenerator(); public static void main(string args[]) { Exercise12_9 game = new Exercise12_9(); game.wg.start(); Vector words = game.words; while(true) { System.out.println(words); String prompt = ">>"; System.out.print(prompt); // 화면으로부터라인단위로입력받는다. Scanner s = new Scanner(System.in); String input = s.nextline().trim(); int index = words.indexof(input); if(index!=-1) { words.remove(index); // main class WordGenerator extends Thread { public void run() { /* (1) 아래의로직에맞게코드를작성하시오. 1. interval(2 초 ) 마다배열 data 의값중하나를임의로선택해서 2. words 에저장한다. */ // end of run() // class WordGenerator // Exercise12_9

119 Java 의정석定石 2 판 - 연습문제풀이 119 [ 실행결과 ] [] >> [ 서현 ] >> 서현 [ 수영, 윤아 ] >> 수영 [ 윤아, 유리 ] >> 유리 [ 윤아, 티파니 ] >> 티파니 [ 윤아, 윤아, 유리 ] >> 윤아 [ 윤아, 유리 ] >> 유리 [ 윤아, 효연 ] >> 효연 [ 윤아, 티파니 ] >> 윤아 [ 티파니, 윤아 ] >> 티파니 [ 윤아, 수영, 써니 ] >>

120 120 Java 의정석定石 2 판 - 연습문제풀이 Chapter 13 AWT 와애플릿 AWT & Applet

121 Java 의정석定石 2 판 - 연습문제풀이 121 [ 연습문제 ] [13-1] 아래의실행결과처럼가로, 세로크기가 5 인빙고판을만드시오. 그리고버튼을 누르면, 버튼의배경색이밝은회색 (Color.LIGHT_GRAY) 으로바뀌고누른버튼의글자가 콘솔에출력되게하시오. [ 실행결과 ]

122 122 Java 의정석定石 2 판 - 연습문제풀이 [13-2] 다음중기본레이아웃매니저가 BorderLayout이아닌컨테이너는? ( 모두고르시오 ) a. Window b. Panel c. Applet d. Frame e. Dialog [13-3] 다음중 ActionEvent가발생하는경우가아닌것은? ( 모두고르시오 ) a. Button을클릭했을때 b. Menu를클릭했을때 c. TextArea에서 Enter키를눌렀을때 d. List에서 item을선택하여클릭했을때 e. Label을더블클릭했을때 [13-4] 타이틀바에현재시간을출력하는시계를작성하시오. 단, 쓰레드를이용해서 시간이 1 초마다계속변경되도록해야한다. [Hint] SimpleDateFormat 을사용하라. [ 실행결과 ]

123 Java 의정석定石 2 판 - 연습문제풀이 123 [13-5] 다음의코드는현재년과월을보여주고왼쪽의버튼을누르면이전달로, 오른 쪽버튼을누르면다음달로이동하는프로그램이다. 알맞은코드를넣어프로그램을완 성하시오. [ 연습문제 ]/ch13/exercise13_5.java import java.io.*; import java.util.*; import java.text.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; class Exercise13_5 extends Frame { Panel pup = new Panel(); Button btnprevmon = new Button(" "); Button btnnextmon = new Button(" "); Label lblyearmon = new Label(); Calendar curmon = Calendar.getInstance(); Exercise13_5(String title) { super(title); pup.setbackground(color.yellow); pup.setlayout(new FlowLayout(FlowLayout.CENTER)); pup.add(btnprevmon); pup.add(lblyearmon); pup.add(btnnextmon); btnprevmon.addactionlistener(new BtnEventHandler()); btnnextmon.addactionlistener(new BtnEventHandler()); addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent we) { we.getwindow().setvisible(false); we.getwindow().dispose(); System.exit(0); ); add(pup); setbounds(200,200,200,70); setdays(curmon); setvisible(true); // Exercise13_5 void setdays(calendar date) { int year = date.get(calendar.year); int month = date.get(calendar.month); lblyearmon.settext(year+" 년 "+(month+1)+" 월 "); class BtnEventHandler implements ActionListener { public void actionperformed(actionevent ae) {

124 124 Java 의정석定石 2 판 - 연습문제풀이 /* */ (1) 아래의로직에맞게코드를작성하시오. 1. 눌러진버튼이 btnprevmon 이면, curmon 을한달이전으로변경한다. 2. 눌러진버튼이 btnnextmon 이면, curmon 을한달이후로변경한다. 3. setdays() 를호출해서변경된내용이레이블에보이게한다. public static void main(string[] args) { Exercise13_5 mainwin = new Exercise13_5("Scheduler"); // main [ 실행결과 ]

125 Java 의정석定石 2 판 - 연습문제풀이 125 [13-6] 다음의코드는문제 13-5 를발전시켜서해당월의날짜를버튼으로추가하는코드 이다. (1)~(2) 에알맞은코드를넣어프로그램을완성하시오. [ 연습문제 ]/ch13/exercise13_6.java import java.io.*; import java.util.*; import java.text.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; class Exercise13_6 extends Frame { Panel pdate = new Panel(); Panel pup = new Panel(); Button btnprevmon = new Button(" "); Button btnnextmon = new Button(" "); Label lblyearmon = new Label(); Button[] btnarr = new Button[42]; Calendar curmon = Calendar.getInstance(); Exercise13_6(String title) { super(title); pup.setbackground(color.yellow); pup.setlayout(new FlowLayout(FlowLayout.CENTER)); pup.add(btnprevmon); pup.add(lblyearmon); pup.add(btnnextmon); pdate.setlayout(new GridLayout(6,7)); for(int i=0; i < btnarr.length;i++) { btnarr[i] = new Button(""); pdate.add(btnarr[i]); btnprevmon.addactionlistener(new BtnEventHandler()); btnnextmon.addactionlistener(new BtnEventHandler()); addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent we) { we.getwindow().setvisible(false); we.getwindow().dispose(); System.exit(0); ); add(pup,"north"); add(pdate,"center"); setbounds(200,200,500,300); setdays(curmon); setvisible(true);

126 126 Java 의정석定石 2 판 - 연습문제풀이 // MyScheduler void setdays(calendar date) { int year = date.get(calendar.year); int month = date.get(calendar.month); lblyearmon.settext(year+" 년 "+(month+1)+" 월 "); Calendar sday = Calendar.getInstance(); // 시작일 /* (1) 아래의로직에맞게코드를작성하시오. 1. 시작일 (sday) 을해당월을 1 일이포함된일요일로설정한다. 2. 반복문을사용해서 sday 의값을 1 씩증가시키면서버튼에날짜를넣는다. 3. 만일날짜가해당월에속하면버튼의배경색을흰색 (Color.white) 으로하고그렇지않으면밝은회색 (Color.lightGray) 으로설정한다. */ // setdays(calendar date) class BtnEventHandler implements ActionListener { public void actionperformed(actionevent ae) { /* (2) 아래의로직에맞게코드를작성하시오. 1. 눌러진버튼이 btnprevmon 이면, curmon 을한달이전으로변경한다. 2. 눌러진버튼이 btnnextmon 이면, curmon 을한달이후로변경한다. 3. setdays() 를호출해서변경된내용이레이블에보이게한다. */ public static void main(string[] args) { Exercise13_6 mainwin = new Exercise13_6("Scheduler"); // main [ 실행결과 ]

127 Java 의정석定石 2 판 - 연습문제풀이 127 [13-7] 다음의코드는오목게임이다. Frame 에오목판을그리고, 그위에왼쪽버튼을누 르면검은돌이오른쪽버튼을누르면흰돌이그려지도록알맞은코드를완성하시오. 단, 돌은클릭한곳의가장가까운교차점에놓여야한다. [ 연습문제 ]/ch13/exercise13_7.java import java.awt.*; import java.awt.event.*; class Exercise13_7 extends Frame implements MouseListener { final int LINE_NUM = 9; // 오목판줄수 final int LINE_WIDTH = 30; // 오목판줄간격 final int BOARD_SIZE = LINE_WIDTH * (LINE_NUM-1); // 오목판의크기 final int STONE_SIZE = (int)(line_width * 0.8); // 돌의크기 final int X0; // 오목판시작위치 x 좌표 final int Y0; // 오목판시작위치 y 좌표 final int FRAME_WIDTH; // Frame 의폭 final int FRAME_HEIGHT; // Frame 의높이 Image img = null; Graphics gimg = null; public Exercise13_7(String title) { super(title); // Event Handler 를등록한다. addmouselistener(this); addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent we) { System.exit(0); ); setvisible(true); // Frame 을화면에보이게한다. Insets insets = getinsets(); // 화면에보이기전에는 Insets 의값을얻을수없다. // 오목판그려질위치 (LEFT, TOP) 의좌표 X0, Y0 를지정한다. X0 = insets.left + LINE_WIDTH; Y0 = insets.top + LINE_WIDTH; // Frame 의크기를계산한다. FRAME_WIDTH = BOARD_SIZE+LINE_WIDTH*2+insets.left+insets.right; FRAME_HEIGHT = BOARD_SIZE+LINE_WIDTH*2+insets.top+insets.bottom; // Frame 을화면의 (100,100) 의위치에계산된크기로보이게한다. setbounds(100,100, FRAME_WIDTH, FRAME_HEIGHT); img = createimage(frame_width, FRAME_HEIGHT); gimg = img.getgraphics(); setresizable(false); // Frame 의크기를변경하지못하게한다. drawboard(gimg); // Exercise13_7(String title) public void drawboard(graphics g) {

128 128 Java 의정석定石 2 판 - 연습문제풀이 for(int i=0; i<line_num;i++) { g.drawline(x0,y0+i*line_width,x0+board_size, Y0+i*LINE_WIDTH); g.drawline(x0+i*line_width,y0, X0+i*LINE_WIDTH, Y0+BOARD_SIZE); public void paint(graphics g) { if(img==null) return; g.drawimage(img,0,0,this); // 가상화면에그려진그림을 Frame 에복사 public void mousepressed(mouseevent e) { int x = e.getx(); // 마우스포인터의 x좌표 int y = e.gety(); // 마우스포인터의 y좌표 // MouseListener /* (1) 아래의로직에맞게코드를작성하시오. 1. x 와 y 의값을클릭한곳에서가장가까운교차점으로변경한다.( 반올림 ) 2. x 와 y 의값에서돌의크기 (STONE_SIZE) 의절반을빼야클릭한곳에돌이그려진다. 3. x 와 y 의값이오목판의밖을벗어난곳이면돌을그리지않는다. 4. 눌러진버튼이마우스왼쪽버튼이면, (x,y) 의위치에검은돌을그리고눌러진버튼이마우스오른쪽버튼이면, (x,y) 의위치에흰돌을그린다. ( 흰돌을그릴때검은색테두리도같이그린다.) 5. repaint() 를호출한다. */ public void mouseclicked(mouseevent e) { // MouseListener public void mouseentered(mouseevent e) { // MouseListener public void mouseexited(mouseevent e) { // MouseListener public void mousereleased(mouseevent e) { // MouseListener public static void main(string[] args) { new Exercise13_7("OmokTest"); [ 실행결과 ]

129 Java 의정석定石 2 판 - 연습문제풀이 129 [13-8] 다음은 Frame 의내부를튀어다니는공을그리는프로그램이다. 공이 Frame 의 벽에부딪히면방향을바꾸어이동한다. 알맞은코드를넣어완성하시오. [ 연습문제 ]/ch13/exercise13_8.java import java.awt.*; import java.awt.event.*; class BouncingBall extends Frame { final int BALL_SIZE = 20; final int FRAME_WIDTH = 400; final int FRAME_HEIGHT = 300; final int TOP; final int BOTTOM; final int LEFT; final int RIGHT; final int SPEED = 3; int x = 100; int y = 100; int xstep = SPEED; int ystep = SPEED; BouncingBall(String title) { super(title); addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent e) { System.exit(0); ); setbounds(300,200, FRAME_WIDTH, FRAME_HEIGHT); setresizable(false); setvisible(true); Insets insets = getinsets(); // Frame 의테두리의두께를얻어온다. TOP = insets.top; LEFT = insets.left; BOTTOM = FRAME_HEIGHT - insets.bottom ; RIGHT = FRAME_WIDTH - insets.right; void start() { while(true) { x +=xstep; y +=ystep; /* (1) 아래의로직에맞게코드를작성하시오. 1. x의값이왼쪽테두리 (LEFT) 보다작거나같으면 x의값을 LEFT로바꾸고 x축이동방향 (xstep) 을반대로한다.

130 130 Java 의정석定石 2 판 - 연습문제풀이 2. x 의값이오른쪽테두리 (RIGHT-BALL_SIZE) 보다작거나같으면 x 의값을 RIGHT-BALL_SIZE 로바꾸고 x 축이동방향 (xstep) 을반대로한다. 3. y 의값이윗쪽테두리 (TOP) 보다작거나같으면 y 의값을 TOP 으로바꾸고 y 축이동방향 (ystep) 을반대로한다. 4. y 의값이아래쪽테두리 (BOTTON-BALL_SIZE) 보다작거나같으면 y 의값을 BOTTON-BALL_SIZE 로바꾸고 y 축이동방향 (ystep) 을반대로한다. */ repaint(); try { Thread.sleep(100); catch (Exception e) { // start() public void paint(graphics g) { g.setcolor(color.red); g.filloval(x, y, BALL_SIZE, BALL_SIZE); class Exercise13_8 { public static void main(string[] args) { new BouncingBall("Bouncing Ball").start(); [ 실행결과 ]

131 Java 의정석定石 2 판 - 연습문제풀이 131 [13-9] 문제 13-8 을발전시켜서 BallGenerator 라는쓰레드를생성시켜서 3 초마다새로운 공을하나씩생성하는프로그램이다. 알맞은코드를넣어프로그램을완성하시오. [ 연습문제 ]/ch13/exercise13_9.java import java.util.*; import java.awt.*; import java.awt.event.*; class BouncingBall extends Frame { final int FRAME_WIDTH = 400; final int FRAME_HEIGHT = 300; final int TOP; final int BOTTOM; final int LEFT; final int RIGHT; ArrayList balls = new ArrayList(); BouncingBall(String title) { super(title); setbounds(300,200, FRAME_WIDTH, FRAME_HEIGHT); setresizable(false); setvisible(true); Insets insets = getinsets(); TOP = insets.top; LEFT = insets.left; BOTTOM = FRAME_HEIGHT - insets.bottom; RIGHT = FRAME_WIDTH - insets.right; addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent e) { System.exit(0); ); void start() { new BallGenerator().start(); while(true) { int size = balls.size(); /* for(int i=0 ; i < size; i++) { Ball b = (Ball)balls.get(i); b.x +=b.xstep; b.y +=b.ystep; (1) 아래의로직에맞게코드를작성하시오. 1. x 의값이왼쪽테두리 (LEFT) 보다작거나같으면

132 132 Java 의정석定石 2 판 - 연습문제풀이 x 의값을 LEFT 로바꾸고 x 축이동방향 (xstep) 을반대로한다. 2. x 의값이오른쪽테두리 (RIGHT-BALL_SIZE) 보다작거나같으면 x 의값을 RIGHT-BALL_SIZE 로바꾸고 x 축이동방향 (xstep) 을반대로한다. 3. y 의값이윗쪽테두리 (TOP) 보다작거나같으면 y 의값을 TOP 으로바꾸고 y 축이동방향 (ystep) 을반대로한다. 4. y 의값이아래쪽테두리 (BOTTON-BALL_SIZE) 보다작거나같으면 y 의값을 BOTTON-BALL_SIZE 로바꾸고 y 축이동방향 (ystep) 을반대로한다. */ repaint(); try { Thread.sleep(100); catch (Exception e) { // start() public void paint(graphics g) { g.drawstring("number of balls :"+balls.size(),20,50); g.setcolor(color.red); int size = balls.size(); for(int i=0 ; i < size; i++) { Ball b = (Ball)balls.get(i); g.filloval(b.x, b.y, Ball.SIZE, Ball.SIZE); class BallGenerator extends Thread { public void run() { /* (2) 아래의로직에맞게코드를작성하시오 초마다 Frame 의임의의위치에공을생성해서 balls 에추가한다. */ // run() class Ball { int x = 100; int y = 100; static final int SIZE = 30; final int SPEED = 5; int xstep = SPEED; int ystep = SPEED; Ball(int x, int y) { this.x = x; this.y = y; // class BouncingBall

133 Java 의정석定石 2 판 - 연습문제풀이 133 class Exercise13_9 { public static void main(string[] args) { new BouncingBall("Bouncing Ball").start(); [ 실행결과 ]

134 134 Java 의정석定石 2 판 - 연습문제풀이 [13-10] 다음은키보드의화살표키를이용해서공을 Frame 의테두리내에서상하좌우로 이동시키는프로그램이다. 알맞은코드를넣어프로그램을완성하시오. [ 연습문제 ]/ch13/exercise13_10.java import java.awt.*; import java.awt.event.*; class BouncingBall extends Frame { final int BALL_SIZE = 20; final int FRAME_WIDTH = 400; final int FRAME_HEIGHT = 300; final int TOP; final int BOTTOM; final int LEFT; final int RIGHT; int x; int y; final int SPEED = 3; int xstep = SPEED; int ystep = SPEED; BouncingBall(String title) { super(title); x = FRAME_WIDTH/2 - BALL_SIZE/2; y = FRAME_HEIGHT/2 - BALL_SIZE/2; setvisible(true); setbounds(300,200, FRAME_WIDTH, FRAME_HEIGHT); Insets insets = getinsets(); TOP = insets.top; LEFT = insets.left; BOTTOM = FRAME_HEIGHT - insets.bottom ; RIGHT = FRAME_WIDTH - insets.right; registereventhandler(); setresizable(false); void registereventhandler() { addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent e) { System.exit(0); ); addkeylistener(new KeyAdapter() { public void keypressed(keyevent ke){ int key = ke.getkeycode(); if(key==keyevent.vk_up){ /*

135 Java 의정석定石 2 판 - 연습문제풀이 135 ); (1) 알맞은코드를넣으시오. */ else if(key==keyevent.vk_down){ /* (2) 알맞은코드를넣으시오. */ else if(key==keyevent.vk_left){ /* (3) 알맞은코드를넣으시오. */ else if(key==keyevent.vk_right){ /* (4) 알맞은코드를넣으시오. */ // public void keypressed(keyevent ke) void start() { while(true) { repaint(); try { Thread.sleep(100); catch (Exception e) { // start() public void paint(graphics g) { g.setcolor(color.light_gray); g.filloval(x, y, BALL_SIZE, BALL_SIZE); class Exercise13_10 { public static void main(string[] args) { new BouncingBall("Bouncing Ball").start(); [ 실행결과 ]

136 136 Java 의정석定石 2 판 - 연습문제풀이 [13-11] 다음은문제 13-9 와 을결합해서발전시킨것으로회색공을키보드로움직 여서빨간공들을피해다니다빨간공과회색공이충돌하면중단되는프로그램이다. 알맞은 코드를넣어코드를완성하시오. [ 연습문제 ]/ch13/exercise13_11.java import java.util.*; import java.awt.*; import java.awt.event.*; class BouncingBall extends Frame { final int BALL_SIZE = 20; final int FRAME_WIDTH = 400; final int FRAME_HEIGHT = 300; final int TOP; final int BOTTOM; final int LEFT; final int RIGHT; final int SPEED = 7; int x; int y; boolean isplaying = true; ArrayList balls = new ArrayList(); BouncingBall(String title) { super(title); x = FRAME_WIDTH/2 - BALL_SIZE/2; y = FRAME_HEIGHT/2 - BALL_SIZE/2; setbounds(300,200, FRAME_WIDTH, FRAME_HEIGHT); setresizable(false); setvisible(true); Insets insets = getinsets(); TOP = insets.top; LEFT = insets.left; BOTTOM = FRAME_HEIGHT - insets.bottom; RIGHT = FRAME_WIDTH - insets.right; registereventhandler(); void registereventhandler() { addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent e) { System.exit(0); ); addkeylistener(new KeyAdapter() { public void keypressed(keyevent ke){ if(!isplaying) return;

137 Java 의정석定石 2 판 - 연습문제풀이 137 ); int key = ke.getkeycode(); if(key==keyevent.vk_up){ /* (1) 알맞은코드를넣으시오. */ else if(key==keyevent.vk_down){ /* (2) 알맞은코드를넣으시오. */ else if(key==keyevent.vk_left){ /* (3) 알맞은코드를넣으시오. */ else if(key==keyevent.vk_right){ /* (4) 알맞은코드를넣으시오. */ // public void keypressed(keyevent ke) void start() { new BallGenerator().start(); while(isplaying) { int size = balls.size(); for(int i=0 ; i < size; i++) { Ball b = (Ball)balls.get(i); b.x +=b.xstep; b.y +=b.ystep; /* (5) 아래의로직에맞게코드를작성하시오. 1. b.x 의값이왼쪽테두리 (LEFT) 보다작거나같으면 b.x 의값을 LEFT 로바꾸고 x 축이동방향 (b.xstep) 을반대로한다. 2. b.x 의값이오른쪽테두리 (RIGHT-b.size) 보다작거나같으면 b.x 의값을 RIGHT-b.size 로바꾸고 x 축이동방향 (b.xstep) 을반대로한다. 3. b.y 의값이윗쪽테두리 (TOP) 보다작거나같으면 b.y 의값을 TOP 으로바꾸고 y 축이동방향 (b.ystep) 을반대로한다. 4. b.y 의값이아래쪽테두리 (BOTTON-b.size) 보다작거나같으면 b.y 의값을 BOTTON-b.size 로바꾸고 y 축이동방향 (b.ystep) 을반대로한다. */ // for repaint(); try { Thread.sleep(100); catch (Exception e) {

138 138 Java 의정석定石 2 판 - 연습문제풀이 // start() boolean collisioncheck(ball b) { /* (6) 아래의로직에맞게코드를작성하시오. 1. 회색공의중심과빨간공의중심간의거리 (distance) 가회색공의 반지름 (BALL_SIZE/2) 과빨간공의반지름 (b.size) 보다같거나작으면 true 를반환하고그렇지않으면 false 를반환한다. */ 회색공의위치가 (x, y) 일때, 중심좌표는 (x+ball_size/2, y+ball_size) 이다. 두점 (x1, y1) 과 (x2, y2) 간의거리는아래의공식으로구할수있다. Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) public void paint(graphics g) { g.drawstring("number of balls :"+balls.size(),20,50); g.setcolor(color.light_gray); g.filloval(x, y, BALL_SIZE, BALL_SIZE); g.setcolor(color.red); int size = balls.size(); for(int i=0 ; i < size; i++) { Ball b = (Ball)balls.get(i); g.filloval(b.x, b.y, b.size, b.size); class BallGenerator extends Thread { public void run() { while(isplaying) { int x=(int)(math.random()*(right-left-ball.max_size))+left; int y=(int)(math.random()*(bottom-top-ball.max_size))+top; balls.add(new Ball(x,y)); try { Thread.sleep(3*1000); catch(exception e) { // run() class Ball { int x = 100; int y = 100; int size = 30; static final int MAX_SIZE = 30; static final int MIN_SIZE = 10;

139 Java 의정석定石 2 판 - 연습문제풀이 139 final int SPEED = 5; int xstep = SPEED; int ystep = SPEED; Ball(int x, int y) { this(x, y,(int)(math.random()*(max_size-min_size))+min_size); Ball(int x, int y, int size) { this.x = x; this.y = y; this.size = size; // class BouncingBall class Exercise13_11 { public static void main(string[] args) { new BouncingBall("Bouncing Ball").start(); [ 실행결과 ]

140 140 Java 의정석定石 2 판 - 연습문제풀이 Chapter 14 입출력 I/O

141 Java 의정석定石 2 판 - 연습문제풀이 141 [ 연습문제 ] [14-1] 커맨드라인으로부터파일명과숫자를입력받아서, 입력받은파일의내용의처음 부터입력받은숫자만큼의라인을출력하는프로그램 (FileHead.java) 을작성하라. [Hint] BufferedReader 의 readline() 을사용하라. [ 실행결과 ] C:\jdk1.5\work\ch14>java FileHead 10 USAGE: java FileHead 10 FILENAME C:\jdk1.5\work\ch14>java FileHead 10 aaa aaa 은 / 는디렉토리이거나, 존재하지않는파일입니다. C:\jdk1.5\work\ch14>java FileHead 10 FileHead.java 1:import java.io.*; 2: 3:class FileHead 4:{ 5: public static void main(string[] args) 6: { 7: try { 8: int line = Integer.parseInt(args[0]); 9: String filename = args[1]; 10: C:\jdk1.5\work\ch14> [14-2] 지정된이진파일의내용을실행결과와같이 16 진수로보여주는프로그램 (HexaViewer.java) 을작성하라. [Hint] PrintStream 과 printf() 를사용하라. [ 실행결과 ] C:\jdk1.5\work\ch14>java HexaViewer HexaViewer.class CA FE BA BE A 00 0C 00 1E F A A 00 1F A A A A 0A 00 2B 00 2C 0A D 0A E 0A F 0A F A C 69 6E E F F 4C 69 6E 65 4E 75 6D C D E B 4C 6A F 6C 61 6E 67 2F 중간생략 C:\jdk1.5\work\ch14>

142 142 Java 의정석定石 2 판 - 연습문제풀이 [14-3] 다음은디렉토리의요약정보를보여주는프로그램이다. 파일의개수, 디렉토리의 개수, 파일의총크기를계산하는 countfiles() 를완성하시오. [ 연습문제 ]/ch14/directoryinfotest.java import java.io.*; class DirectoryInfoTest { static int totalfiles = 0; static int totaldirs = 0; static int totalsize = 0; public static void main(string[] args) { if(args.length!= 1) { System.out.println("USAGE : java DirectoryInfoTest DIRECTORY"); System.exit(0); File dir = new File(args[0]); if(!dir.exists()!dir.isdirectory()) { System.out.println(" 유효하지않은디렉토리입니다."); System.exit(0); countfiles(dir); System.out.println(); System.out.println(" 총 " + totalfiles + " 개의파일 "); System.out.println(" 총 " + totaldirs + " 개의디렉토리 "); System.out.println(" 크기 " + totalsize + " bytes"); // main public static void countfiles(file dir) { /* (1) 아래의로직에맞게코드를작성하시오. 1. dir 의파일목록 (File[]) 을얻어온다. 2. 얻어온파일목록의파일중에서... 디렉토리이면, totaldirs 의값을증가시키고 countfiles() 를재귀호출한다. 3. 파일이면, totlafiles 를증가시키고파일의크기를 totalsize 에더한다. */ // countfiles [ 실행결과 ] C:\jdk1.5\work>java DirectoryInfoTest. 총 786 개의파일총 27 개의디렉토리크기 bytes C:\jdk1.5\work>

143 Java 의정석定石 2 판 - 연습문제풀이 143 [14-4] 커맨드라인으로부터여러파일의이름을입력받고, 이파일들을순서대로합쳐 서새로운파일을만들어내는프로그램 (FileMergeTest.java) 을작성하시오. 단, 합칠파 일의개수에는제한을두지않는다. [ 실행결과 ] C:\jdk1.5\work\ch14>java FileMergeTest USAGE: java FileMergeTest MERGE_FILENAME FILENAME1 FILENAME2... C:\jdk1.5\work\ch14>java FileMergeTest result.txt 1.txt 2.txt 3.txt C:\jdk1.5\work\ch14>type result.txt C:\jdk1.5\work\ch14>java FileMergeTest result.txt 1.txt 2.txt C:\jdk1.5\work\ch14>type result.txt C:\jdk1.5\work\ch14>type 1.txt C:\jdk1.5\work\ch14>type 2.txt C:\jdk1.5\work\ch14>type 3.txt C:\jdk1.5\work\ch14>

144 144 Java 의정석定石 2 판 - 연습문제풀이 [14-5] 다음은 FilterWriter 를상속받아서직접구현한 HtmlTagFilterWriter 를사용해 서주어진파일에있는태그를모두제거하는프로그램이다. HtmlTagFilterWriter 의 write() 가태그를제거하도록코드를완성하시오. [ 연습문제 ]/ch14/exercise14_5.java import java.io.*; class Exercise14_5 { public static void main(string[] args) { if(args.length!= 2) { System.out.println("USAGE: java Exercise14_5 TAGET_FILE RESULT_FILE"); System.exit(0); String inputfile = args[0]; String outputfile = args[1]; try { BufferedReader input = new BufferedReader(new FileReader(inputFile)); HtmlTagFilterWriter output = new HtmlTagFilterWriter(new FileWriter(outputFile)); int ch = 0; while((ch=input.read())!=-1) { output.write(ch); input.close(); output.close(); catch(ioexception e) { class HtmlTagFilterWriter extends FilterWriter { StringWriter tmp = new StringWriter(); HtmlTagFilterWriter(Writer out) { super(out); public void write(int c) throws IOException { boolean intag = false; /* (1) 아래의로직에맞게코드를작성하시오. 1. 출력할문자 (c) 가 '<' 이면 intag 의값을 true 로한다. 2. 출력할문자 (c) 가 '>' 이면 intag 의값을 false 로한다. 새로운 StringWriter 를생성한다.( 기존 StringWriter 의내용을버린다.) 3. intag 의값이 true 이면, StringWriter 에문자 (c) 를출력하고

145 Java 의정석定石 2 판 - 연습문제풀이 145 intag 의값이 false 이면, out 에문자 (c) 를출력한다. 4. StringWriter 에있는내용을 out 에출력한다. [ 참고 ] 태그가시작되면 StringWriter 에출력하고태그가끝나면 StringWriter 는비워진다. */ [ 실행결과 ] C:\jdk1.5\work\ch14>java Exercise14_5 test.html result.txt C:\jdk1.5\work\ch14>type result.txt New Document > 안녕하세요. 태그없애기테스트용파일입니다. < 태그가열린채로끝난것은태그로처리하지마세요. C:\jdk1.5\work\ch14>type test.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Document </TITLE> </HEAD> <BODY> > 안녕하세요. 태그없애기테스트용파일입니다. </BODY> < 태그가열린채로끝난것은태그로처리하지마세요.

146 146 Java 의정석定石 2 판 - 연습문제풀이 [14-6] 다음은콘솔명령어중에서디렉토리를변경하는 cd 명령을구현한것이다. 알맞 은코드를넣어 cd() 를완성하시오. [ 연습문제 ]/ch14/exercise14_6.java import java.io.*; import java.util.*; import java.util.regex.*; class Exercise14_6 { static String[] argarr; // 입력한매개변수를담기위한문자열배열 static File curdir; // 현재디렉토리 static { try { curdir = new File(System.getProperty("user.dir")); catch(exception e) { public static void main(string[] args) { Scanner s = new Scanner(System.in); while(true) { try { String prompt = curdir.getcanonicalpath() + ">>"; System.out.print(prompt); // 화면으로부터라인단위로입력받는다. String input = s.nextline(); input = input.trim(); // 입력받은값에서불필요한앞뒤공백을제거한다. argarr = input.split(" +"); String command = argarr[0].trim(); if("".equals(command)) continue; command = command.tolowercase(); // 명령어를소문자로바꾼다. if(command.equals("q")) { // q 또는 Q 를입력하면실행종료한다. System.exit(0); else if(command.equals("cd")) { cd(); else { for(int i=0; i < argarr.length;i++) { System.out.println(argArr[i]); catch(exception e) { e.printstacktrace(); System.out.println(" 입력오류입니다."); // while(true) // main public static void cd() {

147 Java 의정석定石 2 판 - 연습문제풀이 147 if(argarr.length==1) { System.out.println(curDir); return; else if(argarr.length > 2) { System.out.println("USAGE : cd directory"); return; String subdir = argarr[1]; /* (1) 아래의로직에맞게코드를작성하시오. 1. 입력된디렉토리 (subdir) 가 ".." 이면, 1.1 현재디렉토리의조상디렉토리를얻어서현재디렉토리로지정한다. (File클래스의 getparentfile() 을사용 ) 2. 입력된디렉토리 (subdir) 가 "." 이면, 단순히현재디렉토리의경로를화면에출력한다 또는 2의경우가아니면, 3.1 입력된디렉토리 (subdir) 가현재디렉토리의하위디렉토리인지확인한다. 3.2 확인결과가 true이면, 현재디렉토리 (curdir) 을입력된디렉토리 (subdir) 로변경한다. 3.3 확인결과가 false이면, " 유효하지않은디렉토리입니다." 고화면에출력한다. */ // cd() [ 실행결과 ] C:\jdk1.5\work\ch14>java Exercise14_6 C:\jdk1.5\work\ch14>> C:\jdk1.5\work\ch14>>cd ch14 유효하지않은디렉토리입니다. C:\jdk1.5\work\ch14>>cd.. C:\jdk1.5\work>>cd ch14 C:\jdk1.5\work\ch14>> C:\jdk1.5\work\ch14>>cd. C:\jdk1.5\work\ch14 C:\jdk1.5\work\ch14>>q C:\jdk1.5\work\ch14>

148 148 Java 의정석定石 2 판 - 연습문제풀이 [14-7] 다음의코드는예제 을발전시킨것으로대화내용을파일에저장할수있는 기능을추가한프로그램이다. 저장 버튼을누르면대화내용이저장되도록알맞은코드 를넣어완성하시오. [ 연습문제 ]/ch14/chatwin2.java import java.io.*; import java.awt.*; import java.awt.event.*; class ChatWin2 extends Frame { String nickname = ""; TextArea ta = new TextArea(); Panel p = new Panel(); TextField tf = new TextField(30); Button bsave = new Button(" 저장 "); ChatWin2(String nickname) { super("chatting"); this.nickname = nickname; setbounds(200, 100, 300, 200); p.setlayout(new FlowLayout()); p.add(tf, "Center"); p.add(bsave, "Center"); add(ta, "Center"); add(p, "South"); addwindowlistener(new WindowAdapter(){ public void windowclosing(windowevent e) { System.exit(0); ); bsave.addactionlistener(new ActionListener(){ public void actionperformed(actionevent ae) { FileDialog filesave = new FileDialog(ChatWin2.this, " 파일저장 ", FileDialog.SAVE); filesave.setvisible(true); String filename = filesave.getdirectory() + filesave.getfile(); saveas(filename); );

149 Java 의정석定石 2 판 - 연습문제풀이 149 EventHandler handler = new EventHandler(); ta.addfocuslistener(handler); tf.addfocuslistener(handler); tf.addactionlistener(handler); ta.settext("#" + nickname + " 님즐거운채팅되세요."); ta.seteditable(false); setresizable(false); setvisible(true); tf.requestfocus(); void saveas(string filename) { /* (1) 알맞은코드를넣어완성하시오. */ // saveas메서드의끝 public static void main(string[] args) { if(args.length!= 1) { System.out.println("USAGE : java ChatWin2 NICKNAME"); System.exit(0); new ChatWin2(args[0]); // main class EventHandler extends FocusAdapter implements ActionListener { public void actionperformed(actionevent ae) { String msg = tf.gettext(); if("".equals(msg)) return; ta.append("\r\n" + nickname +">"+ msg); tf.settext(""); public void focusgained(focusevent e) { tf.requestfocus(); // class EventHandler // class [ 실행결과 ]

150 150 Java의정석定石 2판 - 연습문제풀이 885

151 Java 의정석定石 2 판 - 연습문제풀이 151 [14-8] 다음의코드는파일로부터한줄씩데이터를읽어서보여주는프로그램이다. 버 튼을이용해서첫줄, 다음줄, 이전줄, 마지막줄로이동할수있으며, 각줄의개행문 자는 를사용한다. (1)~(2) 에알맞은코드를넣어완성하시오. [ 연습문제 ]/ch14/wordstudy.java import java.util.*; import java.io.*; import java.awt.*; import java.awt.event.*; class WordStudy extends Frame { Button first = new Button("<<"); Button prev = new Button("<"); Button next = new Button(">"); Button last = new Button(">>"); Panel buttons = new Panel(); TextArea ta = new TextArea(); ArrayList wordlist = new ArrayList(); final String WORD_FILE = "word_data.txt"; final String CR_LF = System.getProperty("line.separator"); int pos = 0; WordStudy(String title) { super(title); buttons.add(first); buttons.add(prev); buttons.add(next); buttons.add(last); add("south", buttons); add("center", ta); EventHandler handler = new EventHandler(); addwindowlistener(handler); first.addactionlistener(handler); prev.addactionlistener(handler); next.addactionlistener(handler); last.addactionlistener(handler); loadfile(word_file); setbackground(color.black); setsize(300, 200); setlocation(200, 200); setresizable(true); setvisible(true); showfirst(); void showfirst() { pos = 0; display(pos);

152 152 Java 의정석定石 2 판 - 연습문제풀이 void showprevious() { pos = (pos > 0)? --pos : 0; display(pos); void shownext() { int size = wordlist.size(); pos = (pos < size-1)? ++pos : size-1; display(pos); void showlast() { pos = wordlist.size()-1; display(pos); void display(int pos) { // pos 위치에있는라인의내용을보여준다. /* (1) 아래의로직에맞게코드를작성하시오. 1. wordlist 에서 pos 번째의위치에있는데이터를읽어온다. 2. StringTokenizer 를이용해서 를구분자로자른다. 3. 잘라진 Token 에개행문자 (CR_LF) 를붙여서 StringBuffer 에붙인다.(append) 4. StringBuffer 의내용을뽑아서 TextArea 에보여준다. */ void loadfile(string filename) { /* (2) 아래의로직에맞게코드를작성하시오. 1. BuffredReader 와 FileReader 를이용해서파일의내용을라인단위로읽는다. 2. 읽어온라인을 wordlist 에저장한다. 3. 만일예외가발생하면프로그램을종료한다. */ public static void main(string args[]) { WordStudy mainwin = new WordStudy("Word Study"); class EventHandler extends WindowAdapter implements ActionListener { public void actionperformed(actionevent ae) { Button b = (Button)ae.getSource(); if(b==first) { showfirst(); else if(b==prev) { showprevious(); else if(b==next) { shownext(); else if(b==last) { showlast(); public void windowclosing(windowevent e) {

153 Java 의정석定石 2 판 - 연습문제풀이 153 System.exit(0); // class EventHandler [ 실행결과 ] [word_data.txt] mandatory 1. 명령의 2. 통치를위임받은 3. 강제의, 의무의 (obli-gatory); 필수의 preliminary 1. 사전준비 2. 예비시험 3. 주경기이전에펼쳐지는개막경기 commitment 1. 위탁, 위임 ; 위원회회부 2. 인도 ; 투옥, 구류, 수감 3. 언질 [ 공약 ] 을주기 prominent 1. 현저한, 두드러진 2. 돌기한, 양각된 3. 탁월한, 걸출한, 유명한 ; 중요한 Tell me the reason for coming here. 여기에온이유를내게말해라. There is something different about you today. 너오늘평소와좀다르구나. He jumped up and down when he got the news. 그는뉴스를듣고펄쩍뛰었다. When I opened it, I found a surprise. 그것을열었을때, 나는놀라운것을발견했다. I have known him since he was a child. 나는그를어려서부터알고있다.

154 154 Java 의정석定石 2 판 - 연습문제풀이 [14-9] 다음은메모장프로그램의일부인데, fileopen() 과 saveas() 가아직구현되어 있지않다. 이두메서드를구현하여프로그램을완성하시오. [ 연습문제 ]/ch14/exercise14_9.java import java.awt.*; import java.awt.event.*; import java.io.*; class Exercise14_9 extends Frame { String filename; TextArea content; MenuBar mb; Menu mfile; MenuItem minew, miopen, misaveas, miexit; Exercise14_9(String title) { super(title); content = new TextArea(); add(content); mb mfile = new MenuBar(); = new Menu("File"); minew = new MenuItem("New"); miopen = new MenuItem("Open"); misaveas = new MenuItem("Save As..."); miexit = new MenuItem("Exit"); mfile.add(minew); mfile.add(miopen); mfile.add(misaveas); mfile.addseparator(); // 메뉴분리선 (separator) 을넣는다. mfile.add(miexit); mb.add(mfile); // MenuBar에 Menu를추가한다. setmenubar(mb); // Frame에 MenuBar를포함시킨다. // 메뉴에이벤트핸들러를등록한다. MyHandler handler = new MyHandler(); minew.addactionlistener(handler); miopen.addactionlistener(handler); misaveas.addactionlistener(handler); miexit.addactionlistener(handler); setsize(300, 200); setvisible(true); // 선택된파일의내용을읽어서 TextArea 에보여주는메서드 void fileopen(string filename) { /* (1) 아래의로직에맞게코드를작성하시오. 1. BuffredReader 와 FileReader 를이용해서지정된파일을라인단위로읽는다. 2. StringWriter 에출력한다. 3. StringWriter 의내용을 content(textarea) 에보여준다.

155 Java 의정석定石 2 판 - 연습문제풀이 155 */ // fileopen 메서드의끝 // TextArea 의내용을지정된파일에저장하는메서드 void saveas(string filename) { /* (2) 아래의로직에맞게코드를작성하시오. 1. BuffredWriter 와 FileWriter 를생성한다. 2. content 에있는내용을가져와서 BufferedWriter 에출력한다. 3. BufferedWriter 를닫는다. */ // saveas 메서드의끝 public static void main(string args[]) { Exercise14_9 mainwin = new Exercise14_9("Text Editor"); // main 메서드의끝 // 메뉴를클릭했을때메뉴별처리코드 class MyHandler implements ActionListener { public void actionperformed(actionevent e) { String command = e.getactioncommand(); if(command.equals("new")) { content.settext(""); else if(command.equals("open")) { FileDialog fileopen = new FileDialog(Exercise14_9.this, " 파일열기 "); fileopen.setvisible(true); filename = fileopen.getdirectory() + fileopen.getfile(); System.out.println(fileName); // 선택된파일의내용을 TextArea에보여준다. fileopen(filename); else if(command.equals("save As...")) { FileDialog filesave = new FileDialog(Exercise14_9.this, " 파일저장 ",FileDialog.SAVE); filesave.setvisible(true); filename = filesave.getdirectory() + filesave.getfile(); System.out.println(fileName); // 현재 TextArea의내용을선택된파일에저장한다. saveas(filename); else if(command.equals("exit")) { System.exit(0); // 프로그램을종료시킨다. // class MyHandler // Exercise14_9클래스의끝

156 156 Java 의정석定石 2 판 - 연습문제풀이 [ 실행결과 ]

157 Java 의정석定石 2 판 - 연습문제풀이 157 Chapter 15 네트워킹 Networking

158 158 Java 의정석定石 2 판 - 연습문제풀이 [ 연습문제 ] [15-1] ip 주소가 이고서브넷마스크 (subnet mask) 가 일 때, 네트워크주소와호스트주소를계산하여화면에출력하는프로그램을작성하시오. 단, 비트연산자를사용해서계산해야한다. [ 실행결과 ] 네트워크주소 : 호스트주소 : [15-2] 다음중 TCP의특징이아닌것은? a. 전화와같은 1:1 연결기반의프로토콜이다. b. 데이터의전송순서가보장된다. c. UDP보다전송속도가빠르다. d. 데이터의수신여부를확인한다. [15-3] TextField 에 URL 을입력하고 Enter 키를누르면해당페이지의소스를보여주는 'Source Viwer' 프로그램이다. 예제 15-4 를참고해서 (1) 에알맞은코드를넣어완성하시 오. [ 연습문제 ]/ch15/exercise15_3.java import java.net.*; import java.io.*; import java.awt.*; import java.awt.event.*; class SourceViewer extends Frame { TextField tf = new TextField(); TextArea ta = new TextArea(); SourceViewer(String title) { super(title); add(tf, "North"); add(ta, "Center"); tf.addactionlistener(new ActionListener(){ public void actionperformed(actionevent ae) { displaysource(); );

159 Java 의정석定石 2 판 - 연습문제풀이 159 addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent we) { System.exit(0); ); setbounds(500, 200, 500, 300); setvisible(true); void displaysource() { URL url = null; BufferedReader input = null; String address = tf.gettext().trim(); String line = ""; ta.settext(""); try { if(!address.startswith(" address = " /* (1) 알맞은코드를넣어완성하시오. */ input.close(); catch(exception e) { ta.settext(" 유효하지않은 URL입니다."); // displaysource() public static void main(string[] args) { SourceViewer mainwin = new SourceViewer("Source Viewer"); [ 실행결과 ]

160 160 Java 의정석定石 2 판 - 연습문제풀이 [15-4] 다음의코드는예제 13-37(p.753) 과 TCP 통신을하는예제 15-6, 15-7 을결합하여 GUI 채팅프로그램을작성한것이다. (1)~(4) 에알맞은코드를넣어프로그램을완성하시 오. [ 연습문제 ]/ch15/chatserver.java import java.net.*; import java.io.*; import java.awt.*; import java.awt.event.*; class ChatServer extends Frame { String nickname = ""; DataOutputStream out; DataInputStream in; Panel p = new Panel(); TextArea ta = new TextArea(); TextField tf = new TextField(); ChatServer(String nickname) { super("chatting"); this.nickname = nickname; p.setlayout(new BorderLayout()); p.add(tf, "Center"); add(ta, "Center"); add(p, "South"); addwindowlistener(new WindowAdapter(){ public void windowclosing(windowevent e) { System.exit(0); ); EventHandler handler = new EventHandler(); ta.addfocuslistener(handler); tf.addfocuslistener(handler); tf.addactionlistener(handler); ta.seteditable(false); setbounds(200, 200, 300, 200); setvisible(true); tf.requestfocus(); void startserver() { ServerSocket serversocket = null; Socket socket = null; try { /* (1) 아래의로직에맞게코드를작성하시오. 1. 서비소켓을생성하여 7777 번포트와결합시킨다. 2. ta 에 " 서버가준비되었습니다." 라고보여준다. 3. 상대방의연결을기다린다.

161 Java 의정석定石 2 판 - 연습문제풀이 ta에 " 상대방과연결되었습니다." 라고보여준다. 5. 연결된상대방소켓의입력스트림과출력스트립을얻어온다. 6. 반복문을이용해서입력스트림이 null이아닌동안입력스트림으로부터데이터를읽어서 ta에 append한다. */ catch (Exception e) { e.printstacktrace(); public static void main(string[] args) { if(args.length!= 1) { System.out.println("USAGE : java ChatServer NICKNAME"); System.exit(0); ChatServer chatwin = new ChatServer(args[0]); chatwin.startserver(); // main class EventHandler extends FocusAdapter implements ActionListener { public void actionperformed(actionevent ae) { String msg = tf.gettext(); if("".equals(msg)) return; /* (2) 알맞은코드를넣어완성하시오. */ ta.append("\r\n" + nickname +">"+ msg); tf.settext(""); public void focusgained(focusevent e) { tf.requestfocus(); // class EventHandler // class [ 실행결과 ]

162 162 Java 의정석定石 2 판 - 연습문제풀이 [ 연습문제 ]/ch15/chatclient.java import java.net.*; import java.io.*; import java.awt.*; import java.awt.event.*; class ChatClient extends Frame { String nickname = ""; String serverip = ""; int serverport = 0; DataOutputStream out; DataInputStream in; Panel p = new Panel(); TextArea ta = new TextArea(); TextField tf = new TextField(); ChatClient(String nickname, String serverip, String serverport) { super("chatting with " + serverip +":" + serverport); this.nickname = nickname; this.serverip = serverip; this.serverport = Integer.parseInt(serverPort); setbounds(600, 200, 300, 200); p.setlayout(new BorderLayout()); p.add(tf, "Center"); add(ta, "Center"); add(p, "South"); addwindowlistener(new WindowAdapter(){ public void windowclosing(windowevent e) { System.exit(0); ); EventHandler handler = new EventHandler(); ta.addfocuslistener(handler); tf.addfocuslistener(handler); tf.addactionlistener(handler); ta.seteditable(false); setvisible(true); tf.requestfocus(); void startclient() { try { /* (3) 아래의로직에맞게코드를작성하시오. 1. 소켓을생성하여 serverip 의 serverport 에연결한다. 2. ta 에 " 상대방과연결되었습니다." 라고보여준다. 3. 연결된상대방소켓의입력스트림과출력스트립을얻어온다. 4. 반복문을이용해서입력스트림이 null 이아닌동안입력스트림으로부터데이터를읽어서 ta 에 append 한다.

163 932 Java 의정석定石 2 판 - 연습문제풀이 163 */ catch(connectexception ce) { ta.settext(" 상대방과연결할수없습니다."); ce.printstacktrace(); catch(ioexception ie) { ie.printstacktrace(); catch(exception e) { e.printstacktrace(); public static void main(string[] args) { if(args.length!= 3) { System.out.println("USAGE : java ChatClient NICKNAME SERVER_IP SERVER_PORT"); System.exit(0); ChatClient chatwin = new ChatClient(args[0],args[1],args[2]); chatwin.startclient(); // main class EventHandler extends FocusAdapter implements ActionListener { public void actionperformed(actionevent ae) { String msg = tf.gettext(); if("".equals(msg)) return; /* (4) 알맞은코드를넣어완성하시오. */ ta.append("\r\n" + nickname +">"+ msg); tf.settext(""); public void focusgained(focusevent e) { tf.requestfocus(); // class EventHandler // class [ 실행결과 ]

164 164 Java 의정석定石 2 판 - 연습문제풀이 Chapter 2 변수 Variable

165 Java 의정석定石 2 판 - 연습문제풀이 165 [ 연습문제 - 모범답안 ] [2-1] 다음표의빈칸에 8 개의기본형 (primitive type) 을알맞은자리에넣으시오. 크기종류논리형문자형 1 byte 2 byte 4 byte 8 byte boolean char 정수형 byte short int long 실수형 float double

166 166 Java 의정석定石 2 판 - 연습문제풀이 [2-2] 주민등록번호를숫자로저장하고자한다. 이값을저장하기위해서는어떤자료형 (data type) 을선택해야할까? regno 라는이름의변수를선언하고자신의주민등록번호로 초기화하는한줄의코드를적으시오. [ 정답 ] long regno = L; [ 해설 ] 정수형타입으로는보통 int 형을사용하지만, 주민등록번호는 13 자리의정수이기 때문에 int 형의범위를넘어서는값이다. 그래서 long 형을사용해야한다. 그리고리터럴 의접미사 'L' 을잊어서는안된다.

167 Java 의정석定石 2 판 - 연습문제풀이 167 [2-3] 다음의문장에서리터럴, 변수, 상수, 키워드를적으시오. int i = 100; long l = 100L; final float PI = 3.14f; - 리터럴 : 100, 100L, 3.14f - 변수 : i, l - 키워드 : int, long, final, float - 상수 : PI

168 168 Java 의정석定石 2 판 - 연습문제풀이 [2-4] 다음중기본형 (primitive type) 이아닌것은? a. int b. Byte c. double d. boolean [ 정답 ] b [ 해설 ] 기본형은 boolean, byte, short, char, int, long, float, double 모두 8 개이다. 그외의타입은모두참조형 (reference type) 이다.

169 Java 의정석定石 2 판 - 연습문제풀이 169 [2-5] 다음문장들의출력결과를적으세요. 오류가있는문장의경우, 괄호안에 오 류 라고적으시오. System.out.println( ) (12 ) System.out.println(true + ) (true ) System.out.println( A' + 'B') (131 ) System.out.println('1' + 2) (51 ) System.out.println('1' + '2') (99 ) System.out.println('J' + ava ) (Java ) System.out.println(true + null) ( 오류 ) [ 해설 ] 문자열과덧셈연산을하면그결과는항상문자열이된다. 문자열 + any type 문자열 + 문자열 문자열 any type + 문자열 문자열 + 문자열 문자열 "" + 7 "" + "7" "7" // 빈문자열을더해서숫자를문자열로변환한다. 7 + "" "7" + "" "7" 7 + " " "7" + " " "7 " " " + 7 " " + "7" " 7" 7 + "7" "7" + "7" "77" "" 14 + "" "14" + "" "14" "" "7" + 7 "7" + "7" "77" true + "" "true" + "" "true" null + "" "null" + "" "null" 하지만문자와문자의덧셈연산의결과는 int형정수값이된다. 왜냐하면 int형보다작은타입 (byte, char, short) 은 int형으로변환된후에덧셈연산이진행되기때문이다. 'A'+'B' 의경우, char + char int + int int의과정을통해최종결과는 int형정수값이된다. 'A'+'B' 'A' 와 'B' 의문자코드의값은각각 65 와 66 이다. '1' '1' 의문자코드의값은 49 이다. '1'+'2'

170 170 Java 의정석定石 2 판 - 연습문제풀이 [2-6] 다음중키워드가아닌것은?( 모두고르시오 ) a. if b. True c. NULL d. Class e. System [ 정답 ] b, c, d, e [ 해설 ] Java 에서는대소문자를구별하기때문에 true 는키워드이지만 True 는키워드가아 니다. 다음은 Java 에서사용하는키워드이다. abstract do if package synchronized boolean double implements private this break else import protected throw byte enum instanceof public throws case extends int return transient catch false interface short true char final long static try class finally native strictfp void continue float new super volatile default for null switch while

171 Java 의정석定石 2 판 - 연습문제풀이 171 [2-7] 다음중변수의이름으로사용할수있는것은? ( 모두고르시오 ) a. $ystem b. channel#5 - 허용하지않는특수문자 '#' 를사용할수없다. c. 7eleven - 숫자로시작하면안된다. d. If e. 자바 f. new - 예약어라서사용할수없다. g. $MAX_NUM h. hello@com - 허용하지않는특수문자 '@' 를사용할수없다. [ 정답 ] a, d, e, g [ 해설 ] 변수의이름 (identifier) 은다음과같은규칙이있다. 1. 대소문자가구분되며길이에제한이없다. - True와 true는서로다른것으로간주된다. 2. 예약어를사용해서는안된다. - true는예약어라서사용할수없지만, True는가능하다. 3. 숫자로시작해서는안된다. - top10은허용하지만, 7up는허용되지않는다. 4. 특수문자는 '_' 와 '$' 만을허용한다. - $harp은허용되지만, S#arp은허용되지않는다.

172 172 Java 의정석定石 2 판 - 연습문제풀이 [2-8] 참조형변수 (reference type) 와같은크기의기본형 (primitive type) 은? ( 모두고르시오 ) a. int(4 byte) b. long(8 byte) c. short(2 byte) d. float(4 byte) e. double(8 byte) [ 정답 ] a, d [ 해설 ] 모든참조형변수는 4 byte이므로, 크기가 4 byte인기본형타입을고르면된다.

173 Java 의정석定石 2 판 - 연습문제풀이 173 [2-9] 다음중형변환을생략할수있는것은? ( 모두고르시오 ) byte b = 10; char ch = 'A'; int i = 100; long l = 1000L; a. b = (byte)i; // int(4byte) byte(1byte) 이므로반드시형변환필요 b. ch = (char)b; // byte(1byte) char(2byte) 이지만범위가달라서형변환필요 c. short s = (short)ch; // char,short은 2byte이지만범위가달라서형변환필요 d. float f = (float)l; // float(4byte) 의범위가 int(4byte) 보다커서생략가능 e. i = (int)ch; // char(2 byte) int(4byte) 이므로생략가능 [ 정답 ] d, e

174 174 Java 의정석定石 2 판 - 연습문제풀이 [2-10] char 타입의변수에저장될수있는정수값의범위는? (10 진수로적으시오 ) [ 정답 ] 0~65535 [ 해설 ] char는 2 byte(2*8=16bit) 이므로 2의 16제곱 개의값을표현할수있다. 2의 16제곱은 65536개이며, 0을포함해야하므로 0~65535( 모두 65536개 ) 가 char범위가된다.

175 Java 의정석定石 2 판 - 연습문제풀이 175 [2-11] 다음중변수를잘못초기화한것은? ( 모두고르시오 ) a. byte b = 256; // byte의범위 (-128~127) 를넘는값으로초기화할수없음. b. char c = ''; // char는반드시한개의문자를지정해야함 c. char answer = 'no'; // char에두개의문자를저장할수없음. d. float f = 3.14 // 3.14는 3.14d의생략된형태. 접미사f를붙이거나형변환필요 e. double d = 1.4e3f; // double(8byte) 에 float값 (4byte) 을넣는것이므로 OK [ 정답 ] a,b,c,d [ 해설 ] 접미사가있는자료형은 long, float, double 모두세개의자료형이며, 접미사는대소문자를구별하지않는다. double은접미사를생략할수있으므로 float리터럴에는반드시접미사를붙여야한다.

176 176 Java 의정석定石 2 판 - 연습문제풀이 [2-12] 다음중 main메서드의선언부로알맞은것은? ( 모두고르시오 ) a. public static void main(string[] args) b. public static void main(string args[]) c. public static void main(string[] arv) // 매개변수 args의이름은달라도됨 d. public void static main(string[] args) // void는반드시 main앞에와야한다. e. static public void main(string[] args) // public과 static은위치가바뀌어도됨 [ 정답 ] a,b,c,e [ 해설 ] 배열을의미하는기호인 [] 는타입뒤에붙여도되고변수명뒤에붙여도되기때문에 'String[] args' 와 String args[]' 는같은뜻이다. 자세한내용은 5장배열 (Array) 에서자세히설명할것이다.

177 Java 의정석定石 2 판 - 연습문제풀이 177 [2-13] 다음중타입과기본값이잘못연결된것은? ( 모두고르시오 ) a. boolean - false b. char - '\u0000' c. float // float는 0.0f가기본값. 0.0은 0.0d에서접미사 d가생략된것 d. int - 0 e. long - 0 // long은 0L이기본값. f. String - "" // String은참조형타입. 모든참조형타입의기본값은 null [ 정답 ] c,e,f [ 해설 ] 리터럴의접미사는대소문자를구분하지않으므로, long의경우 'L' 또는 'l'( 소문자 ) 을사용할수있다. 'l' 은숫자 '1' 과혼동하기쉬우므로대문자를사용하는것이좋다.

178 178 Java 의정석定石 2 판 - 연습문제풀이 Chapter 3 연산자 Operator

179 Java 의정석定石 2 판 - 연습문제풀이 179 [ 연습문제 - 모범답안 ] [3-1] 다음연산의결과를적으시오. [ 연습문제 ]/ch3/exercise3_1.java class Exercise3_1 { public static void main(string[] args) { int x = 2; int y = 5; char c = 'A'; // 'A' 의문자코드는 65 System.out.println(1 + x << 33); System.out.println(y >= 5 x < 0 && x > 2); System.out.println(y += 10 - x++); System.out.println(x+=2); System.out.println(!('A' <= c && c <='Z') ); System.out.println('C'-c); System.out.println('5'-'0'); System.out.println(c+1); System.out.println(++c); System.out.println(c++); System.out.println(c); [ 정답 ] [ 실행결과 ] 6 true 13 5 false B B C [ 해설 ] System.out.println(1 + x << 33); '1 + x << 33' 는 x의값이 2이므로 '1 + 2 << 33' 가된다. 덧셈연산자 (+) 보다쉬프트연산자 (<<) 가우선순위가낮으므로 '3 << 33' 이된다. int는 32 bit이므로 33번쉬프트하지않고 1번만쉬프트한다. '3 << 1' 은 3에 2의 1제곱 인 2를곱하는것과같은결과를얻으므로 '3 * 2' 가되어결국 6을얻는다. System.out.println(y >= 5 x < 0 && x > 2); x 의값이 2 이고, y 의값이 5 이므로위의식은 'true false && false' 가된다. 논리연

180 180 Java 의정석定石 2 판 - 연습문제풀이 산자 'and(&&)' 는 'or( )' 보다우선순위가높기때문에 'false && false' 가먼저연산되 어 'true false' 가되고최종결과는 true 가된다. System.out.println(y += 10 - x++); 'y += 10 - x++' 를풀어쓰면, 'y = y + (10 - x++)' 이된다. x++ 은후위형이기때문에 x 의값이증가되지않은상태에서 (10 - x) 는계산되고 x의값은 1증가된다. 그래서 (10-2) 로계산이되고 x의값은 1감소하여 1이된다. y의값은 5이므로식은 'y = 5 + (10-2)' 가되어 y에 13이저장된다. System.out.println(x+=2); 'x+=2' 는 'x=x+2' 와같다. 이전의식에서 x 의값이 1 증가하였으므로이제 x 의값은 3 이 다. 3 에 2 를더했으므로결과는 5 가된다. System.out.println(!('A' <= c && c <='Z') );!('A' <= c && c <='Z') 는문자 c가대문자가아닌지를확인하는조건식이다. 먼저괄호안의 'A' <= c && c <='Z' 가먼저계산되고마지막에이계산결과가논리부정연산자 (!) 에의해반대 (true false) 로바뀐다. c가 'A' 이므로 'A' <= 'A' && 'A' <='Z' 가되고양쪽의조건식이 true이므로 'true && true' 의결과인 true를얻게된다. 이결과에논리부정연산 (!) 을수행하니까 true가 false로바뀌어최종결과는 false가된다. System.out.println('C'-c); 이항연산자는피연산자가 int보다작은타입 (byte, short, char) 인경우 int로변환한다음에연산을수행한다. c의값이 'A' 이므로 'C'-c는 C'-'A' 가되고 'C' 와 'A' 는 int로변환되어 '67-65' 가되고최종결과는 2가된다. System.out.println('5'-'0'); '5'-'0' 도위와같은이유로 '53-48' 이되어 5 를결과로얻는다. System.out.println(c+1); c+1은 c의값이 'A' 이므로 'A'+1이되고, 이항연산자의성질 (int보다작은타입은 int로변환후연산 ) 때문에 'A' 는문자코드값인 65로변환되어 '65 + 1' 을수행하여 66을결과로얻는다. 단지변수 c에저장된값을읽어서수식을계산한것이므로변수 c의저장된값에는아무런변화가없다.

181 Java 의정석定石 2 판 - 연습문제풀이 181 System.out.println(++c); 단항연산자인 '++' 은이항연산자와달리 int보다작은타입도형변환을하지않는다.( 이항연산자는연산을위해 피연산자스택 (operand stack) 을사용하는데이과정에서형변환이발생하는것이다. 반면에단항연산자인증가연산자 '++' 은 피연산자스택 을사용하지않으므로형변환도발생하지않는다.) 그래서 println은변수 c를숫자 (int) 로출력하는것이아니라문자로출력한다. 변수 c에저장된문자가 'A'( 실제로저장된것은 'A' 의문자코드인 65) 이므로문자코드의값이 1증가되어 66('B' 의문자코드 ) 이변수 c에저장된다. 변수 c에저장된것은문자코드, 즉정수값이다. println은이값을타입에따라어떻게출력할지를결정한다. 만일문자타입이면저장된값 ( 문자코드 ) 에해당하는문자를출력하고숫자라면숫자로출력한다. System.out.println(c++); 단항연산자 '++' 이후위형인경우에는 println() 에의해서변수 c가출력된후에 c에저장된값이증가하므로문자 'B' 가출력된후에변수 c의값이 1증가해서문자 'C' 가저장된다.

182 182 Java 의정석定石 2 판 - 연습문제풀이 [3-2] 아래의코드는사과를담는데필요한바구니 ( 버켓 ) 의수를구하는코드이다. 만일 사과의수가 123 개이고하나의바구니에는 10 개의사과를담을수있다면, 13 개의바구니 가필요할것이다. (1) 에알맞은코드를넣으시오. [ 연습문제 ]/ch3/exercise3_2.java class Exercise3_2 { public static void main(string[] args) { int numofapples = 123; // 사과의개수 int sizeofbucket = 10; // 바구니의크기 ( 바구니에담을수있는사과의개수 ) int numofbucket = numofapples/sizeofbucket + (numofapples%sizeofbucket > 0? 1 : 0) ; System.out.println(" 필요한바구니의수 :"+numofbucket); [ 실행결과 ] 13 [ 정답 ] numofapples/sizeofbucket + (numofapples%sizeofbucket > 0? 1 : 0) [ 해설 ] 사과의개수 (numofapples) 를바구니의크기 (sizeofbucket) 으로나눗셈연산 (/) 을하면사과를담는데필요한바구니의수 (numofbucket) 를구할수있다. 정수간의나눗셈연산의특징은반올림을하지않고버림을한다는것이다. 예를들어 125/10의결과는 13 이아니라 12가된다. 게다가 int와 int간의이항연산결과는 int이기때문에, 12.5와같은실수값결과가나오지않는다. 그리고사과의개수 (numofapples) 를바구니의크기 (sizeofbucket) 으로나눴을때나머지가있으면하나의바구니가더필요하다. 그래서나머지연산자 (%) 를이용해서나눗셈연산에서나머지가발생하는지확인해서, 나머지가발생하면바구니의개수 (numofbucket) 에 1을더해줘야한다.

183 Java 의정석定石 2 판 - 연습문제풀이 183 [3-3] 아래는변수 num 의값에따라 양수, 음수, 0 을출력하는코드이다. 삼항연산 자를이용해서 (1) 에알맞은코드를넣으시오. [Hint] 삼항연산자를두번사용하라. [ 연습문제 ]/ch3/exercise3_3.java class Exercise3_3 { public static void main(string[] args) { int num = 10; System.out.println(num > 0? " 양수 ":(num < 0? " 음수 " : "0")); [ 실행결과 ] 양수 [ 정답 ] num > 0? " 양수 ":(num < 0? " 음수 " : "0") [ 설명 ] 삼항연산자를사용하면 2가지경우의수를처리할수있다. 삼항연산자에삼항연산자를포함시키면 3가지경우의수를처리할수있다. num의값이 0보다크면, ' 양수 ' 를출력하고끝나지만, num의값이 0보다작거나같으면괄호안의삼항연산자가수행된다. 여기서 num의값이 0보다작으면 ' 음수 ' 가출력되고, 그렇지않으면 (num의값이 0이면 ) '0' 이출력된다.

184 184 Java 의정석定石 2 판 - 연습문제풀이 [3-4] 아래는변수 num 의값중에서백의자리이하를버리는코드이다. 만일변수 num 의값이 456 이라면 400 이되고, 111 이라면 100 이된다. (1) 에알맞은코드를넣으 시오. [ 연습문제 ]/ch3/exercise3_4.java class Exercise3_4 { public static void main(string[] args) { int num = 456; System.out.println(num/100*100); [ 실행결과 ] 400 [ 정답 ] num/100*100 [ 해설 ] 앞의문제에서도설명했듯이, 나눗셈연산자는반올림을하지않고버림을한다. 이성질을이용한문제이다.

185 Java 의정석定石 2 판 - 연습문제풀이 185 [3-5] 아래는변수 num 의값중에서일의자리를 1 로바꾸는코드이다. 만일변수 num 의 값이 333 이라면 331 이되고, 777 이라면 771 이된다. (1) 에알맞은코드를넣으시오. [ 연습문제 ]/ch3/exercise3_5.java class Exercise3_5 { public static void main(string[] args) { int num = 333; System.out.println(num/10*10+1); [ 실행결과 ] 331 [ 정답 ] num/10*10+1 [ 해설 ] 앞의문제를약간더응용한문제이다. 이미다설명한내용이므로자세한설명은 생략한다.

186 186 Java 의정석定石 2 판 - 연습문제풀이 [3-6] 아래는변수 num의값보다크면서도가장가까운 10의배수에서변수 num의값을뺀나머지를구하는코드이다. 예를들어, 24의크면서도가장가까운 10의배수는 30이다. 19의경우 20이고, 81의경우 90이된다. 30에서 24를뺀나머지는 6이기때문에변수 num의값이 24라면 6을결과로얻어야한다. (1) 에알맞은코드를넣으시오. [Hint] 나머지연산자를사용하라. [ 연습문제 ]/ch3/exercise3_6.java class Exercise3_6 { public static void main(string[] args) { int num = 24; System.out.println(10 - num%10); [ 실행결과 ] 6 [ 정답 ] 10 - num%10 [ 해설 ] 고민을좀해봐야하는문제인데답을보고나면너무간단해서허탈할지도모르겠다. 이문제를풀기위해여러연산자를놓고고민을해보는것에의미가있다고생각해서넣게되었다. 다른정답으로는 '(num/10+1)*10 - num' 이있다.

187 Java 의정석定石 2 판 - 연습문제풀이 187 [3-7] 아래는화씨 (Fahrenheit) 를섭씨 (Celcius) 로변환하는코드이다. 변환공식이 'C = 5/9 (F - 32)' 라고할때, (1) 에알맞은코드를넣으시오. 단, 변환결과값은소수점 셋째자리에서반올림해야한다.(Math.round() 를사용하지않고처리할것 ) [ 연습문제 ]/ch3/exercise3_7.java class Exercise3_7 { public static void main(string[] args) { int fahrenheit = 100; float celcius = (int)((5/9f * (fahrenheit - 32))* ) / 100f; System.out.println("Fahrenheit:"+fahrenheit); System.out.println("Celcius:"+celcius); [ 실행결과 ] Fahrenheit:100 Celcius:37.78 [ 정답 ] (int)((5/9f * (fahrenheit - 32))* ) / 100f [ 해설 ] 먼저화씨를섭씨로바꾸는공식은 '5/9f * (fahrenheit - 32)' 이다. 5/9의결과는 0이기때문에두피연산자중어느한쪽을반드시 float나 double로해야만실수형태의결과를얻을수있다. 그래서정수형리터럴인 9대신 float타입의리터럴인 9f를사용하였다. 소수점셋째자리에서반올림을하려면다음의과정을거쳐야한다. 1. 값에 100을곱한다 * 의결과에 0.5를더한다 의결과를 int타입으로변환한다. (int)3778, 의결과를 100f로나눈다.(100으로나누면소수점아래의값을잃는다.) 3778 / 100f 37.78

188 188 Java 의정석定石 2 판 - 연습문제풀이 [3-8] 아래코드의문제점을수정해서실행결과와같은결과를얻도록하시오. [ 연습문제 ]/ch3/exercise3_8.java class Exercise3_8 { public static void main(string[] args) { byte a = 10; byte b = 20; byte c = (byte)(a + b); char ch = 'A'; ch = (char)(ch + 2); float f = 3 / 2f; long l = 3000 * 3000 * 3000L; float f2 = 0.1f; double d = 0.1; boolean result = (float)d==f2; System.out.println("c="+c); System.out.println("ch="+ch); System.out.println("f="+f); System.out.println("l="+l); System.out.println("result="+result); [ 실행결과 ] c=30 ch=c f=1.5 l = result=true [ 정답 ] byte c = a + b; byte c = (byte)(a + b); ch = ch + 2; ch = (char)(ch + 2); float f = 3 / 2; float f = 3 / 2f; long l = 3000 * 3000 * 3000; long l = 3000 * 3000 * 3000L; boolean result = d==f2; boolean result = (float)d==f2; [ 해설 ] 이항연산은두피연산자의타입을일치시킨후연산을수행한다는것, 그리고 int 보다작은타입은 int 로자동변환한다는것은반드시기억하고있어야하는중요한내용이다. byte c = a + b; byte c = (byte)(a + b); 변수 a 와 b 는모두 byte 타입이므로이항연산인덧셈연산을하기전에 int 타입으로자동형변환된다. int 와 int 의덧셈이므로연산결과는 int 가된다. int 타입의값 (4 byte) 을 byte 타입의변수 (1 byte) 에담아야하므로형변환을해주어야한다.

189 Java 의정석定石 2 판 - 연습문제풀이 189 ch = ch + 2; ch = (char)(ch + 2); 이것도이전의경우와마찬가지이다. char 타입이덧셈연산의과정을거치면서 int 타입으로변환되므로 char 타입의변수에저장하기위해서는 char 타입으로형변환을해주어야한다. float f = 3 / 2; float f = 3 / 2f; int 와 int 의연산결과는 int 이기때문에 3/2 의결과는 1 이된다. 연산결과를실수로얻고싶으면, 적어도두피연산자중한쪽이실수타입 (float 와 double 중의하나 ) 이어야한다. long l = 3000 * 3000 * 3000; long l = 3000 * 3000 * 3000L; int*int*int 의결과는 int 이므로 int 타입의최대값인약 2*10 의 9 제곱을넘는결과는오버플로우가발생하여예상한것과는다른값을얻는다. 그래서피연산자중적어도한값은 long 타입이어야최종결과를 long 타입의값으로얻기때문에 long 타입의접미사 'L' 을붙여서 long 타입의리터럴로만들어줘야한다. boolean result = d==f2; boolean result = (float)d==f2; 비교연산자도이항연산자이므로연산시에두피연산자의타입을맞추기위해형변환이발생한다. 그래서 double 과 float 의연산은 double 과 double 의연산으로자동형변환되는데, 실수는정수와달리근사값으로표현을하기때문에 float 를 double 로형변환했을때오차가발생할수있다. 그래서 float 값을 double 로형변환하기보다는 double 값을유효자리수가적은 float 로형변환해서비교하는것이정확한결과를얻는다.

190 190 Java 의정석定石 2 판 - 연습문제풀이 [3-9] 다음은문자형변수 ch 가영문자 ( 대문자또는소문자 ) 이거나숫자일때만변수 b 의값이 true 가되도록하는코드이다. (1) 에알맞은코드를넣으시오. [ 연습문제 ]/ch3/exercise3_9.java class Exercise3_9 { public static void main(string[] args) { char ch = 'z'; boolean b = ('a' <= ch && ch <= 'z') ('A' <= ch && ch <= 'Z'); System.out.println(b); [ 실행결과 ] true [ 정답 ] ('a' <= ch && ch <= 'z') ('A' <= ch && ch <= 'Z') 괄호는생략해 도된다.

191 Java 의정석定石 2 판 - 연습문제풀이 191 [3-10] 다음은대문자를소문자로변경하는코드인데, 문자 ch 에저장된문자가대문자 인경우에만소문자로변경한다. 문자코드는소문자가대문자보다 32 만큼더크다. 예를 들어 'A 의코드는 65 이고 a' 의코드는 97 이다. (1)~(2) 에알맞은코드를넣으시오. [ 연습문제 ]/ch3/exercise3_10.java class Exercise3_10 { public static void main(string[] args) { char ch = 'A'; char lowercase = ('A' <= ch && ch <= 'Z')? (char)(ch+32): ch; System.out.println("ch:"+ch); System.out.println("ch to lowercase:"+lowercase); [ 실행결과 ] ch:a ch to lowercase:a [ 정답 ] ('A' <= ch && ch <= 'Z'), (char)(ch+32) [ 해설 ] 대문자인경우에만문자코드의값을 32만큼증가시키면소문자가된다. 문자 ch가대문자인지를확인하는조건식은 'A' <= ch && ch <= 'Z' 이고, 문자 ch의문자코드를 32증가시키기위해서는덧셈연산을해야하는데, 이때덧셈연산의결과가 int이므로 char타입으로의형변환이필요하다.

192 192 Java 의정석定石 2 판 - 연습문제풀이 Chapter 4 조건문과반복문 if, switch, for, while

193 Java 의정석定石 2 판 - 연습문제풀이 193 [ 연습문제 - 모범답안 ] [4-1] 다음의문장들을조건식으로표현하라. 1. int형변수 x가 10보다크고 20보다작을때 true인조건식 2. char형변수 ch가공백이나탭이아닐때 true인조건식 3. char형변수 ch가 x' 또는 X' 일때 true인조건식 4. char형변수 ch가숫자 ( 0 ~ 9 ) 일때 true인조건식 5. char형변수 ch가영문자 ( 대문자또는소문자 ) 일때 true인조건식 6. int형변수 year가 400으로나눠떨어지거나또는 4로나눠떨어지고 100으로나눠떨어지지않을때 true인조건식 7. boolean형변수 poweron가 false일때 true인조건식 8. 문자열참조변수 str이 yes 일때 true인조건식 [ 정답 & 해설 ] 1. int형변수 x가 10보다크고 20보다작을때 true인조건식 10 < x && x < char형변수 ch가공백이나탭이아닐때 true인조건식!(ch == ' ' ch =='\t') 또는 ch!=' ' && ch!='\t' 3. char형변수 ch가 x' 또는 X' 일때 true인조건식 ch == 'x' ch == 'X' 4. char형변수 ch가숫자 ( 0 ~ 9 ) 일때 true인조건식 '0' <= ch && ch <='9' 5. char형변수 ch가영문자 ( 대문자또는소문자 ) 일때 true인조건식 ('a' <= ch && ch <= 'z') ('A' <= ch && ch <= 'Z') 6. int형변수 year가 400으로나눠떨어지거나또는 4로나눠떨어지고 100으로나눠떨어지지않을때 true인조건식 (year%400==0 year%4==0) && year%100!=0 7. boolean형변수 poweron가 false일때 true인조건식!poweron 또는 poweron==false 8. 문자열참조변수 str이 yes 일때 true인조건식 str.equals("yes") 또는 "yes".equals(str)

194 194 Java 의정석定石 2 판 - 연습문제풀이 [4-2] 1 부터 20 까지의정수중에서 2 또는 3 의배수가아닌수의총합을구하시오. [ 정답 ] 73 [ 해설 ] [ 연습문제 ]/ch4/exercise4_2.java class Exercise4_2 { public static void main(string[] args) { int sum = 0; for(int i=1; i <=20; i++) { if(i%2!=0 && i%3!=0) //i가 2또는 3의배수가아닐때만 sum에 i를더한다. sum +=i; System.out.println("sum="+sum); // main

195 Java 의정석定石 2 판 - 연습문제풀이 195 [4-3] 1+(1+2)+(1+2+3)+( )+...+( ) 의결과를계산하시오. [ 정답 ] 220 [ 해설 ] [ 연습문제 ]/ch4/exercise4_3.java class Exercise4_3 { public static void main(string[] args) { int sum = 0; int totalsum = 0; for(int i=1; i <=10; i++) { sum += i; totalsum += sum; System.out.println("totalSum="+totalSum); // main i의값이 1부터 10까지 1씩증가하며변하는동안, i의값을누적해서 sum에저장하면 sum의값은 1,3,6,10,15,21,28,36,45,55의순서로변해간다. 즉, 1, 1+2, 1+2+3, , ,..., , 의순서로변해간다. 따라서 1+(1+2)+(1+2+3)+( )+...+( ) 의결과를계산하려면, sum의값을계속더해나가면된다. 그래서 totalsum이라는변수를두고, 이변수에 sum의값을계속해서누적하여결과를얻었다. i sum totalsum = =1+3 = 1+(1+2) 3 6 = =1+3+6 = 1+(1+2)+(1+2+3) 4 10= = = = = = = = = = = = = =

196 196 Java 의정석定石 2 판 - 연습문제풀이 [4-4] 1+(-2)+3+(-4)+... 과같은식으로계속더해나갔을때, 몇까지더해야총합이 100 이상이되는지구하시오. [ 정답 ] 199 [ 해설 ] [ 연습문제 ]/ch4/exercise4_4.java class Exercise4_4 { public static void main(string[] args) { int sum = 0; // 총합을저장할변수 int s = 1; int num = 0; // 값의부호를바꿔주는데사용할변수 // 조건식의값이 true이므로무한반복문이된다. for(int i=1;true; i++, s=-s) { // 매반복마다 s의값은 1, -1, 1, num = s * i; // i와부호 (s) 를곱해서더할값을구한다. sum += num; if(sum >=100) // 총합이 100 보다같거나크면반복문을빠져나간다. break; System.out.println("num="+num); System.out.println("sum="+sum); // main for 문대신 while 문을써도좋고, for 문을보다간략히하면다음과같이할수있다. for(int i=1; sum < 100; i++, s=-s) { num = i * s; sum += num;

197 Java 의정석定石 2 판 - 연습문제풀이 197 [4-5] 다음의 for 문을 while 문으로변경하시오. [ 연습문제 ]/ch4/exercise4_5.java public class Exercise4_5 { public static void main(string[] args) { for(int i=0; i<=10; i++) { for(int j=0; j<=i; j++) System.out.print("*"); System.out.println(); // end of main // end of class [ 정답 ] [ 연습문제 ]/ch4/exercise4_5_2.java public class Exercise4_5_2 { public static void main(string[] args) { int i=0; while( i<=10) { int j=0; while(j<=i) { System.out.print("*"); j++; System.out.println(); i++; // end of main // end of class

198 198 Java 의정석定石 2 판 - 연습문제풀이 [4-6] 두개의주사위를던졌을때, 눈의합이 6 이되는모든경우의수를출력하는프 로그램을작성하시오. [ 정답 ] 1+5=6 2+4=6 3+3=6 4+2=6 5+1=6 [ 해설 ] [ 연습문제 ]/ch4/exercise4_6.java class Exercise4_6 { public static void main(string[] args) { for(int i=1;i<=6;i++) for(int j=1;j<=6;j++) if(i+j==6) System.out.println(i+"+"+j+"="+(i+j)); // main 반복문을중첩해서 1 부터 6 까지를반복하면서두값의합이 6 인경우를화면에출력하면 된다.

199 Java 의정석定石 2 판 - 연습문제풀이 199 [4-7] Math.random() 을이용해서 1 부터 6 사이의임의의정수를변수 value 에저장하는 코드를완성하라. (1) 에알맞은코드를넣으시오. [ 연습문제 ]/ch4/exercise4_7.java class Exercise4_7 { public static void main(string[] args) { int value = (int)(math.random()*6)+1; System.out.println("value:"+value); [ 정답 ] (int)(math.random()*6)+1 [ 해설 ] 1. 각변에 6 을곱한다. 0.0 * 6 <= Math.random() * 6 < 1.0 * <= Math.random() * 6 < 각변을 int 형으로변환한다. (int)0.0 <= (int)(math.random() * 6) < (int)6.0 0 <= (int)(math.random() * 6) < 6 지금까지는 0 과 6 사이의정수중하나를가질수있다. 0 은포함되고 6 은포함되지않는 다. 3. 각변에 1 을더한다 <= (int)(math.random() * 6) + 1 < <= (int)(math.random() * 6) + 1 < 7 자, 이제는 1 과 7 사이의정수중하나를얻을수있다. 단, 1 은범위에포함되고 7 은포 함되지않는다.

200 200 Java 의정석定石 2 판 - 연습문제풀이 [4-8] 방정식 2x+4y=10 의모든해를구하시오. 단, x 와 y 는정수이고각각의범위는 0<=x<=10, 0<=y<=10 이다. [ 실행결과 ] x=1, y=2 x=3, y=1 x=5, y=0 [ 정답 ] [ 연습문제 ]/ch4/exercise4_8.java class Exercise4_8 { public static void main(string[] args) { for(int x=0; x <=10;x++) { // main for(int y=0; y <=10;y++) { if(2*x+4*y==10) { System.out.println("x="+x+", y="+y); [ 해설 ] 문제 4-6 과유사한문제이다. 반복문을중첩해서 0 부터 10 까지 1 씩증가시켜가면서 돌린다. 반복과정에서방정식을만족시키는경우에만 x 와 y 의값을출력하면된다.

201 Java 의정석定石 2 판 - 연습문제풀이 201 [4-9] 숫자로이루어진문자열 str이있을때, 각자리의합을더한결과를출력하는코드를완성하라. 만일문자열이 "12345" 라면, 의결과인 15를출력이출력되어야한다. (1) 에알맞은코드를넣으시오. [Hint] String 클래스의 charat(int i) 을사용 [ 연습문제 ]/ch4/exercise4_9.java class Exercise4_9 { public static void main(string[] args) { String str = "12345"; int sum = 0; for(int i=0; i < str.length(); i++) { sum += str.charat(i) - '0'; System.out.println("sum="+sum); [ 실행결과 ] 15 [ 정답 ] sum += str.charat(i) - '0'; [ 해설 ] charat(int i) 메서드는문자열에서 i 번째문자를반환한다.(i 의값은 0 부터시작 한다.) 예를들어, "Hello" 라는문자열이있을때 "Hello".charAt(4) 는문자 'o' 가된다. index char H e l l o charat(int i) 을이용해서반복문으로각문자열의문자를하나씩읽어서숫자로변환한 다음 sum 에계속더하면된다. 문자 '3' 을숫자 3 로바꾸는방법은문자 '3' 에서문자 '0' 을 빼주는것이다. 알파벳이나숫자는문자코드가연속적으로할당되었기때문에이런방법 이가능하다. 문자 문자코드 뺄셈과같은이항연산자는 int 타입보다작은타입은피연산자 (byte, short, char) 은 int 로변환한다. 그래서 '3'-'0' 은 으로변환되고그결과는숫자 3 이된다. '3'-'0'

202 202 Java 의정석定石 2 판 - 연습문제풀이 [4-10] int 타입의변수 num 이있을때, 각자리의합을더한결과를출력하는코드를 완성하라. 만일변수 num 의값이 라면, 의결과인 15 를출력하라. (1) 에알맞은코드를넣으시오. [ 주의 ] 문자열로변환하지말고숫자로만처리해야한다. [ 연습문제 ]/ch4/exercise4_10.java class Exercise4_10 { public static void main(string[] args) { int num = 12345; int sum = 0; while(num > 0) { sum += num%10; num /= 10; System.out.println("sum="+sum); [ 실행결과 ] 15 [ 정답 ] while(num > 0) { sum += num%10; num /= 10; [ 해설 ] 문제4-9에서처럼문자열에서 charat(int i) 를이용해서문자를숫자로변환하는것보다숫자에서각자리수의숫자를하나씩뽑아내는것은더어렵다. 하지만, 숫자의마지막자리를어떻게뽑아내는지만알아내면나머지는쉽게해결된다. 방법은의외로간단하다아래와같이숫자를 10으로반복해서나눠가면서, 10으로나머지연산을하면일의자리를얻어낼수있다. num num% 이값들을더하기만하면변수 num 에저장된숫자의각자리수를모두더한값을구할수 있다.

203 Java 의정석定石 2 판 - 연습문제풀이 203 [4-11] 피보나치 (Fibonnaci) 수열 ( 數列 ) 은앞을두수를더해서다음수를만들어나가는수열이다. 예를들어앞의두수가 1과 1이라면그다음수는 2가되고그다음수는 1과 2를더해서 3이되어서 1,1,2,3,5,8,13,21,... 과같은식으로진행된다. 1과 1부터시작하는피보나치수열의 10번째수는무엇인지계산하는프로그램을완성하시오. [ 연습문제 ]/ch4/exercise4_11.java public class Exercise4_11 { public static void main(string[] args) { // Fibonnaci 수열의시작의첫두숫자를 1, 1 로한다. int num1 = 1; int num2 = 1; int num3 = 0; // 세번째값 System.out.print(num1+","+num2); for (int i = 0 ; i < 8 ; i++ ) { num3 = num1 + num2; // 세번째값은첫번째와두번째값을더해서얻는다. System.out.print(","+num3); // 세번째수열출력 num1 = num2; // 두번째수열을첫번째값으로한다. num2 = num3; // 세번째수열을두번째값으로한다. // end of main // end of class [ 실행결과 ] 1,1,2,3,5,8,13,21,34,55 [ 정답 ] num3 = num1 + num2; // 세번째값은첫번째와두번째값을더해서얻는다. System.out.print(","+num3); // 세번째수열출력 num1 = num2; // 두번째수열을첫번째값으로한다. num2 = num3; // 세번째수열을두번째값으로한다. [ 해설 ] 워낙간단한문제이니정답을보는것만으로도다른설명이필요하지는않을것이 라생각한다. 혹시라도질문이있으면 의게 시판에올려주길바란다.

204 204 Java 의정석定石 2 판 - 연습문제풀이 [4-12] 구구단의일부분을다음과같이출력하시오. [ 실행결과 ] 2*1=2 3*1=3 4*1=4 2*2=4 3*2=6 4*2=8 2*3=6 3*3=9 4*3=12 5*1=5 6*1=6 7*1=7 5*2=10 6*2=12 7*2=14 5*3=15 6*3=18 7*3=21 8*1=8 9*1=9 8*2=16 9*2=18 8*3=24 9*3=27 [ 정답 ] [ 연습문제 ]/ch4/exercise4_12.java public class Exercise4_12 { public static void main(string[] args) { for (int i = 1 ; i <= 9 ; i++) { for (int j = 1; j <= 3; j++) { int x = j+1+(i-1)/3*3; int y = i%3==0? 3 : i%3 ; if(x > 9) // 9 단까지만출력한다. 이코드가없으면 10 단까지출력된다. break; System.out.print(x+"*"+y+"="+x*y+"\t"); //println이아님에주의 System.out.println(); if(i%3==0) System.out.println(); // // end of main // end of class [ 해설 ] 이문제를푸는방법은여러가지가있겠지만, 반복문을 2번사용해서작성해보았다. 가로로출력을했기때문에좀복잡하긴한데, 일단세로로출력해본다음에가로로출력되도록변경하면문제풀기가수월해진다. 그래서실행결과와같은결과를얻기위해서는먼저아래와같이출력할수있어야한다. 2*1=2 3*1=3 4*1=4 2*2=4 3*2=6 4*2=8 2*3=6 3*3=9 4*3=12 5*1=5

205 Java 의정석定石 2 판 - 연습문제풀이 205 6*1=6 7*1=7 5*2=10 6*2=12 7*2=14 5*3=15 6*3=18 7*3=21 8*1=8 9*1=9 10*1=10 8*2=16 9*2=18 10*2=20 8*3=24 9*3=27 10*3=30 원래는 2 단부터 9 단까지출력하는것이지만, 문제를쉽게하기위해서 10 단까지출력하는 것이좋다. 구구단을곱하기 3 까지만출력하므로전체반복회수는 3 * 9 = 27 번이된다. 3 번반복하는반복문과 9 번반복하는반복문을 2 중으로사용하면되는것이다. public class Exercise4_12 { public static void main(string[] args) { for (int i = 1 ; i <= 9 ; i++) { for (int j = 1; j <= 3; j++) { // 이블럭 { 안의코드가 9 * 3 = 27 번반복된다. // end of main // end of class 단을의미하는변수 x 와곱하는숫자를의미하는변수 y 를정의하고카운터 i 와 j 를이용 해서 x 와 y 의값을적절히계산해주는것이이문제의핵심이다. public class Exercise4_12 { public static void main(string[] args) { for (int i = 1 ; i <= 9 ; i++) { for (int j = 1; j <= 3; j++) { int x = 0; // i 와 j 값을이용해서적절히계산해야한다. int y = 0; // i 와 j 값을이용해서적절히계산해야한다. System.out.println(x+"*"+y+"="+x*y); // end of main // end of class i와 j의값의변화와그에따른 x와 y값의변화를표로적어보았다. 어떻게하면 i와 y의값을이용해서 x와 y의값을구해낼수있을까? 먼저 i의값과 y의값을보면유사한점이많다. y의값은 i의값만잘이용하면어떻게될것같다는생각이든다. i가 1~9까지 1씩증가하는데반해 y의값은 1,2,3이계속해서

206 206 Java 의정석定石 2 판 - 연습문제풀이 반복된다. 그래서 i 를 3 으로나머지연산을해봤더니, 우리가원하는 y 의값과매우유사 해졌다. 다만 i%3 의결과가 0 일때, 3 으로바꾸면된다. 그래서다음과같은식이만들 어지게된것이다. public class Exercise4_12 { public static void main(string[] args) { for (int i = 1 ; i <= 9 ; i++) { for (int j = 1; j <= 3; j++) { int x = 0; // i 와 j 값을이용해서적절히계산해야한다. int y = i%3==0? 3 : i%3 ; System.out.println(x+"*"+y+"="+x*y); // end of main // end of class i j x y i%3 j+1 x-(j+1) 이제 x의값만구하면되는데, x의값은 j의값과좀유사하다. 다만 2단부터시작하기때문에 x의값은 1이아닌 2부터시작한다. 그래서 j의값에 1을더해서 j+1의값을적어보니 x의값과 3 또는 6의차이가있다. 이값의차이를보정해주기위해서는어떻게식을만들어가야할까? i와 j중에서 i는증가하는성질의값이고 j는반복되는성질의값이므로 j보다는 i가적절할것같다. i의값을가지고어떻게하면원하는값을얻을수있을까고민해보자.

207 Java 의정석定石 2 판 - 연습문제풀이 207 public class Exercise4_12 { public static void main(string[] args) { for (int i = 1 ; i <= 9 ; i++) { for (int j = 1; j <= 3; j++) { int x = (j+1) + (???); // (???) 안에적절한수식이들어가야한다. int y = i%3==0? 3 : i%3 ; System.out.println(x+"*"+y+"="+x*y); // end of main // end of class i j x y j+1 i/3 (i-1)/3 (i-1)/3*3 j+1+(i-1)/3* 위의표와같은과정을거쳐 i의값을연산했더니우리가원했던값을얻을수있었다. 혼자서문제를풀때는어려웠는데별것아니었다고느끼는가? 아니면여전히어려운가? 어렵다고느끼는이유는이러한문제풀이과정이익숙하지않기때문일뿐이다. 이러한문제들을통해여러분들이얻어야하는것은문제를풀어가는과정이라고생각한다. 코드만이리저리주무르다가답을얻는것이아니라논리적인과정을하나하나거쳐나가면서답을만들어가는것이여러분들이진정으로배워야하는것이다. 나머지과정은설명하지않아도이해할수있으리라생각하고생략하겠다. 이와같은과 정을거쳐구구단의일부가아닌전체를출력하는코드를작성해보자.

208 208 Java 의정석定石 2 판 - 연습문제풀이 [4-13] 다음은주어진문자열 (value) 이숫자인지를판별하는프로그램이다. (1) 에알맞 은코드를넣어서프로그램을완성하시오. [ 연습문제 ]/ch4/exercise4_13.java class Exercise4_13 { public static void main(string[] args) { String value = "12o34"; char ch = ' '; boolean isnumber = true; // 반복문과 charat(int i) 를이용해서문자열의문자를 // 하나씩읽어서검사한다. for(int i=0; i < value.length() ;i++) { ch = value.charat(i); if(!('0'<=ch && ch<='9')) { isnumber = false; break; if (isnumber) { System.out.println(value+" 는숫자입니다."); else { System.out.println(value+" 는숫자가아닙니다."); // end of main // end of class [ 실행결과 ] 12o34 는숫자가아닙니다. [ 정답 ] ch = value.charat(i); if(!('0'<=ch && ch<='9')) { isnumber = false; break; [ 해설 ] charat(int i) 메서드는문자열에서 i 번째문자를반환한다.(i 의값은 0 부터시작 한다.) "12o34" 라는문자열이있을때 "12o34".charAt(2) 는문자 'o' 가된다. index char 1 2 o 3 4 조건식 '0'<=ch && ch<='9' 는문자 ch 가숫자 ('0'~'9' 사이의문자 ) 이면참 (true) 이된다. 이조건식전체에논리부정연산자! 를붙였으니, 문자 ch 가숫자가아니어야참 (true) 인 조건식이된다. 이조건식을만족하는경우 ( 문자열중의어느한문자라도숫자가아닌 경우 ) 에만 isnumber 의값을 false 로바꾸고 break 문을수행해서반복문을빠져나온다.

209 Java 의정석定石 2 판 - 연습문제풀이 209 [4-14] 다음은숫자맞추기게임을작성한것이다. 1 과 100 사이의값을반복적으로입력 해서컴퓨터가생각한값을맞추면게임이끝난다. 사용자가값을입력하면, 컴퓨터는자 신이생각한값과비교해서결과를알려준다. 사용자가컴퓨터가생각한숫자를맞추면 게임이끝나고몇번만에숫자를맞췄는지알려준다. (1)~(2) 에알맞은코드를넣어프 로그램을완성하시오. [ 연습문제 ]/ch4/exercise4_14.java class Excercise4_14 { public static void main(string[] args) { // 1~100사이의임의의값을얻어서 answer에저장한다. int answer = (int)(math.random() * 100) + 1; int input = 0; // 사용자입력을저장할공간 int count = 0; // 시도횟수를세기위한변수 // 화면으로부터사용자입력을받기위해서 Scanner 클래스사용 java.util.scanner s = new java.util.scanner(system.in); do { count++; System.out.print("1 과 100 사이의값을입력하세요 :"); input = s.nextint(); // 입력받은값을변수 input 에저장한다. if(answer > input) { System.out.println(" 더큰수를입력하세요."); else if(answer < input) { System.out.println(" 더작은수를입력하세요."); else { System.out.println(" 맞췄습니다."); System.out.println(" 시도횟수는 "+count+" 번입니다."); break; // do-while문을벗어난다 while(true); // 무한반복문 // end of main // end of class HighLow [ 실행결과 ] 1 과 100 사이의값을입력하세요 :50 더큰수를입력하세요. 1 과 100 사이의값을입력하세요 :75 더큰수를입력하세요. 1 과 100 사이의값을입력하세요 :87 더작은수를입력하세요. 1 과 100 사이의값을입력하세요 :80 더작은수를입력하세요. 1 과 100 사이의값을입력하세요 :77 더작은수를입력하세요. 1 과 100 사이의값을입력하세요 :76 맞췄습니다. 시도횟수는 6 번입니다. [ 정답 ] (1) (int)(math.random() * 100) + 1;

210 210 Java 의정석定石 2 판 - 연습문제풀이 (2) if(answer > input) { System.out.println(" 더큰수를입력하세요."); else if(answer < input) { System.out.println(" 더작은수를입력하세요."); else { System.out.println(" 맞췄습니다."); System.out.println(" 시도횟수는 "+count+" 번입니다."); break; // do-while문을벗어난다 [ 해설 ] (1) 에는 1 과 100 사이의임의의정수를구하는코드가들어가야하며다음과같은 과정을통해만들어낼수있다. 1. 각변에 100 을곱한다. 0.0 * 100 <= Math.random() * 100 < 1.0 * <= Math.random() * 100 < 각변을 int 형으로변환한다. (int)0.0 <= (int)(math.random() * 100) < (int) <= (int)(math.random() * 100) < 100 지금까지는 0 과 100 사이의정수중하나를가질수있다. 0 은포함되고 100 은포함되지 않는다. 3. 각변에 1 을더한다 <= (int)(math.random() * 100) + 1 < <= (int)(math.random() * 100) + 1 < 101 자, 이제는 1과 101사이의정수중하나를얻을수있다. 1은포함되고 101은포함되지않는다. (2) 에들어갈코드는입력받은값 (input) 이컴퓨터가생각한값 (answer) 과큰지, 작은지, 같은지모두세가지경우에대해처리해야하므로 if-else if문을사용했다. 변수 input 의값과 answer의값이같은경우 (else블럭) 에는 break문을만나 do-while문을빠져나오게된다.

211 Java 의정석定石 2 판 - 연습문제풀이 211 [4-15] 다음은회문수를구하는프로그램이다. 회문수 (palindrome) 란, 숫자를거꾸로읽어도앞으로읽는것과같은수를말한다. 예를들면 이나 같은수를말한다. (1) 에알맞은코드를넣어서프로그램을완성하시오. [Hint] 나머지연산자를이용하시오. [ 연습문제 ]/ch4/exercise4_15.java class Exercise4_15 { public static void main(string[] args) { int number = 12321; int tmp = number; int result =0; // 변수 number 를거꾸로변환해서담을변수 while(tmp!=0) { result = result*10 + tmp % 10; // 기존결과에 10 을곱해서더한다. tmp /= 10; if(number == result) System.out.println( number + " 는회문수입니다."); else System.out.println( number + " 는회문수가아닙니다."); // main [ 실행결과 ] 는회문수입니다. [ 정답 ] result = result*10 + tmp % 10; tmp /= 10; [ 해설 ] 숫자를역순으로바꾼후원래의숫자와비교해서같으면회문수이다. 예를들어원래의숫자 (number) 의값이 12345라면, 역순으로바꾸면 54321이될것이다. 어떻게하면 12345를 54321로바꿀수있을까? 각자리수의값을더하는문제4-10과같은방식, 10 으로나눠가면서 10으로나머지연산을하는방식으로각자리수를얻을수있다. 다만그냥더하는게아니라 10을곱해가면서더하면숫자를역순으로바꿀수있다. result result*10 tmp tmp%

212 212 Java 의정석定石 2 판 - 연습문제풀이 Chapter 5 배열 Array

213 Java 의정석定石 2 판 - 연습문제풀이 213 [ 연습문제 - 모범답안 ] [5-1] 다음은배열을선언하거나초기화한것이다. 잘못된것을고르고그이유를설명하시오. a. int[] arr[]; b. int[] arr = {1,2,3,; // 마지막의쉼표, 는있어도상관없음. c. int[] arr = new int[5]; d. int[] arr = new int[5]{1,2,3,4,5; // 두번째대괄호 [] 에숫자넣으면안됨. e. int arr[5]; // 배열을선언할때는배열의크기를지정할수없음. f. int[] arr[] = new int[3][]; [ 정답 ] d, e [ 해설 ] d. int[] arr = new int[]{1,2,3,4,5 에서는대괄호 [] 안에배열의크기를지정할 수없다. 괄호 { 안의데이터의개수에따라자동적으로결정되기때문이다.

214 214 Java 의정석定石 2 판 - 연습문제풀이 [5-2] 다음과같은배열이있을때, arr[3].length 의값은얼마인가? int[][] arr = { { 5, 5, 5, 5, 5, { 10, 10, 10, { 20, 20, 20, 20, { 30, 30 ; [ 정답 ] 2 [ 해설 ] 위와같은코드가실행되면다음과같은그림의배열이생성된다. arr 0x100 0x200 arr[0][0] arr[0][1] arr[0][2] arr[0][3] arr[0][4] 0x100 arr[0] 0x200 0x arr[1][0] arr[1][1] arr[1][2] arr[1] 0x x400 arr[2][0] arr[2][1] arr[2][2] arr[2][3] arr[2] 0x x500 arr[3][0] arr[3][1] arr[3] 0x arr[3].length는 arr[3] 이가리키는배열의크기를의미한다. 위의그림에서 arr[3] 이가리키는배열은 0x500번지에있는배열이며크기는 2이다. 그래서 arr[3].length의값은 2 가된다. 참고로 arr.length의값은 4이고, arr[0].length의값은 5, arr[1].length의값은 3, arr[2].length의값은 4이다.

215 Java 의정석定石 2 판 - 연습문제풀이 215 [5-3] 배열 arr 에담긴모든값을더하는프로그램을완성하시오. [ 연습문제 ]/ch5/exercise5_3.java class Exercise5_3 { public static void main(string[] args) { int[] arr = {10, 20, 30, 40, 50; int sum = 0; for(int i=0;i<arr.length;i++) { sum += arr[i]; System.out.println("sum="+sum); [ 실행결과 ] sum=150 [ 정답 ] for(int i=0;i<arr.length;i++) { sum += arr[i]; [ 해설 ] 간단한문제라서별도의설명은생략함.

216 216 Java 의정석定石 2 판 - 연습문제풀이 [5-4] 2 차원배열 arr2 에담긴모든값의총합과평균을구하는프로그램을완성하시오. [ 연습문제 ]/ch5/exercise5_4.java class Exercise5_4 { public static void main(string[] args) { int[][] arr = { { 5, 5, 5, 5, 5, {10,10,10,10,10, {20,20,20,20,20, {30,30,30,30,30 ; int total = 0; float average = 0; for(int i=0; i < arr.length;i++) { for(int j=0; j < arr[i].length;j++) { total += arr[i][j]; average = total /(float)(arr.length * arr[0].length); System.out.println("totat="+total); System.out.println("average="+average); // end of main // end of class [ 실행결과 ] totat=325 average=16.25 [ 해설 ] 이번에도배열과반복문을이용하는문제인데, 2차원배열이라 2중 for문을사용해야한다는것을제외하고는이전문제와다르지않다. 평균을구할때는배열의모든요소의총합을개수로나누면되는데, int로나누면 int 나누기 int이기때문에결과를 int로얻으므로소수점이하의값을얻을수없다. 그래서나누는값을 float로형변환해주었다. 만일 float로형변환을해주지않으면 avaerage는 16.25가아닌 16.0이될것이다.(average의타입이 float이므로 16을저장하면 16.0이된다.) 1. int형 (4 byte) 보다크기가작은자료형은 int형으로형변환후에연산을수행한다. byte / short int / int int 2. 두개의피연산자중자료형의표현범위가큰쪽에맞춰서형변환된후연산을수행한다. int / float float / float float 3. 정수형간의나눗셈에서 0 으로나누는것은금지되어있다.

217 Java 의정석定石 2 판 - 연습문제풀이 217 [5-5] 다음은 1 과 9 사이의중복되지않은숫자로이루어진 3 자리숫자를만들어내는프 로그램이다. (1)~(2) 에알맞은코드를넣어서프로그램을완성하시오. [ 참고 ] Math.random() 을사용했기때문에실행결과와다를수있다. [ 연습문제 ]/ch5/exercise5_5.java class Exercise5_5 { public static void main(string[] args) { int[] ballarr = {1,2,3,4,5,6,7,8,9; int[] ball3 = new int[3]; // 배열 ballarr 의임의의요소 2 개를골라서위치를바꾼다. 20 번반복 for(int x=0;x < 20;x++) { int i = (int)(math.random() * ballarr.length); int j = (int)(math.random() * ballarr.length); int tmp = 0; tmp = ballarr[i]; ballarr[i] = ballarr[j]; ballarr[j] = tmp; // 배열 ballarr 의앞에서 3 개의수를배열 ball3 로복사한다. System.arraycopy(ballArr,0, ball3,0,3); for(int i=0;i<ball3.length;i++) { System.out.print(ball3[i]); // end of main // end of class [ 실행결과 ] 486 [ 정답 ] (1) (2) tmp = ballarr[i]; ballarr[i] = ballarr[j]; ballarr[j] = tmp; System.arraycopy(ballArr,0, ball3,0,3); [ 해설 ] 1~9의숫자를배열에순서대로담고, 반복해서위치를서로바꿈으로써숫자를섞는다. 그다음에배열의세요소를차례대로가져오면중복되지않은세개의정수를얻을수있다. (1) 에는변수 tmp를이용해서배열의 i번째요소 (ballarr[i]) 와 j번째요소 (ballarr[j]) 의값을서로바꾸는코드가들어가야한다. 배열의크기인 ballarr.length의값이 9이므로, (int)(math.random() * 9) 가되어변수 i와 j는 0~8사이의임의의값이저장된다. 처음에배열이생성되고초기화되면아래와같이 1~9의값이순서대로배열에저장된다. ballarr ballarr[0] ballarr[1] ballarr[2] ballarr[3] ballarr[4] ballarr[5] ballarr[6] ballarr[7] ballarr[8] 0x x100

218 218 Java 의정석定石 2 판 - 연습문제풀이 만일 i 와 j 의값이각각 0 과 3 이면, ballarr[0] 과 ballarr[3] 의값을서로바꾼다. ballarr ballarr[0] ballarr[1] ballarr[2] ballarr[3] ballarr[4] ballarr[5] ballarr[6] ballarr[7] ballarr[8] 0x x100 tmp = ballarr[i]; ballarr[i] = ballarr[j]; ballarr[j] = tmp; tmp = ballarr[0]; ballarr[0] = ballarr[3]; ballarr[3] = tmp; 두변수에저장된값을서로바꾸려면, 별도의저장공간이필요하다. 두컵에담긴내용물을서로바꾸려면, 하나의빈컵이필요한것처럼. 여기서는변수 tmp가빈컵의역할을하게된다. 아래의그림은 'tmp = ballarr[0];' 이실행되어 ballarr[0] 의값인 1이변수 tmp에저장된것을보여준다. ballarr ballarr[0] ballarr[1] ballarr[2] ballarr[3] ballarr[4] ballarr[5] ballarr[6] ballarr[7] ballarr[8] 0x x100 tmp 1 1 tmp = ballarr[0]; 다음은 'ballarr[0] = ballarr[3];' 이실행되어 ballarr[3] 의값인 4 가 저장된것을보여준다. 2 ballarr[0] = ballarr[3]; ballarr[0] 에 ballarr ballarr[0] ballarr[1] ballarr[2] ballarr[3] ballarr[4] ballarr[5] ballarr[6] ballarr[7] ballarr[8] 0x x100 tmp 1 1 tmp = ballarr[0]; 마지막으로 'ballarr[3] = tmp;' 가실행되어 tmp 의값인 1 이 ballarr[3] 에저장된다. 2 ballarr[0] = ballarr[3]; ballarr ballarr[0] ballarr[1] ballarr[2] ballarr[3] ballarr[4] ballarr[5] ballarr[6] ballarr[7] ballarr[8] 0x x100 tmp 1 3 ballarr[3] = tmp; 1 tmp = ballarr[0]; 이런작업을반복적으로수행하면, 배열 ballarr의값들이뒤섞이게된다.(math.random() 을사용했기때문에실행할때마다다른결과를얻을것이다.) ballarr ballarr[0] ballarr[1] ballarr[2] ballarr[3] ballarr[4] ballarr[5] ballarr[6] ballarr[7] ballarr[8] 0x x100

219 Java 의정석定石 2 판 - 연습문제풀이 219 이제배열 ballarr 에서세개의값을배열 ball3 으로복사한다. 편의상맨앞의세값을 ball3 로복사하기로하자. System.arraycopy(ballArr, 0, ball3, 0, 3); ballarr[0] 에서 ball3[0] 으로 3 개의데이터를복사 ballarr ballarr[0] ballarr[1] ballarr[2] ballarr[3] ballarr[4] ballarr[5] ballarr[6] ballarr[7] ballarr[8] 0x x100 ball3 ball3[0] ball3[1] ball3[2] 0x x200

220 220 Java 의정석定石 2 판 - 연습문제풀이 [5-6] 다음은거스름돈을몇개의동전으로지불할수있는지를계산하는문제이다. 변수 money의금액을동전으로바꾸었을때각각몇개의동전이필요한지계산해서출력하라. 단, 가능한한적은수의동전으로거슬러주어야한다. (1) 에알맞은코드를넣어서프로그램을완성하시오. [Hint] 나눗셈연산자와나머지연산자를사용해야한다. [ 연습문제 ]/ch5/exercise5_6.java class Exercise5_6 { public static void main(string args[]) { // 큰금액의동전을우선적으로거슬러줘야한다. int[] coinunit = {500, 100, 50, 10; int money = 2680; System.out.println("money="+money); for(int i=0;i<coinunit.length;i++) { System.out.println(coinUnit[i]+" 원 : "+money/coinunit[i]); money = money%coinunit[i]; // main [ 실행결과 ] money= 원 : 원 : 1 50 원 : 1 10 원 : 3 [ 정답 ] System.out.println(coinUnit[i]+" 원 : "+money/coinunit[i]); money = money%coinunit[i]; [ 해설 ] 동전의단위를내림차순으로배열에초기화한다. 금액이큰동전을우선적으로지불해야가장적은동전의개수로거스름돈을줄수있기때문이다. 그렇지않으면, 모든거스름돈을 10원짜리로만주게될수도있다. 변수 money를 coinunit[i] 로나누면지불할동전의개수가되고, 나머지연산을하면 coinunit[i] 로지불하고남은금액이된다. 동전단위 (coinunit배열) 의개수만큼이과정을반복하면된다. money coinunit[i] money/coinunit[i] money%coinunit[i]

221 Java 의정석定石 2 판 - 연습문제풀이 221 [5-7] 문제 5-6에동전의개수를추가한프로그램이다. 커맨드라인으로부터거슬러줄금액을입력받아계산한다. 보유한동전의개수로거스름돈을지불할수없으면, 거스름돈이부족합니다. 라고출력하고종료한다. 지불할돈이충분히있으면, 거스름돈을지불한만큼가진돈에서빼고남은동전의개수를화면에출력한다. (1) 에알맞은코드를넣어서프로그램을완성하시오. [ 연습문제 ]/ch5/exercise5_7.java class Exercise5_7 { public static void main(string args[]) { if(args.length!=1) { System.out.println("USAGE: java Exercise5_7 3120"); System.exit(0); // 문자열을숫자로변환한다. 입력한값이숫자가아닐경우예외가발생한다. int money = Integer.parseInt(args[0]); System.out.println("money="+money); int[] coinunit = {500, 100, 50, 10 ; // 동전의단위 int[] coin = {5, 5, 5, 5; // 단위별동전의개수 for(int i=0;i<coinunit.length;i++) { int coinnum = 0; // 1. 금액 (money) 을동전단위로나눠서필요한동전의개수 (coinnum) 를구한다. coinnum = money/coinunit[i]; // 2. 배열 coin 에서 coinnum 만큼의동전을뺀다. // ( 만일충분한동전이없다면배열 coin 에있는만큼만뺀다.) if(coin[i] >= coinnum) { coin[i] -= coinnum; else { coinnum = coin[i]; coin[i] = 0; // 3. 금액에서동전의개수 (coinnum) 와동전단위를곱한값을뺀다. money -= coinnum*coinunit[i]; System.out.println(coinUnit[i]+" 원 : "+coinnum); if(money > 0) { System.out.println(" 거스름돈이부족합니다."); System.exit(0); // 프로그램을종료한다. System.out.println("= 남은동전의개수 ="); for(int i=0;i<coinunit.length;i++) {

222 222 Java 의정석定石 2 판 - 연습문제풀이 System.out.println(coinUnit[i]+" 원 :"+coin[i]); // main [ 실행결과 ] C:\jdk1.5\work\ch5>java Exercise5_7 USAGE: java Exercise5_ C:\jdk1.5\work\ch5>java Exercise5_ money= 원 : 원 : 5 50 원 : 3 10 원 : 2 = 남은동전의개수 = 500 원 :0 100 원 :0 50 원 :2 10 원 :3 C:\jdk1.5\work\ch5>java Exercise5_ money= 원 : 원 : 5 50 원 : 5 10 원 : 5 거스름돈이부족합니다. [ 정답 ] // 1. 금액 (money) 을동전단위로나눠서필요한동전의개수 (coinnum) 를구한다. coinnum = money/coinunit[i]; // 2. 배열 coin 에서 coinnum 만큼의동전을뺀다. // ( 만일충분한동전이없다면배열 coin 에있는만큼만뺀다.) if(coin[i] >= coinnum) { coin[i] -= coinnum; else { coinnum = coin[i]; coin[i] = 0; // 3. 금액에서동전의개수 (coinnum) 와동전단위를곱한값을뺀다. money -= coinnum*coinunit[i]; [ 해설 ] 주어진로직대로만작성하면별어려움없이풀수있었을것이라생각한다. 문제 5-6 을이해했다면이문제도쉽게이해될것이므로자세한설명은생략한다. 이예제를발전시켜자판기프로그램을작성해보면좋은공부가될것이다.

223 Java 의정석定石 2 판 - 연습문제풀이 223 [5-8] 다음은배열 answer 에담긴데이터를읽고각숫자의개수를세어서개수만큼 * 을찍어서그래프를그리는프로그램이다. (1)~(2) 에알맞은코드를넣어서완성하시오. [ 연습문제 ]/ch5/exercise5_8.java class Exercise5_8 { public static void main(string[] args) { int[] answer = { 1,4,4,3,1,4,4,2,1,3,2 ; int[] counter = new int[4]; for(int i=0; i < answer.length;i++) { counter[answer[i]-1]++; for(int i=0; i < counter.length;i++) { System.out.print(counter[i]); for(int j=0; j < counter[i];j++) { System.out.print("*"); // counter[i] 의값만큼 * 을찍는다. System.out.println(); // end of main // end of class [ 실행결과 ] 3*** 2** 2** 4**** [ 정답 ] (1) counter[answer[i]-1]++; (2) System.out.print(counter[i]); for(int j=0; j < counter[i];j++) { System.out.print("*"); [ 해설 ] 배열을이용해서데이터의개수를세는문제이다. 1~4 범위의데이터를집계할것 이기때문에크기가 4 인배열 (counter) 을생성하였다. 크기가 4 이지만배열의 index 는 0~3 이기때문에 answer[i] 에서 1 을빼주어야한다. counter[answer[i]-1]++; Java의정석 2판의예제5-6과거의동일하므로자세한설명은생략한다. 다만, Java의정석소스압축파일에있는플래시동영상 '/flash/array.swf' 을보면단계별로자세히설명되어있으니참고하기바란다. Java의정석소스압축파일은 에서얻을수있다.

224 224 Java 의정석定石 2 판 - 연습문제풀이 [5-9] 주어진배열을시계방향으로 90 도회전시켜서출력하는프로그램을완성하시오. [ 연습문제 ]/ch5/exercise5_9.java class Exercise5_9 { public static void main(string[] args) { char[][] star = { {'*','*',' ',' ',' ', {'*','*',' ',' ',' ', {'*','*','*','*','*', {'*','*','*','*','*' ; char[][] result = new char[star[0].length][star.length]; for(int i=0; i < star.length;i++) { for(int j=0; j < star[i].length;j++) { System.out.print(star[i][j]); System.out.println(); System.out.println(); for(int i=0; i < star.length;i++) { for(int j=0; j < star[i].length;j++) { int x = j; int y = star.length-1-i; result[x][y]=star[i][j]; for(int i=0; i < result.length;i++) { for(int j=0; j < result[i].length;j++) { System.out.print(result[i][j]); System.out.println(); // end of main // end of class [ 실행결과 ] ** ** ***** ***** **** **** ** ** ** [ 정답 ] int x = j; int y = star.length-1-i; result[x][y]=star[i][j];

225 Java 의정석定石 2 판 - 연습문제풀이 225 [ 해설 ] 테트리스의도형을회전시키듯이배열을회전시키는문제이다. 배열 star 가 4 5 의 2 차원배열이므로이배열을 90 도회전시키면 5 4 의 2 차원배열이되어야한다. char[][] result = new char[star[0].length][star.length]; 배열 star 를시계방향으로회전시켜서만든배열 result 를그림으로그려보면다음과같 다. 배열 star 배열 result star.length * * * * * * * * * 시계방향 90 회전 * * * * * * * * * * * * * * * * * star[0].length * * result 배열을생성했으니, 이제배열 star 의요소들을배열 result 의적절한위치로옮기 면된다. 원래의위치를 (i,j), 옮길위치를 (x, y) 라고할때 i 와 j 의값을이용해서 x 와 y 의값을어떻게계산해낼것인지를고민해보자. for(int i=0; i < star.length;i++) { for(int j=0; j < star[i].length;j++) { int x =???; int y =???; result[x][y]=star[i][j]; // (i,j) (x,y) 배열 star 배열 result 0,0 0,1 0,2 0,3 0,4 0,0 0,1 0,2 0,3 star.length 1,0 1,1 1,2 1,3 1,4 시계방향 90 회전 1,0 1,1 1,2 1, ,1 2,2 2,3 2,4 2,0 2,1 2,2 2,3 3,0 3,1 3,2 3,3 3,4 3,0 3,1 3,2 3,3 star[0].length 4,0 4,1 4,2 4,3 위그림은배열의인덱스를표시한것인데, star[0][0] 은 result[0][3] 으로, star[0][1] 은 result[1][3] 으로이동해야함을알수있다. 이것을표로정리하면다음과같다.

226 226 Java 의정석定石 2 판 - 연습문제풀이 i j x y 위의표를보면, x의값은 j의값과정확히일치함을알수있다. 그래서 x의값은 j의값을그대로가져다쓰면된다. y의값을보면, i와 y의합이일정함을알수있다. i와 y의합은항상 3이다. 3은 star.length-1과동일한값이다. 'i+y = star.length-1' 이니까, 'y = star.length-1-i' 라고할수있다. for(int i=0; i < star.length;i++) { for(int j=0; j < star[i].length;j++) { int x = j; int y = star.length-1-i; result[x][y]=star[i][j]; // (i,j) (x,y) 익숙하지않겠지만이렇게그림을그리고표를그리면쉽게해결된다. 코딩을하기전에 종이에그림을그리고로직을정리하는것은모니터를보는시간을줄여서눈의피로를 적게하고, 논리적오류를줄여줄수있다는장점이있다.

227 Java 의정석定石 2 판 - 연습문제풀이 227 [5-10] 다음은알파벳과숫자를아래에주어진암호표로암호화하는프로그램이다. (1) 에알맞은코드를넣어서완성하시오. a b c d e f g h i j k l m n o p q r s t ` # $ % ^ & * ( ) - _ + = [ ] { u v w x y z ; :,. / q w e r t y u i o p [ 연습문제 ]/ch5/exercise5_10.java class Exercise5_10 { public static void main(string[] args) { char[] abccode = { '`','~','!','@','#','$','%','^','&','*', '(',')','-','_','+','=',' ','[',']','{', '',';',':',',','.','/'; // char[] numcode = {'q','w','e','r','t','y','u','i','o','p'; String src = "abc123"; String result = ""; // 문자열 src 의문자를 charat() 으로하나씩읽어서변환후 result 에저장 for(int i=0; i < src.length();i++) { char ch = src.charat(i); if('a' <= ch && ch <='z') { result += abccode[ch-'a']; else if('0' <= ch && ch <='9') { result += numcode[ch-'0']; System.out.println("src:"+src); System.out.println("result:"+result); // end of main // end of class [ 실행결과 ] src:abc123 result:`~!wer [ 정답 ] if('a' <= ch && ch <='z') { result += abccode[ch-'a']; else if('0' <= ch && ch <='9') { result += numcode[ch-'0'];

228 228 Java 의정석定石 2 판 - 연습문제풀이 [ 해설 ] 문자열을반복문과 chatat(int i) 을이용해서, 한문자씩배열에있는암호코드로변경해서암호화하는문제이다. 암호코드는영어소문자와숫자로나뉘어져있는데, 영어소문자인경우배열 abccode에서해당암호코드를얻고, 숫자인경우에는배열 numcode에서암호코드를얻도록되어있다. 그래서조건문으로문자가영어소문자인경우와숫자인경우를나누어서처리했다. if('a' <= ch && ch <='z') { result += abccode[ch-'a']; else if('0' <= ch && ch <='9') { result += numcode[ch-'0']; 암호코드배열 abccode에는문자 'a' 시작해서문자 'z' 까지의암호코드가순서대로저장되어있기때문에문자 'a' 의암호코드는 abccode[0] 이고, 문자 'c' 의암호코드는 abccode[2] 이다. 즉, 영어소문자 ch의암호코드는 abccode[ch-'a'] 로표현할수있는것이다. 만일문자 ch가 'c' 였다면, 조건식 'a' <= ch && ch <='z' 가 true가되어 result+= abcc ode[ch-'a']; 가수행된다. 이문장은아래와같은순서로연산이진행된다. result+= abccode[ch-'a']; result+= abccode['c'-'a']; result+= abccode[2]; result+= '!'; 알파벳이나숫자는문자코드가연속적으로할당되어있기때문에, 'c' 에서 'a' 를빼면 2 를결과로얻는다. 'c'-'a' 뺄셈과같은이항연산자는 int 타입보다작은타입은피연산자 (byte, short, char) 은 int 로변환한다. 그래서 'c'-'a' 은 로변환되고그결과는숫자 2 가된다. 참고로문 자 'a' 와 'c' 의코드는아래와같다. 문자 문자코드 a 97 b 98 c 99 d

229 Java 의정석定石 2 판 - 연습문제풀이 229 [5-11] 주어진 2 차원배열의데이터보다가로와세로로 1 이더큰배열을생성해서배열 의행과열의마지막요소에각열과행의총합을저장하고출력하는프로그램이다. (1) 에알맞은코드를넣어서완성하시오. [ 연습문제 ]/ch5/exercise5_11.java class Exercise5_11 { public static void main(string[] args) { int[][] score = { {100, 100, 100, {20, 20, 20, {30, 30, 30, {40, 40, 40, {50, 50, 50 ; int[][] result = new int[score.length+1][score[0].length+1]; for(int i=0; i < score.length;i++) { for(int j=0; j < score[i].length;j++) { result[i][j] = score[i][j]; result[i][score[0].length] += result[i][j]; result[score.length][j] += result[i][j]; result[score.length][score[0].length] += result[i][j]; for(int i=0; i < result.length;i++) { for(int j=0; j < result[i].length;j++) { System.out.printf("%4d",result[i][j]); System.out.println(); // main [ 실행결과 ] [ 정답 ] result[i][j] = score[i][j]; result[i][score[0].length] += result[i][j]; result[score.length][j] += result[i][j]; result[score.length][score[0].length] += result[i][j]; [ 해설 ] 2 차원배열의복사를조금응용한문제이다. 2 차원배열 score 에담긴값들을 2 차 원배열 result 에복사하되배열 result 의맨오른쪽열에는각행의총합이, 그리고맨

230 230 Java 의정석定石 2 판 - 연습문제풀이 마지막행에는각열의총합이, 마지막으로맨오른쪽행의마지막열에는전체총합이 저장되어야한다. 언뜻복잡해보이지만그림을그려보면간단명료해진다. 먼저 score[i][j] 를 result[i][j] 에저장하고, result[i][j] 는아래그림에표시한세 곳에누적해서더해주면된다. 배열 score result[i][j] 배열 result result[i][result[0].length-1] result[result.length-1][j] result[result.length-1][result[0].length-1] result.length-1 과 result[0].length-1 은 score.length 와 score[0].length 와각각동일 하므로보다식을간단히하기위해대체해서사용했는데, 반드시그렇게해야하는것은 아니다. result.length-1 score.length result[0].length-1 score[0].length score[i][j] 의값을 result[i][j] 에저장하기때문에, result[i][j] 대신 score[i][j] 를 사용해도같은결과를얻는다. result[i][score[0].length] += score[i][j]; result[score.length][j] += score[i][j]; result[score.length][score[0].length] += score[i][j];

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

232 232 Java 의정석定石 2 판 - 연습문제풀이 [ 연습문제 - 모범답안 ] [6-1] 다음과같은멤버변수를갖는 SutdaCard클래스를정의하시오. 타입 변수명 설명 int num 카드의숫자.(1~10사이의정수 ) boolean iskwang 광 ( 光 ) 이면 true, 아니면 false [ 정답 ] class SutdaCard { int num; boolean iskwang;

233 Java 의정석定石 2 판 - 연습문제풀이 233 [6-2] 문제 6-1 에서정의한 StudaCard 클래스에두개의생성자와 info() 를추가해서실행 결과와같은결과를얻도록하시오. [ 연습문제 ]/ch6/exercise6_2.java class Exercise6_2 { public static void main(string args[]) { SutdaCard card1 = new SutdaCard(3, false); SutdaCard card2 = new SutdaCard(); System.out.println(card1.info()); // 3 이출력된다. System.out.println(card2.info()); // 1K 가출력된다. class SutdaCard { int num; boolean iskwang; SutdaCard() { this(1, true); // SutdaCard(1, true) 를호출한다. SutdaCard(int num, boolean iskwang) { this.num = num; this.iskwang = iskwang; String info() { // 숫자를문자열로반환한다. 광 ( 光 ) 인경우 K 를덧붙인다. return num + ( iskwang? "K" : ""); [ 실행결과 ] 3 1K [ 해설 ] 객체를생성할때두개의생성자를사용했으므로두개의생성자를정의해야한 다. SutdaCard card1 = new SutdaCard(3, false); // 3 SutdaCard card2 = new SutdaCard(); // 1K 일단매개변수가있는생성자를살펴보면, 카드의 num 과 iskwang 의값을매개변수로받는 것을알수있다. 그리고매개변수가없는기본생성자는실행결과에서 "1K" 가출력된것 으로봐서 num 과 iskwang 의값을각각 1 과 true 로하였다는것을알수있다.

234 234 Java 의정석定石 2 판 - 연습문제풀이 SutdaCard() { this.num = 1; this.iskwang = true; SutdaCard(int num, boolean iskwan g) { this.num = num; this.iskwang = iskwang; SutdaCard() { this(1, true); SutdaCard(int num, boolean iskwan g) { this.num = num; this.iskwang = iskwang; 매개변수가없는기본생성자를정의할때, 왼쪽의코드와같이할수도있지만오른쪽코드와같이기존의코드를호출하는것이더좋은코드이다. 재사용성이더높고나중에코드를수정할때도유리하다. info() 메서드는 card인스턴스의정보를문자열로반환하기위한것이다. card인스턴스의멤버변수 num와 iskwang의값을문자열로만들어서반환하면된다. iskwang의값이 true 인경우에는숫자뒤에 "K" 를붙이도록삼항연산자를사용했다. String info() { // 숫자를문자열로반환한다. 광 ( 光 ) 인경우 K 를덧붙인다. return num + ( iskwang? "K" : ""); 변수 num 은타입이 int 이지만문자열과덧셈연산을하기때문에최종적으로는문자열을 반환하게된다.

235 Java 의정석定石 2 판 - 연습문제풀이 235 [6-3] 다음과같은멤버변수를갖는 Student 클래스를정의하시오. 타입 변수명 설명 String name 학생이름 int ban 반 int no 번호 int kor 국어점수 int eng 영어점수 int math 수학점수 [ 정답 ] class Student { String name; int ban; int no; int kor; int eng; int math;

236 236 Java 의정석定石 2 판 - 연습문제풀이 [6-4] 문제 6-3 에서정의한 Student 클래스에다음과같이정의된두개의메서드 gettotal() 과 getaverage() 를추가하시오. 1. 메서드명 : gettotal 기능 : 국어 (kor), 영어 (eng), 수학 (math) 의점수를모두더해서반환한다. 반환타입 : int 매개변수 : 없음 2. 메서드명 : getaverage 기능 : 총점 ( 국어점수 + 영어점수 + 수학점수 ) 을과목수로나눈평균을구한다. 소수점둘째자리에서반올림할것. 반환타입 : float 매개변수 : 없음 [ 연습문제 ]/ch6/exercise6_4.java class Exercise6_4 { public static void main(string args[]) { Student s = new Student(); s.name = " 홍길동 "; s.ban = 1; s.no = 1; s.kor = 100; s.eng = 60; s.math = 76; System.out.println(" 이름 :"+s.name); System.out.println(" 총점 :"+s.gettotal()); System.out.println(" 평균 :"+s.getaverage()); class Student { String name; int ban; int no; int kor; int eng; int math; int gettotal() { return kor + eng + math; float getaverage() { return (int)(gettotal() / 3f * f) / 10f; [ 실행결과 ] 이름 : 홍길동총점 :236 평균 :78.7 [ 정답 ] class Student {

237 Java 의정석定石 2 판 - 연습문제풀이 237 String name; int ban; int no; int kor; int eng; int math; int gettotal() { return kor + eng + math; float getaverage() { return (int)(gettotal() / 3f * f) / 10f; [ 해설 ] 총점과평균을구하는문제인데, 평균을구할때소수점둘째자리에서반올림을 하는부분에서생각을좀해야할것이다. 총점의타입이 int 이기때문에 3 으로나누면 int 와 int 간의연산이므로결과를 int 로얻 는다. 즉, 소수점이하의값은버려지게된다. 그래서 float 타입의리터럴인 3f 로나누어 야소수점이하의값들을얻을수있다. 그리고, 소수점둘째자리에서반올림하려면 10 을곱하고 0.5 를더한다음다시 10f 로나누면된다. 236 / / 3f / 3f * / 3f * (int)(236 / 3f * ) (int) (int)(236 / 3f * ) / (int)(236 / 3f * ) / 10f 78.7

238 238 Java 의정석定石 2 판 - 연습문제풀이 [6-5] 다음과같은실행결과를얻도록 Student 클래스에생성자와 info() 를추가하시오. [ 연습문제 ]/ch6/exercise6_5.java class Exercise6_5 { public static void main(string args[]) { Student s = new Student(" 홍길동 ",1,1,100,60,76); System.out.println(s.info()); 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 * f) / 10f; public String info() { return name +","+ban +","+no +","+kor +","+eng +","+math +","+gettotal() +","+getaverage() ; [ 실행결과 ] 홍길동,1,1,100,60,76,236,78.7 [ 해설 ] 학생의이름, 반, 번호, 과목별성적을매개변수로받는생성자를추가하고, 학생 의정보를출력하는 info() 메서드를정의하는문제이다. 답을보는것만으로도충분히이 해할수있는문제이므로설명은생략한다.

239 Java 의정석定石 2 판 - 연습문제풀이 239 [6-6] 두점의거리를계산하는 getdistance() 를완성하시오. [Hint] 제곱근계산은 Math.sqrt(double a) 를사용하면된다. [ 연습문제 ]/ch6/exercise6_6.java class Exercise6_6 { // 두점 (x,y) 와 (x1,y1) 간의거리를구한다. static double getdistance(int x, int y, int x1, int y1) { return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1)); // x, y 는지역변수 public static void main(string args[]) { System.out.println(getDistance(1,1,2,2)); [ 실행결과 ] [ 정답 ] return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1)); [ 해설 ] 두점 (x, y) 와 (x1, y1) 의거리를구하는공식은 이다. 제곱근계산은 Math클래스의 sqrt(double a) 를사용하면된다. 제곱도 Math.pow(double a, double b) 를사용하면되지만, 2제곱이므로그냥곱셈연산자를사용했다. 어느쪽을사용해도괜찮지만, 메서드를호출하는것은곱셈연산보다비용이많이드는작업이라는것은기억해두자. 그렇다고해서보다빠른코드를만들겠다고코드를복잡하게하는것은좋지않다. 참고로 Math.pow(double a, double b) 를사용한코드는다음과같다. static double getdistance(int x, int y, int x1, int y1) { return Math.sqrt(Math.pow(x-x1,2) + Math.pow(y-y1,2));

240 240 Java 의정석定石 2 판 - 연습문제풀이 [6-7] 문제 6-6 에서작성한클래스메서드 getdistance() 를 MyPoint 클래스의인스턴스메서 드로정의하시오. [ 연습문제 ]/ch6/exercise6_7.java class MyPoint { int x; // 인스턴스변수 int y; // 인스턴스변수 MyPoint(int x, int y) { this.x = x; this.y = y; double getdistance(int x1, int y1) { return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1)); // x, y 는인스턴스변수 class Exercise6_7 { public static void main(string args[]) { MyPoint p = new MyPoint(1,1); // MyPoint 와 (2,2) 의거리를구한다. System.out.println(p.getDistance(2,2)); [ 실행결과 ] [ 정답 ] double getdistance(int x1, int y1) { return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1)); [ 해설 ] 이전문제의 static 메서드를인스턴스메서드로변경하는문제인데, static 메서드 와인스턴스메서드의차이를이해하는것은매우중요하다. static 메서드인경우에는메서드내에서인스턴스변수를사용하지않았다. 대신매개변수 ( 지역변 수 ) 로작업에필요한값을제공받아야했다. 그래서, 인스턴스와관계가없으므로 ( 인스턴스변수를사 용안했으니까 ) static 메서드로선언할수있는것이다. static double getdistance(int x, int y, int x1, int y1) { return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1)); // x, y 는지역변수 그러나, 인스턴스메서드는인스턴스변수 x, y 를사용해서작업하므로매개변수로 x1 과 y1 만을제 공받으면된다. 인스턴스와관계가있으므로 ( 인스턴스변수를사용했으니까 ) static 을붙일수없 다. double getdistance(int x1, int y1) { return Math.sqrt((x-x1)*(x-x1) + (y-y1)*(y-y1));// x, y 는인스턴스변수

241 Java 의정석定石 2 판 - 연습문제풀이 241 아래의코드는인스턴스메서드를사용할때와 static 메서드를사용할때의차이를보여주기위한 것이다. 어떤차이가있는지잘살펴보자. 1. static 메서드의사용 System.out.println(Exercise6_6.getDistance(1,1,2,2)); 2. 인스턴스메서드의사용 MyPoint p = new MyPoint(1,1); System.out.println(p.getDistance(2,2)); MyPoint 클래스에두점간의거리를계산하는메서드 getdistance() 를넣는다면, static 메서드보다 는인스턴스메서드로정의하는것이더적합하다.

242 242 Java 의정석定石 2 판 - 연습문제풀이 [6-8] 다음의코드에정의된변수들을종류별로구분해서적으시오. class PlayingCard { int kind; int num; static int width; static int height; PlayingCard(int k, int n) { kind = k; num = n; public static void main(string args[]) { PlayingCard card = new PlayingCard(1,1); - 클래스변수 (static 변수 ) : width, height - 인스턴스변수 : kind, num - 지역변수 : k, n, card [ 해설 ] 변수가선언된위치를보면변수의종류를알수있다. 클래스블럭 { 내에선언된 변수는인스턴스변수이고, static 이붙은것은 static 변수 ( 클래스변수 ) 이다. 그리고나 머지는모두지역변수이다. class Variables { int iv; // 인스턴스변수 static int cv; // 클래스변수 (static변수, 공유변수 ) 클래스영역 void method() { int lv = 0; // 지역변수 메서드영역 변수의종류선언위치생성시기 클래스변수 (class variable) 인스턴스변수 (instance variable) 지역변수 (local variable) 클래스영역 클래스영역이외의영역 ( 메서드, 생성자, 초기화블럭내부 ) 클래스가메모리에올라갈때 인스턴스가생성되었을때 변수선언문이수행되었을때

243 Java 의정석定石 2 판 - 연습문제풀이 243 [6-9] 다음은컴퓨터게임의병사 (marine) 를클래스로정의한것이다. 이클래스의멤버 중에 static 을붙여야하는것은어떤것들이고그이유는무엇인가? ( 단, 모든병사의공격력과방어력은같아야한다.) class Marine { int x=0, y=0; // Marine의위치좌표 (x,y) int hp = 60; // 현재체력 static int weapon = 6; // 공격력 static int armor = 0; // 방어력 static void weaponup() { weapon++; static void armorup() { armor++; void move(int x, int y) { this.x = x; // this.x는인스턴스변수, x는지역변수 this.y = y; // this.y는인스턴스변수, y는지역변수 [ 정답 ] weapon, armor - 모든 Marine 인스턴스에대해동일한값이어야하므로. weaponup(), armorup() - static 변수에대한작업을하는메서드이므로 [ 해설 ] 인스턴스마다개별적인값을가져야하는변수는인스턴스변수로, 모든인스턴스가공통적인값을가져야하는변수는클래스변수 (static변수) 로선언해야한다. 그래서위의코드에서어떤변수들이모든인스턴스에서공통적인적인값을가져야하는지알아내야한다. 병사 (marin) 의위치는모든병사가서로다른위치에있어야하므로개별적인값이어야하고, 병사들마다부상의정도가다를것이므로병사들의체력 (hp) 역시개별적인값이어야한다. 그러나모든병사들의공격력과방어력은같아야한다.( 게임이니까 ) 그래서공격력을의미하는변수 weapon과방어력을의미하는변수 armor에 static을붙어야한다. 그다음은메서드인데, 어떤메서드에 static을붙이고어떤메서드에는 static을붙이지않아야하는것일까? 메서드는어떠한작업을하는것인데, 이작업을할때인스턴스변수를사용하면인스턴스메서드로하고, 그렇지않으면 static메서드로하면된다. 보통인스턴스메서드는인스턴스변수와관련된작업을하고, static메서드는 static변수와관련된작업을하기때문이다. 메서드 weaponup() 과 armorup() 은각각 static변수 weapon과 armor를가지고작업을하기때문에 static을붙이는것이맞다. 반면에메서드 move(int x, int y) 는인스턴스변수 x와 y를가지고작업하기때문에 static을붙여서는안된다.

244 244 Java 의정석定石 2 판 - 연습문제풀이 [6-10] 다음중생성자에대한설명으로옳지않은것은? ( 모두고르시오 ) a. 모든생성자의이름은클래스의이름과동일해야한다. b. 생성자는객체를생성하기위한것이다. c. 클래스에는생성자가반드시하나이상있어야한다. d. 생성자가없는클래스는컴파일러가기본생성자를추가한다. e. 생성자는오버로딩할수없다. [ 정답 ] b, e [ 해설 ] b. 생성자는객체를생성하기위한것이다. 생성자가객체를생성할때사용되기는하지만, 객체를초기화할목적으로사용되는것이다. 객체를생성하는것은 new연산자이다. e. 생성자는오버로딩할수없다. 생성자도오버로딩이가능해서하나의클래스에여러개의생성자를정의할수있다.

245 Java 의정석定石 2 판 - 연습문제풀이 245 [6-11] 다음중 this에대한설명으로맞지않은것은? ( 모두고르시오 ) a. 객체자신을가리키는참조변수이다. b. 클래스내에서라면어디서든사용할수있다. 인스턴스메서드에서만사용가능 c. 지역변수와인스턴스변수를구별할때사용한다. d. 클래스메서드내에서는사용할수없다. [ 정답 ] b [ 해설 ] b. 클래스내에서라면어디서든사용할수있다. 클래스멤버 (static이붙은변수나메서드 ) 에는사용할수없다. this 는인스턴스자신의주소를저장하고있으며, 모든인스턴스메서드에숨겨진채로존 재하는지역변수이다. 그래서인스턴스메서드내에서만사용할수있다.

246 246 Java 의정석定石 2 판 - 연습문제풀이 [6-12] 다음중오버로딩이성립하기위한조건이아닌것은? ( 모두고르시오 ) a. 메서드의이름이같아야한다. b. 매개변수의개수나타입이달라야한다. c. 리턴타입이달라야한다. d. 매개변수의이름이달라야한다. [ 정답 ] c, d [ 해설 ] c. 리턴타입이달라야한다. 리턴타입은오버로딩에영향을주지못한다. d. 매개변수의이름이달라야한다. 리턴타입은오버로딩에영향을주지못한다. << 오버라이딩의조건 >> 1. 메서드이름이같아야한다. 2. 매개변수의개수또는타입이달라야한다. 3. 매개변수는같고리턴타입이다른경우는오버로딩이성립되지않는다. ( 리턴타입은오버로딩을구현하는데아무런영향을주지못한다.)

247 Java 의정석定石 2 판 - 연습문제풀이 247 [6-13] 다음중아래의 add 메서드를올바르게오버로딩한것은? ( 모두고르시오 ) long add(int a, int b) { return a+b; a. long add(int x, int y) { return x+y; b. long add(long a, long b) { return a+b; c. int add(byte a, byte b) { return a+b; d. int add(long a, int b) { return (int)(a+b); [ 정답 ] b, c, d [ 해설 ] b, c, d 는모두메서드의이름이 add 이고매개변수의타입이다르므로오버로딩이 성립한다. 오버로딩이성립하기위한조건은다음과같다. << 오버로딩의조건 >> 1. 메서드이름이같아야한다. 2. 매개변수의개수또는타입이달라야한다. 3. 매개변수는같고리턴타입이다른경우는오버로딩이성립되지않는다. ( 리턴타입은오버로딩을구현하는데아무런영향을주지못한다.)

248 248 Java 의정석定石 2 판 - 연습문제풀이 [6-14] 다음중초기화에대한설명으로옳지않은것은? ( 모두고르시오 ) a. 멤버변수는자동초기화되므로초기화하지않고도값을참조할수있다. b. 지역변수는반드시초기화해야한다. c. 초기화블럭보다생성자가먼저수행된다. 초기화블럭이먼저수행된다. d. 명시적초기화를제일우선적으로고려해야한다. e. 클래스변수보다인스턴스변수가먼저초기화된다. 클래스변수가먼저초기화됨 [ 정답 ] c, e [ 해설 ] 클래스변수는클래스가처음메모리에로딩될때, 자동초기화되므로인스턴스변수보다먼저초기화된다. 그리고생성자는초기화블럭이수행된다음에수행된다.

249 Java 의정석定石 2 판 - 연습문제풀이 249 [6-15] 다음중인스턴스변수의초기화순서가올바른것은? a. 기본값-명시적초기화-초기화블럭-생성자 b. 기본값-명시적초기화-생성자-초기화블럭 c. 기본값-초기화블럭-명시적초기화-생성자 d. 기본값-초기화블럭-생성자-명시적초기화 [ 정답 ] a [ 해설 ] 변수의초기화순서는다음과같다. 클래스변수의초기화시점 : 클래스가처음로딩될때단한번초기화된다. 인스턴스변수의초기화시점 : 인스턴스가생성될때마다각인스턴스별로초기화가이루어진다. 클래스변수의초기화순서 : 기본값 명시적초기화 클래스초기화블럭인스턴스변수의초기화순서 : 기본값 명시적초기화 인스턴스초기화블럭 생성자

250 250 Java 의정석定石 2 판 - 연습문제풀이 [6-16] 다음중지역변수에대한설명으로옳지않은것은? ( 모두고르시오 ) a. 자동초기화되므로별도의초기화가필요없다. b. 지역변수가선언된메서드가종료되면지역변수도함께소멸된다. c. 매서드의매개변수로선언된변수도지역변수이다. d. 클래스변수나인스턴스변수보다메모리부담이적다. e. 힙 (heap) 영역에생성되며가비지컬렉터에의해소멸된다. [ 정답 ] a, e [ 해설 ] 지역변수는자동초기화되지않기때문에사용하기전에반드시적절한값으로초기화를해주어야한다. 지역변수는자신이선언된블럭이나메서드가종료되면소멸되므로메모리부담이적다. 힙 (heap) 영역에는인스턴스 ( 인스턴스변수 ) 가생성되는영역이며, 지역변수는호출스택 (call stack) 에생성된다.

251 Java 의정석定石 2 판 - 연습문제풀이 251 [6-17] 호출스택이다음과같은상황일때옳지않은설명은? ( 모두고르시오 ) [ 정답 ] b println method1 method2 main a. 제일먼저호출스택에저장된것은 main 메서드이다. b. println 메서드를제외한나머지메서드들은모두종료된상태이다. c. method2 메서드를호출한것은 main 메서드이다. d. println 메서드가종료되면 method1 메서드가수행을재개한다. e. main-method2-method1-println 의순서로호출되었다. f. 현재실행중인메서드는 println 뿐이다. [ 해설 ] 호출스택의제일위에있는메서드가현재수행중인메서드이며, 호출스택안의 나머지메서드들은대기상태이다.

252 252 Java 의정석定石 2 판 - 연습문제풀이 [6-18] 다음의코드를컴파일하면컴파일에러가발생한다. 컴파일에러가발생하는라 인과그이유를설명하시오. class MemberCall { int iv = 10; static int cv = 20; int iv2 = cv; static int cv2 = iv; // 라인 A - 컴파일에러 static void staticmethod1() { System.out.println(cv); System.out.println(iv); // 라인 B - 컴파일에러 void instancemethod1() { System.out.println(cv); System.out.println(iv); // 라인 C static void staticmethod2() { staticmethod1(); instancemethod1(); // 라인 D - 컴파일에러 void instancemethod2() { staticmethod1(); // 라인 E instancemethod1(); [ 정답 ] 라인 A, 라인 B, 라인 D [ 해설 ] 라인 A - static변수의초기화에인스턴스변수를사용할수없다. 꼭사용해야한다면, 객체를생성해야한다. 라인 B - static메서드에서는인스턴스변수를사용할수없다. 라인 D - static메서드에서는인스턴스메서드를사용할수없다.

253 Java 의정석定石 2 판 - 연습문제풀이 253 [6-19] 다음코드의실행결과를예측하여적으시오. [ 연습문제 ]/ch6/exercise6_19.java class Exercise6_19 { public static void change(string str) { str += "456"; public static void main(string[] args) { String str = "ABC123"; System.out.println(str); change(str); System.out.println("After change:"+str); [ 정답 ] [ 실행결과 ] ABC123 After change:abc123 [ 해설 ] change메서드의매개변수가참조형인데도왜? main메서드의문자열 str에변경한내용이반영되지않은것일까? 많은사람들이매개변수가참조형이라는것만보고 main메서드의문자열 str이변경될것이라고쉽게생각한다. 누구라도실수하기쉬운부분이므로주의하길바라는마음에서이문제를만들었다. 그림과함께단계별로설명하면어렵지않게이해할수있을것이다. 처음에문자열을참조변수 str 에저장하면아래와같은그림이된다. String str = "ABC123"; main str 0x100 "ABC123" 0x100 그다음에메서드 change를호출하면서참조변수 str을넘겨주면, 메서드 change의지역변수 str에주소값 0x100이저장된다. 이제메서드 change의지역변수 str도문자열 "ABC123" 을참조하게된다. 이두참조변수는이름은같지만분명히다른변수이다. 서로다른영역에존재하기때문에이름이같아도상관없는것이다.

254 254 Java 의정석定石 2 판 - 연습문제풀이 change(str); // change 를호출하면서문자열 str 을넘겨준다. change str 0x100 main str 0x100 "ABC123" 0x100 메서드 change 에서는넘겨받은문자열의뒤에 "456" 을붙인다. 문자열은내용을변경할 수없기때문에덧셈연산을하면새로운문자열이생성되고새로운문자열의주소가변수 str 에저장된다. public static void change(string str) { str += "456"; // 기존의문자열에 "456" 을붙인다. change str 0x200 "ABC123456" main str 0x100 0x200 "ABC123" 0x100 이제 change메서드는종료되고, 작업에사용하던메모리를반환하므로 change메서드의지역변수인 str역시메모리에서제거된다. 다시 main메서드로돌아와서문자열 str의값을출력하면처음의값과변함없는값이출력된다. 문자열 "ABC123456" 은참조하는변수가하나도없으므로적절한시기에가비지컬렉터 (garbage collector) 에의해제거된다. System.out.println("After change:"+str); "ABC123456" main str 0x100 0x200 "ABC123" 0x100

255 Java 의정석定石 2 판 - 연습문제풀이 255 [6-20] 다음과같이정의된메서드를작성하고테스트하시오. [ 주의 ] Math.random() 을사용하는경우실행결과와다를수있음. 메서드명 : shuffle 기능 : 주어진배열에담긴값의위치를바꾸는작업을반복하여뒤섞이게한다. 처리한배열을반환한다. 반환타입 : int[] 매개변수 : int[] arr - 정수값이담긴배열 [ 연습문제 ]/ch6/exercise6_20.java class Exercise6_20 { public static int[] shuffle(int[] arr) { if(arr==null arr.length==0) return arr; // 배열크기의두배정도의횟수를섞으면충분히섞인다. for(int x=0; x< arr.length*2;x++) { // 배열 index 범위내의임의의두값을얻는다. int i = (int)(math.random()*arr.length); int j = (int)(math.random()*arr.length); // arr[i] 와 arr[j] 의값을서로바꾼다. int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; return arr; public static void main(string[] args) { int[] original = {1,2,3,4,5,6,7,8,9; System.out.println(java.util.Arrays.toString(original)); int[] result = shuffle(original); System.out.println(java.util.Arrays.toString(result)); [ 실행결과 ] [1, 2, 3, 4, 5, 6, 7, 8, 9] [4, 6, 8, 3, 2, 9, 7, 1, 5] [ 해설 ] int 배열을매개변수로받아서배열에저장된각요소들의위치를여러번바꿔서 섞은다음반환하는메서드이다. 매개변수로어떤값이넘어올지모르기때문에작업을시작하기전에값의유효성체크는 반드시해야한다. 아래의코드는넘겨받은배열이 null 이거나크기가 0 이면그대로반환 한다. if(arr==null arr.length==0) return arr;

256 256 Java 의정석定石 2 판 - 연습문제풀이 반복문을이용해서반복적으로배열의임의의두요소의값을바꾼다. 반복횟수는많을수 록좋겠지만너무많으면성능이떨어지기때문에배열크기의두배정도로했다. // 배열크기의두배정도의횟수를섞으면충분히섞인다. for(int x=0; x< arr.length*2;x++) { // 배열 index 범위내의임의의두값을얻는다. int i = (int)(math.random()*arr.length); int j = (int)(math.random()*arr.length); // arr[i] 와 arr[j] 의값을서로바꾼다. int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; Math.random() 을사용하는방법이나두변수의값을바꾸는것에대한설명은이전문제 들에서했으므로생략하겠다.

257 Java 의정석定石 2 판 - 연습문제풀이 257 [6-21] Tv 클래스를주어진로직대로완성하시오. 완성한후에실행해서주어진실행결과 와일치하는지확인하라. [ 참고 ] 코드를단순히하기위해서유효성검사는로직에서제외했다. [ 연습문제 ]/ch6/exercise6_21.java class MyTv { boolean ispoweron; int channel; int volume; final int MAX_VOLUME = 100; final int MIN_VOLUME = 0; final int MAX_CHANNEL = 100; final int MIN_CHANNEL = 1; void turnonoff() { // (1) ispoweron 의값이 true 면 false 로, false 면 true 로바꾼다. ispoweron =!ispoweron; void volumeup() { // (2) volume 의값이 MAX_VOLUME 보다작을때만값을 1 증가시킨다. if(volume < MAX_VOLUME) volume++; void volumedown() { // (3) volume 의값이 MIN_VOLUME 보다클때만값을 1 감소시킨다. if(volume > MIN_VOLUME) volume--; void channelup() { // (4) channel 의값을 1 증가시킨다. // 만일 channel 이 MAX_CHANNEL 이면, channel 의값을 MIN_CHANNEL 로바꾼다. if(channel==max_channel) { channel = MIN_CHANNEL; else { channel++; void channeldown() { // (5) channel 의값을 1 감소시킨다. // 만일 channel 이 MIN_CHANNEL 이면, channel 의값을 MAX_CHANNEL 로바꾼다. if(channel==min_channel) { channel = MAX_CHANNEL; else { channel--; // class MyTv class Exercise6_21 { public static void main(string args[]) { MyTv t = new MyTv();

258 258 Java 의정석定石 2 판 - 연습문제풀이 t.channel = 100; t.volume = 0; System.out.println("CH:"+t.channel+", VOL:"+ t.volume); t.channeldown(); t.volumedown(); System.out.println("CH:"+t.channel+", VOL:"+ t.volume); t.volume = 100; t.channelup(); t.volumeup(); System.out.println("CH:"+t.channel+", VOL:"+ t.volume); [ 실행결과 ] CH:100, VOL:0 CH:99, VOL:0 CH:100, VOL:100 [ 해설 ] 답을보는것만으로도별도의설명이필요없을것이라생각한다. 혹시라도질문이 있으면 의게시판에올려주길바란다.

259 Java 의정석定石 2 판 - 연습문제풀이 259 [6-22] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : isnumber 기능 : 주어진문자열이모두숫자로만이루어져있는지확인한다. 모두숫자로만이루어져있으면 true 를반환하고, 그렇지않으면 false 를반환한다. 만일주어진문자열이 null 이거나빈문자열 이라면 false 를반환한다. 반환타입 : boolean 매개변수 : String str - 검사할문자열 [Hint] String 클래스의 charat(int i) 메서드를사용하면문자열의 i 번째위치한문자를얻을수있다. [ 연습문제 ]/ch6/exercise6_22.java class Exercise6_22 { public static boolean isnumber(string str) { if(str==null str.equals("")) return false; for(int i=0; i< str.length();i++) { char ch = str.charat(i); if(ch < '0' ch > '9') { return false; // for return true; public static void main(string[] args) { String str = "123"; System.out.println(str+" 는숫자입니까? "+isnumber(str)); str = "1234o"; System.out.println(str+" 는숫자입니까? "+isnumber(str)); [ 실행결과 ] 123 는숫자입니까? true 1234o 는숫자입니까? false [ 해설 ] 매개변수로어떤값이넘어올지모르기때문에값의작업을시작하기전에유효성 체크는반드시해야한다. 아래의코드는넘겨받은문자열 (str) 이 null 이거나빈문자열 ("") 이면 false 를반환한다. if(str==null str.equals("")) return false;

260 260 Java 의정석定石 2 판 - 연습문제풀이 반복문과 charat(int i) 을이용해서문자열에서한문자씩차례대로읽어와 char 타입의 변수 ch 에저장한다. for(int i=0; i< str.length();i++) { char ch = str.charat(i); 읽어온문자 (ch) 가숫자가아니면 false 를반환한다. if(ch < '0' ch > '9') { // if(!('0'<=ch && ch<='9')) 와같다. return false;

261 Java 의정석定石 2 판 - 연습문제풀이 261 [6-23] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : max 기능 : 주어진 int형배열의값중에서제일큰값을반환한다. 만일주어진배열이 null이거나크기가 0인경우, 를반환한다. 반환타입 : int 매개변수 : int[] arr - 최대값을구할배열 [ 연습문제 ]/ch6/exercise6_23.java class Exercise6_23{ public static int max(int[] arr) { if(arr==null arr.length==0) return ; int max = arr[0]; // 배열의첫번째값으로최대값을초기화한다. for(int i=1; i< arr.length;i++) { // 배열의두번째값부터비교한다. if(arr[i] > max) max = arr[i]; return max; public static void main(string[] args) { int[] data = {3,2,9,4,7; System.out.println(java.util.Arrays.toString(data)); System.out.println(" 최대값 :"+max(data)); System.out.println(" 최대값 :"+max(null)); System.out.println(" 최대값 :"+max(new int[]{)); // 크기가 0 인배열 [ 실행결과 ] [3, 2, 9, 4, 7] 최대값 :9 최대값 : 최대값 : [ 해설 ] 매개변수로넘겨받은배열 arr 이 null 이거나크기가 0 이면 을반환한다. if(arr==null arr.length==0) return ; 배열의첫번째요소 (arr[0]) 로최대값 (max) 을초기화한다. int max = arr[0]; // 배열의첫번째값으로최대값을초기화한다.

262 262 Java 의정석定石 2 판 - 연습문제풀이 최대값 max 를배열의첫번째값으로초기화했으므로첫번째값은비교할필요가없다. 그래서두번째값 (arr[1]) 부터비교한다. 비교해서최대값보다크면그값을변수 max 에 저장한다. for(int i=1; i< arr.length;i++) { // 배열의두번째값부터비교한다. if(arr[i] > max) // 배열의 i 번째요소가 max 보다크면 max = arr[i]; 반복문을다돌고나면, max 에는배열의요소중가장큰값이저장되어있을것이다. 이 값을반환한다. return max;

263 Java 의정석定石 2 판 - 연습문제풀이 263 [6-24] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : abs 기능 : 주어진값의절대값을반환한다. 반환타입 : int 매개변수 : int value [ 연습문제 ]/ch6/exercise6_24.java class Exercise6_24 { public static int abs(int value) { return value >=0? value : -value; public static void main(string[] args) { int value = 5; System.out.println(value+" 의절대값 :"+abs(value)); value = -10; System.out.println(value+" 의절대값 :"+abs(value)); [ 실행결과 ] 5 의절대값 :5-10 의절대값 :10 [ 해설 ] value 의값이양수이면그대로반환하고, 음수이면부호를바꿔서반환하면된다. if 문을사용해도되지만삼항연산자를이용하면보다간결한코드를얻을수있다. 참고 로 if 문을사용한코드는다음과같다. public static int abs(int value) { if(value >=0) { return value; else { return -value; // value 가음수인경우, 부호를변경한다.

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

265 Java 의정석定石 2 판 - 연습문제풀이 265 [ 연습문제 - 모범답안 ] [7-1] 섯다카드 20 장을포함하는섯다카드한벌 (SutdaDeck 클래스 ) 을정의한것이다. 섯 다카드 20 장을담는 SutdaCard 배열을초기화하시오. 단, 섯다카드는 1 부터 10 까지의숫자 가적힌카드가한쌍씩있고, 숫자가 1, 3, 8 인경우에는둘중의한장은광 (Kwang) 이 어야한다. 즉, SutdaCard 의 iskwang 의값이 true 이어야한다. [ 연습문제 ]/ch7/exercise7_1.java class SutdaDeck { final int CARD_NUM = 20; SutdaCard[] cards = new SutdaCard[CARD_NUM]; 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); class SutdaCard { int num; boolean iskwang; SutdaCard() { this(1, true); SutdaCard(int num, boolean iskwang) { this.num = num; this.iskwang = iskwang; // info() 대신 Object 클래스의 tostring() 을오버라이딩했다. public String tostring() { return num + ( iskwang? "K":""); class Exercise7_1 { public static void main(string args[]) { SutdaDeck deck = new SutdaDeck(); for(int i=0; i < deck.cards.length;i++) System.out.print(deck.cards[i]+","); [ 실행결과 ] 1K,2,3K,4,5,6,7,8K,9,10,1,2,3,4,5,6,7,8,9,10,

266 266 Java 의정석定石 2 판 - 연습문제풀이 [ 해설 ] SutdaDeck클래스에 cards라는 SutdaCard배열이정의되어있다. 이배열을생성했다고해서 SutdarCard인스턴스가생성된것은아니다. 그저 SutdaCard인스턴스를저장하기위한공간을생성한것일뿐이다. 객체배열을생성할때, 배열만생성해놓고객체를생성하지않는실수를하지않도록주의하자. SutdaCard[] cards = new SutdaCard[CARD_NUM]; 생성자를통해객체배열 SutdaCard 에 SutdaCard 인스턴스를생성해서저장할차례다. 아래 와같이반복문을이용해서배열의크기만큼 SutdaCard 인스턴스를생성하면되는데, 이때 num 의값과 iskwang 의값을어떻게계산해낼것인지를고민해야한다. SutdaDeck() { for(int i=0;i < cards.length;i++) { int num =???; boolean iskwang =???; cards[i] = new SutdaCard(num,isKwang); 아래의표에서볼수있는것처럼, i 의값이 0~19 까지변하는동안우리가원하는 num 의 값을얻기위해서는 i%10+1 과같은계산식을사용하면된다. i i%10 i% 그리고 num 의값이 1,3,8 일때, 한쌍의카드중에서하나는광 (kwang) 이어야하므로아래 와같은조건식이필요하다. AND(&&) 가 OR( ) 보다우선순위가높기때문에괄호를꼭사 용해야한다. boolean iskwang = (i < 10)&&(num==1 num==3 num==8);

267 Java 의정석定石 2 판 - 연습문제풀이 267 만일 i 의값이 2 이고 num 의값이 3 이라면위의조건식은다음과같은계산과정을거쳐서 iskwang 에는 true 가저장된다. boolean iskwang = (2 < 10)&&(3==1 3==3 3==8); boolean iskwang = (true)&&(false true false); boolean iskwang = (true)&&(true false); boolean iskwang = (true)&&(true); boolean iskwang = true;

268 268 Java 의정석定石 2 판 - 연습문제풀이 [7-2] 문제 7-1 의 SutdaDeck 클래스에다음에정의된새로운메서드를추가하고테스트하 시오. [ 주의 ] Math.random() 을사용하는경우실행결과와다를수있음. 1. 메서드명 : shuffle 기능 : 배열 cards에담긴카드의위치를뒤섞는다.(math.random() 사용 ) 반환타입 : 없음매개변수 : 없음 2. 메서드명 : pick 기능 : 배열 cards에서지정된위치의 SutdaCard를반환한다. 반환타입 : SutdaCard 매개변수 : int index - 위치 3. 메서드명 : pick 기능 : 배열 cards에서임의의위치의 SutdaCard를반환한다.(Math.random() 사용 ) 반환타입 : SutdaCard 매개변수 : 없음 [ 연습문제 ]/ch7/exercise7_2.java class SutdaDeck { final int CARD_NUM = 20; SutdaCard[] cards = new SutdaCard[CARD_NUM]; 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); void shuffle() { for(int x=0; x< cards.length*2;x++) { // 배열 index 범위내의임의의두값을얻는다. int i = (int)(math.random()*cards.length); int j = (int)(math.random()*cards.length); // cards[i] 와 cards[j] 의값을서로바꾼다. SutdaCard tmp = cards[i]; cards[i] = cards[j]; cards[j] = tmp; SutdaCard pick(int index) { if(index < 0 index >= CARD_NUM) // index 의유효성을검사한다. return null; return cards[index];

269 Java 의정석定石 2 판 - 연습문제풀이 269 SutdaCard pick() { int index = (int)(math.random()*cards.length); return pick(index); // pick(int index) 를호출한다. // SutdaDeck 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":""); class Exercise7_2 { public static void main(string args[]) { SutdaDeck deck = new SutdaDeck(); System.out.println(deck.pick(0)); System.out.println(deck.pick()); deck.shuffle(); for(int i=0; i < deck.cards.length;i++) System.out.print(deck.cards[i]+","); System.out.println(); System.out.println(deck.pick(0)); [ 실행결과 ] 1K 7 2,6,10,1K,7,3,10,5,7,8,5,1,2,9,6,9,4,8K,4,3K, 2 [ 해설 ] shuffle메서드에대한것은이미문제6-20에서이미설명했으므로설명을생략하겠다. pick(int index) 메서드는매개변수 index에대한유효성검사가필요하다. 그렇지않으면배열의 index범위를넘어서서 ArrayIndexOutOfBounndsException이발생할수있다. 매개변수가있는메서드는반드시작업전에유효성검사를해야한다는것을기억하자.

270 270 Java 의정석定石 2 판 - 연습문제풀이 SutdaCard pick(int index) { if(index < 0 index >= CARD_NUM) // index 의유효성을검사한다. return null; return cards[index]; SutdaCard pick() { int index = (int)(math.random()*cards.length); return pick(index); // pick(int index) 를호출한다. pick() 메서드의경우, cards 배열에있는임의의카드를꺼내야하므로 Math.random() 을이 용해서유효한 index 범위내의한값을얻어서다시 pick(int index) 메서드를호출한다. 다소비효율적이지만코드의중복을제거하고재사용성을높이기위해이처럼하는것이 다. 그러나너무객체지향적인측면에얽매여서코드를짤필요는없다고생각한다. 상황 에맞는적절한코드를작성하면그것으로좋지않을까. SutdaCard pick() { int index = (int)(math.random()*cards.length); return cards[index];

271 Java 의정석定石 2 판 - 연습문제풀이 271 [7-3] 오버라이딩의정의와필요성에대해서설명하시오. [ 정답 ] 오버라이딩 (overriding) 이란, 조상클래스로부터상속받은메서드를자손클래스에맞게재정의하는것 을말한다. 조상클래스로부터상속받은메서드를자손클래스에서그대로사용할수없는경우가많기때문에오버라이딩이필요하다.

272 272 Java 의정석定石 2 판 - 연습문제풀이 [7-4] 다음중오버라이딩의조건으로옳지않은것은? ( 모두고르시오 ) a. 조상의메서드와이름이같아야한다. b. 매개변수의수와타입이모두같아야한다. c. 리턴타입이같아야한다. d. 접근제어자는조상의메서드보다좁은범위로만변경할수있다. e. 조상의메서드보다더많은수의예외를선언할수있다. [ 정답 ] d, e [ 해설 ] 자손클래스에서오버라이딩하는메서드는조상클래스의메서드와 - 이름이같아야한다. - 매개변수가같아야한다. - 리턴타입이같아야한다. 조상클래스의메서드를자손클래스에서오버라이딩할때 1. 접근제어자를조상클래스의메서드보다좁은범위로변경할수없다. 2. 예외는조상클래스의메서드보다많이선언할수없다. 3. 인스턴스메서드를 static메서드로또는그반대로변경할수없다.

273 Java 의정석定石 2 판 - 연습문제풀이 273 [7-5] 다음의코드는컴파일하면에러가발생한다. 그이유를설명하고에러를수정하기 위해서는코드를어떻게바꾸어야하는가? [ 연습문제 ]/ch7/exercise7_5.java class Product { int price; // 제품의가격 int bonuspoint; // 제품구매시제공하는보너스점수 Product() { Product(int price) { this.price = price; bonuspoint =(int)(price/10.0); class Tv extends Product { Tv() { public String tostring() { return "Tv"; class Exercise7_5 { public static void main(string[] args) { Tv t = new Tv(); [ 정답 ] Product 클래스에기본생성자 Product() 가없기때문에에러가발생한다. Product 클래스에기본생성자 Product() { 를추가해줘야한다. [ 해설 ] Tv 클래스의인스턴스를생성할때, 생성자 Tv() 가호출되고 Tv() 는조상생성자 super() 를호출한다. 실제코드에서는 super() 를호출하는곳이없지만컴파일러가자동 적으로추가해준다. 그래서컴파일을하고나면아래의오른쪽코드와같이변경된다. Tv() { Tv() { super(); //Product() 를호출 추가된 super() 는조상클래스인 Product의기본생성자 Product() 를호출하는것인데, Product클래스에는기본생성자 Product() 가정의되어있지않다. 정의되어있지않은생성자를호출하니까에러가발생하는것이다. Product클래스에는이미 Product(int price) 라는생성자가정의되어있기때문에컴파일러가자동적으로추가해주지도않으므로직접 Product클래스에 Product(){ 를넣어주면문제가해결된다.

274 274 Java 의정석定石 2 판 - 연습문제풀이 [7-6] 자손클래스의생성자에서조상클래스의생성자를호출해야하는이유는무엇인 가? [ 정답 ] 조상에정의된인스턴스변수들이초기화되도록하기위해서. [ 해설 ] 자손클래스의인스턴스를생성하면조상으로부터상속받은인스턴스변수들도생성되는데, 이상속받은인스턴스변수들역시적절히초기되어야한다. 상속받은조상의인스턴스변수들을자손의생성자에서직접초기화하기보다는조상의생성자를호출함으로써초기화되도록하는것이바람직하다. 각클래스의생성자는해당클래스에선언된인스턴스변수의초기화만을담당하고, 조상클래스로부터상속받은인스턴스변수의초기화는조상클래스의생성자가처리하도록해야하는것이다.

275 Java 의정석定石 2 판 - 연습문제풀이 275 [7-7] 다음코드의실행했을때호출되는생성자의순서와실행결과를적으시오. [ 연습문제 ]/ch7/exercise7_7.java class Parent { int x=100; Parent() { this(200); // Parent(int x) 를호출 Parent(int x) { this.x = x; int getx() { return x; class Child extends Parent { int x = 3000; Child() { this(1000); // Child(int x) 를호출 Child(int x) { this.x = x; class Exercise7_7 { public static void main(string[] args) { Child c = new Child(); System.out.println("x="+c.getX()); [ 정답 ] Child() Child(int x) Parent() Parent(int x) Object() 의 순서로호출된다. [ 실행결과 ] x=200 [ 해설 ] 컴파일러는생성자의첫줄에다른생성자를호출하지않으면조상의기본생성자 를호출하는코드 'super();' 를넣는다. 그래서왼쪽의코드는컴파일후오른쪽과같은 코드로바뀐다. Child 클래스의조상은 Parent 이므로 super() 는 Parent() 를의미한다. Child(int x) { this.x = x; Child(int x) { super(); // Parent() 를호출 this.x = x;

276 276 Java 의정석定石 2 판 - 연습문제풀이 마찬가지로 Parent(int x) 역시컴파일러가 Parent 의조상인 Object 클래스의기본생성자 를호출하는코드 'super();' 를넣는다. Parent(int x) { this.x = x; Parent(int x) { super(); // Object() 를호출 this.x = x; Child() Child(int x) Parent() Parent(int x) Object() 의순서로호출되니까, Child클래스의인스턴스변수 x는 1000이되고, Parent클래스의인스턴스변수 x는 200이된다. getx() 는조상인 Parent클래스에정의된것이라서, getx() 에서 x는 Parent클래스의인스턴스변수 x를의미한다. 그래서 x=200이출력된다.

277 Java 의정석定石 2 판 - 연습문제풀이 277 [7-8] 다음중접근제어자를접근범위가넓은것에서좁은것의순으로바르게나열한것은? a. public-protected-(default)-private b. public-(default)-protected-private c. (default)-public-protected-private d. private-protected-(default)-public [ 정답 ] a [ 해설 ] 접근제어자가사용될수있는곳 - 클래스, 멤버변수, 메서드, 생성자 private - 같은클래스내에서만접근이가능하다. default - 같은패키지내에서만접근이가능하다. protected - 같은패키지내에서, 그리고다른패키지의자손클래스에서접근이가능하다. public - 접근제한이전혀없다. 접근범위가넓은쪽에서좁은쪽의순으로왼쪽부터나열하면다음과같다. public > protected > default > private 제어자 같은클래스 같은패키지 자손클래스 전체 public protected default private

278 278 Java 의정석定石 2 판 - 연습문제풀이 [7-9] 다음중제어자 final을붙일수있는대상과붙였을때그의미를적은것이다. 옳지않은것은? ( 모두고르시오 ) a. 지역변수 - 값을변경할수없다. b. 클래스 - 클래스에새로운멤버를추가할수없다. c. 메서드 - 오버로딩을할수없다. 오버라이딩 (overriding) 을할수없다. d. 멤버변수 - 값을변경할수없다. [ 정답 ] c [ 해설 ] 제어자 final 은 ' 마지막의 ' 또는 ' 변경될수없는 ' 의의미를가지고있으며거의 모든대상에사용될수있다. 제어자대상의미 final 클래스 메서드 변경될수없는클래스, 확장될수없는클래스가된다. 그래서 final 로지정된클래스는다른클래스의조상이될수없다. 변경될수없는메서드, final 로지정된메서드는오버라이딩을통해재정의될수없다. 멤버변수변수앞에 final 이붙으면, 값을변경할수없는상수가된다. 지역변수

279 Java 의정석定石 2 판 - 연습문제풀이 279 [7-10] MyTv2 클래스의멤버변수 ispoweron, channel, volume 을클래스외부에서접근할 수없도록제어자를붙이고대신이멤버변수들의값을어디서나읽고변경할수있도록 getter 와 setter 메서드를추가하라. [ 연습문제 ]/ch7/exercise7_10.java class MyTv2 { boolean ispoweron; int channel; int volume; final int MAX_VOLUME = 100; final int MIN_VOLUME = 0; final int MAX_CHANNEL = 100; final int MIN_CHANNEL = 1; public void setvolume(int volume){ if(volume > MAX_VOLUME volume < MIN_VOLUME) return; this.volume = volume; public int getvolume(){ return volume; public void setchannel(int channel){ if(channel > MAX_CHANNEL channel < MIN_CHANNEL) return; this.channel = channel; public int getchannel(){ return channel; class Exercise7_10 { public static void main(string args[]) { MyTv2 t = new MyTv2(); t.setchannel(10); System.out.println("CH:"+t.getChannel()); t.setvolume(20); System.out.println("VOL:"+t.getVolume()); [ 실행결과 ] CH:10 VOL:20 [ 해설 ] 별로어렵지않은문제라별도의설명이필요없을것이다. 다만매개변수가있는 메서드는반드시작업전에넘겨받은값의유효성검사를해야한다는것을잊지말자.

280 280 Java 의정석定石 2 판 - 연습문제풀이 [7-11] 문제 7-10 에서작성한 MyTv2 클래스에이전채널 (previous channel) 로이동하는 기능의메서드를추가해서실행결과와같은결과를얻도록하시오. [Hint] 이전채널의값을저장할멤버변수를정의하라. 메서드명 : gotoprevchannel 기능 : 현재채널을이전채널로변경한다. 반환타입 : 없음매개변수 : 없음 [ 연습문제 ]/ch7/exercise7_11.java class MyTv2 { boolean ispoweron; int channel; int volume; int prevchannel; // 이전채널 (previous channel) final int MAX_VOLUME = 100; final int MIN_VOLUME = 0; final int MAX_CHANNEL = 100; final int MIN_CHANNEL = 1; public void setvolume(int volume){ if(volume > MAX_VOLUME volume < MIN_VOLUME) return; this.volume = volume; public int getvolume(){ return volume; public void setchannel(int channel){ if(channel > MAX_CHANNEL channel < MIN_CHANNEL) return; prevchannel = this.channel; // 현재채널을이전채널에저장한다. this.channel = channel; public int getchannel(){ return channel; public void gotoprevchannel() { setchannel(prevchannel); // 현재체널을이전채널로변경한다. class Exercise7_11 { public static void main(string args[]) { MyTv2 t = new MyTv2();

281 Java 의정석定石 2 판 - 연습문제풀이 281 t.setchannel(10); System.out.println("CH:"+t.getChannel()); t.setchannel(20); System.out.println("CH:"+t.getChannel()); t.gotoprevchannel(); System.out.println("CH:"+t.getChannel()); t.gotoprevchannel(); System.out.println("CH:"+t.getChannel()); [ 실행결과 ] CH:10 CH:20 CH:10 CH:20 [ 해설 ] 먼저이전채널을저장할변수 (prevchannel) 를하나추가해야한다. 그리고채널 이바뀔때마다이변수에바뀌기전의채널을저장해야한다. 문제 7-10 의코드에아래의 붉은색코드를추가했다. public void setchannel(int channel){ if(channel > MAX_CHANNEL channel < MIN_CHANNEL) return; prevchannel = this.channel; // 현재채널을이전채널에저장한다. this.channel = channel; 이제 gotoprevchannel() 에서는 setchannel() 을호출해주기만하면된다. public void gotoprevchannel() { setchannel(prevchannel); // 현재체널을이전채널로변경한다.

282 282 Java 의정석定石 2 판 - 연습문제풀이 [7-12] 다음중접근제어자에대한설명으로옳지않은것은? ( 모두고르시오 ) a. public은접근제한이전혀없는접근제어자이다. b. (default) 가붙으면, 같은패키지내에서만접근이가능하다. c. 지역변수에도접근제어자를사용할수있다. d. protected가붙으면, 같은패키지내에서도접근이가능하다. e. protected가붙으면, 다른패키지의자손클래스에서접근이가능하다. [ 정답 ] c [ 해설 ] 접근제어자가사용될수있는곳 - 클래스, 멤버변수, 메서드, 생성자 private - 같은클래스내에서만접근이가능하다. default - 같은패키지내에서만접근이가능하다. protected - 같은패키지내에서, 그리고다른패키지의자손클래스에서접근이가능하다. public - 접근제한이전혀없다. 제어자 같은클래스 같은패키지 자손클래스 전체 public protected default private

283 Java 의정석定石 2 판 - 연습문제풀이 283 [7-13] Math 클래스의생성자는접근제어자가 private 이다. 그이유는무엇인가? [ 정답 ] Math 클래스의모든메서드가 static 메서드이고인스턴스변수가존재하지않기때 문에객체를생성할필요가없기때문 [ 해설 ] Math 클래스는몇개의상수와 static 메서드만으로구성되어있기때문에인스턴스 를생성할필요가없다. 그래서외부로부터의불필요한접근을막기위해다음과같이생 성자의접근제어자를 private 으로지정하였다. public final class Math { private Math() { //...

284 284 Java 의정석定石 2 판 - 연습문제풀이 [7-14] 문제 7-1 에나오는섯다카드의숫자와종류 (iskwang) 는사실한번값이지정되면 변경되어서는안되는값이다. 카드의숫자가한번잘못바뀌면똑같은카드가두장이 될수도있기때문이다. 이러한문제점이발생하지않도록아래의 SutdaCard 를수정하시 오. [ 연습문제 ]/ch7/exercise7_14.java class SutdaCard { final int NUM; final boolean IS_KWANG; SutdaCard() { this(1, true); SutdaCard(int num, boolean iskwang) { this.num = num; this.is_kwang = iskwang; public String tostring() { return NUM + ( IS_KWANG? "K":""); class Exercise7_14 { public static void main(string args[]) { SutdaCard card = new SutdaCard(1, true); [ 해설 ] 원래변수앞에 final 을붙일때는선언과초기화를동시에해야한다. final int MAX_VOLUME = 100; 그러나인스턴스변수의경우, 선언시에초기화하지않고생성자에서초기화할수있다. 생성할때지정된값이변하지않도록할수있는것이다. 상수이므로한번초기화한이 후로는값을바꿀수없다. final int NUM; final boolean IS_KWANG; SutdaCard(int num, boolean iskwang) { this.num = num; // 생성자에서단한번의초기화만가능 this.is_kwang = iskwang; // 생성자에서단한번의초기화만가능 카드게임에서카드의숫자와무늬가게임도중에변경되는것이가능하다면, 실수로같은 카드가두장이되는일이일어날수있기때문에이를방지하기위해서숫자와무늬는 한번지정되면변경할수없도록하는것이바람직하다.

285 Java 의정석定石 2 판 - 연습문제풀이 285 [7-15] 클래스가다음과같이정의되어있을때, 형변환을올바르게하지않은것은? ( 모두고르시오.) [ 정답 ] e class Unit { class AirUnit extends Unit { class GroundUnit extends Unit { class Tank extends GroundUnit { class AirCraft extends AirUnit { Unit u = new GroundUnit(); Tank t = new Tank(); AirCraft ac = new AirCraft(); a. u = (Unit)ac; b. u = ac; c. GroundUnit gu = (GroundUnit)u; d. AirUnit au = ac; e. t = (Tank)u; 조상타입의인스턴스를자손타입으로형변환할수없다. f. GroundUnit gu = t; [ 해설 ] 클래스간의상속관계를그림으로그려보면쉽게알수있다. Unit AirUnit GroundUnit AirCraft Tank Unit 클래스는나머지네개클래스의조상이므로형변환이가능하며, 심지어는생략할수 도있다. AirCraft ac = new AirCraft(); u = (Unit)ac; // u 는 AirCraft 의조상인 Unit 타입이므로형변환이가능하다. u = ac; // 업캐스팅 ( 자손 조상 ) 이므로형변환을생략할수있다. 조상타입의참조변수로자손타입의인스턴스를참조하는것이가능하기때문에아래의코 드는모두가능하다. Unit u = new GroundUnit(); GroundUnit gu = (GroundUnit)u; // u 가참조하는객체가 GroundUnit 이므로 OK GroundUnit gu = (GroundUnit)new GroundUnit(); // 위의두줄을한줄로합침 AirCraft ac = new AirCraft(); AirUnit au = ac; // AirCraft 가 AirUnit 의자손이므로가능. 형변환생략됨 AirUnit au = new AirCraft(); // 위의두줄을한줄로합치면이렇게쓸수있음 Tank t = new Tank(); GroundUnit gu = t; // 조상타입의참조변수로자손타입의인스턴스를참조. OK GroundUnit gu = new Tank(); // 위의두줄을한줄로합치면이렇게쓸수있음

286 286 Java 의정석定石 2 판 - 연습문제풀이 그러나조상인스턴스를자손타입으로형변환하는것은허용하지않는다. 참조변수 u는실제로 GroundUnit인스턴스를참조하고있다. (Tank)u는 GroundUnit인스턴스를조상타입인 Tank로형변환하는것인데, 조상타입으로형변환은허용되지않으므로실행시에러가발생한다. [ 참고 ] 컴파일시에는타입만을체크하기때문에에러가발생하지않을수도있지만, 실행시에에러가발생한다. Unit u = new GroundUnit(); Tank t = new Tank(); t = (Tank)u; // 조상인스턴스 (GroundUnit) 를자손 (Tank) 으로형변환할수없다. Tank t = (Tank)new GroundUnit; // 허용되지않음

287 Java 의정석定石 2 판 - 연습문제풀이 287 [7-16] 다음중연산결과가 true 가아닌것은? ( 모두고르시오 ) class Car { class FireEngine extends Car implements Movable { class Ambulance extends Car { FireEngine fe = new FireEngine(); a. fe instanceof FireEngine b. fe instanceof Movable c. fe instanceof Object d. fe instanceof Car e. fe instanceof Ambulance [ 정답 ] e [ 해설 ] instanceof연산자는실제인스턴스의모든조상이나구현한인터페이스에대해 true를반환한다. 그래서, 아래그림에서알수있듯이 FireEngine인스턴스는 Object, Car, Movable, FireEngine타입에대해 instanceof연산을하면결과로 true를얻는다. 어떤타입에대해 instanceof연산결과가 true라는것은그타입으로형변환이가능하다는것을뜻한다. 참조변수의형변환을하기에앞서 instanceof연산자로형변환이가능한지미리확인해보는것이좋다. Object Car Movable Ambulance FireEngine

288 288 Java 의정석定石 2 판 - 연습문제풀이 [7-17] 아래세개의클래스로부터공통부분을뽑아서 Unit 이라는클래스를만들고, 이 클래스를상속받도록코드를변경하시오. class Marine { // 보병 int x, y; // 현재위치 void move(int x, int y) { /* 지정된위치로이동 */ void stop() { /* 현재위치에정지 */ void stimpack() { /* 스팀팩을사용한다.*/ class Tank { // 탱크 int x, y; // 현재위치 void move(int x, int y) { /* 지정된위치로이동 */ void stop() { /* 현재위치에정지 */ void changemode() { /* 공격모드를변환한다. */ class Dropship { // 수송선 int x, y; // 현재위치 void move(int x, int y) { /* 지정된위치로이동 */ void stop() { /* 현재위치에정지 */ void load() { /* 선택된대상을태운다.*/ void unload() { /* 선택된대상을내린다.*/ [ 정답 ] 각클래스의공통부분을뽑아서 Unit 클래스를생성하면된다. 클래스마다이동하 는방법이다르므로 move 메서드는추상메서드로정의하였다. 책에도같은내용이있기때 문에자세한설명은생략하겠다. abstract class Unit { int x, y; abstract void move(int x, int y); // 추상클래스 void stop() { /* 현재위치에정지 */ class Marine extends Unit { // 보병 void move(int x, int y) { /* 지정된위치로이동 */ void stimpack() { /* 스팀팩을사용한다.*/ class Tank extends Unit { // 탱크 void move(int x, int y) { /* 지정된위치로이동 */ void changemode() { /* 공격모드를변환한다. */ class Dropship extends Unit { // 수송선 void move(int x, int y) { /* 지정된위치로이동 */ void load() { /* 선택된대상을태운다.*/ void unload() { /* 선택된대상을내린다.*/

289 Java 의정석定石 2 판 - 연습문제풀이 289 [7-18] 다음과같은실행결과를얻도록코드를완성하시오. [Hint] instanceof 연산자를사용해서형변환한다. 메서드명 : action 기능 : 주어진객체의메서드를호출한다. 반환타입 : 없음 DanceRobot 인경우, dance() 를호출하고, SingRobot 인경우, sing() 을호출하고, DrawRobot 인경우, draw() 를호출한다. 매개변수 : Robot r - Robot 인스턴스또는 Robot 의자손인스턴스 [ 연습문제 ]/ch7/exercise7_18.java class Exercise7_18 { public static void action(robot r) { if(r instanceof DanceRobot) { DanceRobot dr = (DanceRobot)r; dr.dance(); else if(r instanceof SingRobot) { SingRobot sr = (SingRobot)r; sr.sing(); else if(r instanceof DrawRobot) { DrawRobot dr = (DrawRobot)r; dr.draw(); public static void main(string[] args) { Robot[] arr = { new DanceRobot(), new SingRobot(), new DrawRobot(); for(int i=0; i< arr.length;i++) action(arr[i]); // main class Robot { class DanceRobot extends Robot { void dance() { System.out.println(" 춤을춥니다."); class SingRobot extends Robot { void sing() { System.out.println(" 노래를합니다."); class DrawRobot extends Robot { void draw() { System.out.println(" 그림을그립니다.");

290 290 Java 의정석定石 2 판 - 연습문제풀이 [ 실행결과 ] 춤을춥니다. 노래를합니다. 그림을그립니다. [ 해설 ] action 메서드의매개변수가 Robot 타입이므로 Robot 클래스의자손클래스인 DanceRobot, SingRobot, DrawRobot 의인스턴스는모두매개변수로가능하다. Robot[] arr = { new DanceRobot(), new SingRobot(), new DrawRobot(); for(int i=0; i< arr.length;i++) action(arr[i]); action 메서드내에서는실제로받아온인스턴스가어떤것인지알수없다. 단지 Robot 클 래스또는그자손클래스의인스턴스일것이라는것만알수있다. 그래서 instanceof 연 산자를이용해야만실제인스턴스의타입을확인할수있다. public static void action(robot r) { if(r instanceof DanceRobot) { DanceRobot dr = (DanceRobot)r; dr.dance(); else if(r instanceof SingRobot) { SingRobot sr = (SingRobot)r; sr.sing(); else if(r instanceof DrawRobot) { DrawRobot dr = (DrawRobot)r; dr.draw();

291 Java 의정석定石 2 판 - 연습문제풀이 291 [7-19] 다음은물건을구입하는사람을정의한 Buyer클래스이다. 이클래스는멤버변수로돈 (money) 과장바구니 (cart) 를가지고있다. 제품을구입하는기능의 buy메서드와장바구니에구입한물건을추가하는 add메서드, 구입한물건의목록과사용금액, 그리고남은금액을출력하는 summary메서드를완성하시오. 1. 메서드명 : buy 기능 : 지정된물건을구입한다. 가진돈 (money) 에서물건의가격을빼고, 장바구니 (cart) 에담는다. 만일가진돈이물건의가격보다적다면바로종료한다. 반환타입 : 없음매개변수 : Product p - 구입할물건 2. 메서드명 : add 기능 : 지정된물건을장바구니에담는다. 만일장바구니에담을공간이없으면, 장바구니의크기를 2배로늘린다음에담는다. 반환타입 : 없음매개변수 : Product p - 구입할물건 3. 메서드명 : summary 기능 : 구입한물건의목록과사용금액, 남은금액을출력한다. 반환타입 : 없음매개변수 : 없음 [ 연습문제 ]/ch7/exercise7_19.java class Exercise7_19 { public static void main(string args[]) { Buyer b = new Buyer(); b.buy(new Tv()); b.buy(new Computer()); b.buy(new Tv()); b.buy(new Audio()); b.buy(new Computer()); b.buy(new Computer()); b.buy(new Computer()); b.summary(); class Buyer { int money = 1000; Product[] cart = new Product[3]; // 구입한제품을저장하기위한배열 int i = 0; // Product배열 cart에사용될 index void buy(product p) { // 1.1 가진돈과물건의가격을비교해서가진돈이적으며메서드를종료한다. if(money < p.price) { System.out.println(" 잔액이부족하여 "+ p +" 을 / 를살수없습니다."); return;

292 292 Java 의정석定石 2 판 - 연습문제풀이 // 1.2 가진돈이충분하면, 제품의가격을가진돈에서빼고 money -= p.price; // 1.3 장바구니에구입한물건을담는다.(add 메서드호출 ) add(p); void add(product p) { // 1.1 i 의값이장바구니의크기보다같거나크면 if(i >= cart.length) { // 기존의장바구니보다 2 배큰새로운배열을생성한다. Product[] tmp = new Product[cart.length*2]; // 기존의장바구니의내용을새로운배열에복사한다. System.arraycopy(cart,0,tmp,0,cart.length); // 새로운장바구니와기존의장바구니를바꾼다. cart = tmp; // 1.2 물건을장바구니 (cart) 에저장한다. 그리고 i 의값을 1 증가시킨다. cart[i++]=p; // add(product p) void summary() { String itemlist = ""; int sum = 0; for(int i=0; i < cart.length;i++) { if(cart[i]==null) break; // 1.1 장바구니에담긴물건들의목록을만들어출력한다. itemlist += cart[i] + ","; // 1.2 장바구니에담긴물건들의가격을모두더해서출력한다. sum += cart[i].price; // 1.3 물건을사고남은금액 (money) 를출력한다. System.out.println(" 구입한물건 :"+itemlist); System.out.println(" 사용한금액 :"+sum); System.out.println(" 남은금액 :"+money); // summary() class Product { int price; // 제품의가격 Product(int price) { this.price = price; class Tv extends Product { Tv() { super(100); public String tostring() { return "Tv"; class Computer extends Product { Computer() { super(200);

293 Java 의정석定石 2 판 - 연습문제풀이 293 public String tostring() { return "Computer"; class Audio extends Product { Audio() { super(50); public String tostring() { return "Audio"; [ 실행결과 ] 잔액이부족하여 Computer 을 / 를살수없습니다. 구입한물건 :Tv,Computer,Tv,Audio,Computer,Computer, 사용한금액 :850 남은금액 :150 [ 해설 ] 자신이스스로로직을작성할수있으면가장좋겠지만, 적어도주어진로직대로코드를구현할수있는능력은갖추어야한다. 그런능력을향상시키기위한문제이다. 이문제가쉽게느껴지는사람은로직 ( 주석 ) 을안보고코드를다시작성해보기바란다. 책에있는내용을복습하는문제이기때문에자세한설명은생략하겠다. 책을참고하길바란다.

294 294 Java 의정석定石 2 판 - 연습문제풀이 [7-20] 다음의코드를실행한결과를적으시오. [ 연습문제 ]/ch7/exercise7_20.java class Exercise7_20 { public static void main(string[] args) { Parent p = new Child(); Child c = new Child(); System.out.println("p.x = " + p.x); p.method(); System.out.println("c.x = " + c.x); c.method(); class Parent { int x = 100; void method() { System.out.println("Parent Method"); class Child extends Parent { int x = 200; void method() { System.out.println("Child Method"); [ 정답 ] [ 실행결과 ] p.x = 100 Child Method c.x = 200 Child Method [ 해설 ] 조상클래스에선언된멤버변수와같은이름의인스턴스변수를자손클래스에중 복으로정의했을때, 조상타입의참조변수로자손인스턴스를참조하는경우와자손타입 의참조변수로자손인스턴스를참조하는경우는서로다른결과를얻는다. 메서드의경우조상클래스의메서드를자손의클래스에서오버라이딩한경우에도참조변 수의타입에관계없이항상실제인스턴스의메서드 ( 오버라이딩된메서드 ) 가호출되지만, 멤버변수의경우참조변수의타입에따라달라진다. 타입은다르지만, 참조변수 p, c 모두 Child 인스턴스를참조하고있다. Parent p = new Child(); Child c = new Child();

295 Java 의정석定石 2 판 - 연습문제풀이 295 그리고, Parent 클래스와 Child 클래스는서로같은멤버들을정의하고있다. class Parent { int x = 100;... class Child extends Parent { int x = 200;... 이때조상타입의참조변수 p로 Child인스턴스의멤버들을사용하는것과자손타입의참조변수 c로 Child인스턴스의멤버들을사용하는것의차이를알수있다. 메서드인 method() 의경우참조변수의타입에관계없이항상실제인스턴스의타입인 Child클래스에정의된메서드가호출되지만, 인스턴스변수인 x는참조변수의타입에따라서달라진다.

296 296 Java 의정석定石 2 판 - 연습문제풀이 [7-21] 다음과같이 attack 메서드가정의되어있을때, 이메서드의매개변수로가능한 것두가지를적으시오. interface Movable { void move(int x, int y); void attack(movable f) { /* 내용생략 */ [ 정답 ] null, Movable인터페이스를구현한클래스또는그자손의인스턴스 [ 해설 ] 매개변수의다형성을잘이해하고있는지를확인하는문제이다. 매개변수의타입이인터페이스라는것은어떤의미일지이해하지못하는경우가많은데, 이것을이해하는것은매우중요하다. 언제라도누가 Movable인터페이스타입의매개변수로가능한것이무엇이냐? 고물었을때, 주저없이얘기할수있도록완전히외우고있어야한다.

297 Java 의정석定石 2 판 - 연습문제풀이 297 [7-22] 아래는도형을정의한 Shape클래스이다. 이클래스를조상으로하는 Circle클래스와 Rectangle클래스를작성하시오. 이때, 생성자도각클래스에맞게적절히추가해야한다. (1) 클래스명 : Circle 조상클래스 : Shape 멤버변수 : double r - 반지름 (2) 클래스명 : Rectangle 조상클래스 : Shape 멤버변수 : int width - 폭 int height - 높이메서드 : 1. 메서드명 : issquare 기능 : 정사각형인지아닌지를알려준다. 반환타입 : boolean 매개변수 : 없음 [ 연습문제 ]/ch7/exercise7_22.java abstract class Shape { Point p; Shape() { this(new Point(0,0)); Shape(Point p) { this.p = p; abstract double calcarea(); // 도형의면적을계산해서반환하는메서드 Point getposition() { return p; void setposition(point p) { this.p = p; class Rect extends Shape { double width; double height; Rect(double width, double height) { this(new Point(0,0), width, height); Rect(Point p, double width, double height) { super(p); // 조상의멤버는조상의생성자가초기화하도록한다. this.width = width;

298 298 Java 의정석定石 2 판 - 연습문제풀이 this.height = height; boolean issquare() { // width 나 height 가 0 이아니고 width 와 height 가같으면 true 를반환한다. return width*height!=0 && width==height; double calcarea() { return width * height; class Circle extends Shape { double r; // 반지름 Circle(double r) { this(new Point(0,0),r); // Circle(Point p, double r) 를호출 Circle(Point p, double r) { super(p); // 조상의멤버는조상의생성자가초기화하도록한다. this.r = r; double calcarea() { return Math.PI * r * r; class Point { int x; int y; Point() { this(0,0); Point(int x, int y) { this.x=x; this.y=y; public String tostring() { return "["+x+","+y+"]";

299 Java 의정석定石 2 판 - 연습문제풀이 299 [7-23] 문제 7-22 에서정의한클래스들의면적을구하는메서드를작성하고테스트하시 오. 1. 메서드명 : sumarea 기능 : 주어진배열에담긴도형들의넓이를모두더해서반환한다. 반환타입 : double 매개변수 : Shape[] arr [ 연습문제 ]/ch7/exercise7_23.java class Exercise7_23 { static double sumarea(shape[] arr) { double sum = 0; for(int i=0; i < arr.length;i++) sum+= arr[i].calcarea(); return sum; public static void main(string[] args) { Shape[] arr = {new Circle(5.0), new Rectangle(3,4), new Circle(1); System.out.println(" 면적의합 :"+sumarea(arr)); [ 실행결과 ] 면적의합 : [ 해설 ] 반복문으로넘겨받은객체배열 (arr) 의객체들에대해 calcarea() 를호출하여면적을구하고누적해서반환하도록작성하면된다. Shape타입의배열에는 Shape의자손인스턴스가들어있기때문에, Shape클래스의추상메서드 calcarea() 를호출해도실제로는각인스턴스에완전히구현된 calcarea() 가호출된다.

300 300 Java 의정석定石 2 판 - 연습문제풀이 [7-24] 다음중인터페이스의장점이아닌것은? a. 표준화를가능하게해준다. b. 서로관계없는클래스들에게관계를맺어줄수있다. c. 독립적인프로그래밍이가능하다. d. 다중상속을가능하게해준다. e. 패키지간의연결을도와준다. [ 정답 ] e [ 해설 ] 인터페이스를사용하는이유와그장점을정리해보면다음과같다. 1. 개발시간을단축시킬수있다. 일단인터페이스가작성되면, 이를사용해서프로그램을작성하는것이가능하다. 메서드를호출하는쪽에서는메서드의내용에관계없이선언부만알면되기때문이다. 그리고동시에다른한쪽에서는인터페이스를구현하는클래스를작성하도록하여, 인터페이스를구현하는클래스가작성될때까지기다리지않고도양쪽에서동시에개발을진행할수있다. 2. 표준화가가능하다. 프로젝트에사용되는기본틀을인터페이스로작성한다음, 개발자들에게인터페이스를구현하여프 로그램을작성하도록함으로써보다일관되고정형화된프로그램의개발이가능하다. 3. 서로관계없는클래스들에게관계를맺어줄수있다. 서로상속관계에있지도않고, 같은조상클래스를가지고있지않은서로아무런관계도없는클래 스들에게하나의인터페이스를공통적으로구현하도록함으로써관계를맺어줄수있다. 4. 독립적인프로그래밍이가능하다. 인터페이스를이용하면클래스의선언과구현을분리시킬수있기때문에실제구현에독립적인프로그램을작성하는것이가능하다. 클래스와클래스간의직접적인관계를인터페이스를이용해서간접적인관계로변경하면, 한클래스의변경이관련된다른클래스에영향을미치지않는독립적인프로그래밍이가능하다.

301 Java 의정석定石 2 판 - 연습문제풀이 301 Chapter 8 예외처리 Exception Handling

302 302 Java 의정석定石 2 판 - 연습문제풀이 [ 연습문제 - 모범답안 ] [8-1] 예외처리의정의와목적에대해서설명하시오. [ 정답 ] 정의 - 프로그램실행시발생할수있는예외의발생에대비한코드를작성하는것목적 - 프로그램의비정상종료를막고, 정상적인실행상태를유지하는것 [ 해설 ] 프로그램의실행도중에발생하는에러는어쩔수없지만, 예외는프로그래머가이에대한처리를미리해주어야한다. 에러 (error) - 프로그램코드에의해서수습될수없는심각한오류 예외 (exception) - 프로그램코드에의해서수습될수있는다소미약한오류 예외처리 (exception handling) 란, 프로그램실행시발생할수있는예기치못한예외의발생에대비한코드를작성하는것이며, 예외처리의목적은예외의발생으로인한실행중인프로그램의갑작스런비정상종료를막고, 정상적인실행상태를유지할수있도록하는것이다. 예외처리 (exception handling) 의 정의 - 프로그램실행시발생할수있는예외의발생에대비한코드를작성하는것 목적 - 프로그램의비정상종료를막고, 정상적인실행상태를유지하는것

303 Java 의정석定石 2 판 - 연습문제풀이 303 [8-2] 다음은실행도중예외가발생하여화면에출력된내용이다. 이에대한설명중옳 지않은것은? java.lang.arithmeticexception : / by zero at ExceptionEx18.method2(ExceptionEx18.java:12) at ExceptionEx18.method1(ExceptionEx18.java:8) at ExceptionEx18.main(ExceptionEx18.java:4) a. 위의내용으로예외가발생했을당시호출스택에존재했던메서드를알수있다. b. 예외가발생한위치는 method2 메서드이며, ExceptionEx18.java파일의 12번째줄이다. c. 발생한예외는 ArithmeticException이며, 0으로나누어서예외가발생했다. d. method2메서드가 method1메서드를호출하였고그위치는 ExceptionEx18.java파일의 8 번째줄이다. [ 정답 ] d [ 해설 ] 예외의종류는 ArithmeticException이고 0으로나눠서발생하였다. 예외가발생한곳은 method2이고 ExceptionEx18.java의 12번째줄이다. 예외가발생했을당시의호출스택을보면아래의그림과같다. 호출스택은맨위에있는메서드가현재실행중인메서드이고아래있는메서드가바로위의메서드를호출한것이다. 그래서 main method1 method2의순서로호출되었음을알수있다. method2 method1 main 괄호안의내용은예외가발생한소스와라인인데, method1() 의경우예외가발생한곳이 method2() 호출한라인이고 main의경우 method1() 을호출한라인이다. method1() 에서봤을때는 method2() 를호출한곳에서예외가발생한것이기때문이다. main메서드역시마찬가지.

304 304 Java 의정석定石 2 판 - 연습문제풀이 [8-3] 다음중오버라이딩이잘못된것은? ( 모두고르시오 ) void add(int a, int b) throws InvalidNumberException, NotANumberException { class NumberException extends Exception { class InvalidNumberException extends NumberException { class NotANumberException extends NumberException { a. void add(int a, int b) throws InvalidNumberException, NotANumberException { b. void add(int a, int b) throws InvalidNumberException { c. void add(int a, int b) throws NotANumberException { d. void add(int a, int b) throws Exception { e. void add(int a, int b) throws NumberException { [ 정답 ] d, e [ 해설 ] 오버라이딩 (overriding) 을할때, 조상클래스의메서드보다많은수의예외를선언할수없다. - 아래의코드를보면 Child클래스의 parentmethod() 에선언된예외의개수가조상인 Parent클래스의 parentmethod() 에선언된예외의개수보다적으므로바르게오버라이딩되었다. Class Parent { void parentmethod() throws IOException, SQLException { //.. Class Child extends Parent { void parentmethod() throws IOException { //.. //.. 여기서주의해야할점은단순히선언된예외의개수의문제가아니라는것이다. Class Child extends Parent { void parentmethod() throws Exception { //.. //.. 만일위와같이오버라이딩을하였다면, 분명히조상클래스에정의된메서드보다적은개 수의예외를선언한것처럼보이지만 Exception 은모든예외의최고조상이므로가장많

305 Java 의정석定石 2 판 - 연습문제풀이 305 은개수의예외를던질수있도록선언한것이다. 그래서예외의개수는적거나같아야한다는조건을만족시키지못하는잘못된오버라이 딩인것이다. 아래의코드로이문제를직접테스트할수있다. class NumberException extends Exception { class InvalidNumberException extends NumberException { class NotANumberException extends NumberException { class Parent { int a; int b; Parent() { this(0,0); Parent(int a, int b) { this.a = a; this.b = b; void add(int a, int b) throws InvalidNumberException, NotANumberException { class Child extends Parent { Child() { Child(int a, int b) { super(a,b); void add(int a, int b) throws InvalidNumberException, NotANumberException {

306 306 Java 의정석定石 2 판 - 연습문제풀이 [8-4] 다음과같은메서드가있을때, 예외를잘못처리한것은? ( 모두고르시오 ) void method() throws InvalidNumberException, NotANumberException { class NumberException extends RuntimeException { class InvalidNumberException extends NumberException { class NotANumberException extends NumberException { a. try {method(); catch(exception e) { b. try {method(); catch(numberexception e) { catch(exception e) { c. try {method(); catch(exception e) { catch(numberexception e) { d. try {method(); catch(invalidnumberexception e) { catch(notanumberexception e) { e. try {method(); catch(numberexception e) { f. try {method(); catch(runtimeexception e) { [ 정답 ] c [ 해설 ] try블럭내에서예외가발생하면, catch블럭중에서예외를처리할수있는것을을차례대로찾아내려간다. 발생한예외의종류와일치하는 catch블럭이있으면그블럭의문장들을수행하고 try-catch문을빠져나간다. 일치하는 catch블럭이없으면예외는처리되지않는다. 발생한예외의종류와일치하는 catch블럭을찾을때, instanceof로검사를하기때문에모든예외의최고조상인 Exception이선언된 catch블럭은모든예외를다처리할수있다. 한가지주의할점은 Exception을처리하는 catch블럭은모든 catch블럭중제일마지막에있어야한다는것이다. try { method(); catch(exception e) { // 컴파일에러발생!!! catch(numberexception e) { 위의코드에서는 Exception 을선언한 catch 블럭이마지막 catch 블럭이아니기때문에컴 파일에러가발생한다.

307 Java 의정석定石 2 판 - 연습문제풀이 307 [8-5] 아래의코드가수행되었을때의실행결과를적으시오. [ 연습문제 ]/ch8/exercise8_5.java class Exercise8_5 { static void method(boolean b) { try { System.out.println(1); if(b) throw new ArithmeticException(); System.out.println(2); // 예외가발생하면실행되지않는문장 catch(runtimeexception r) { System.out.println(3); return; // 메서드를빠져나간다.(finally 블럭을수행한후에 ) catch(exception e) { System.out.println(4); return; finally { System.out.println(5); // 예외발생여부에관계없이항상실행되는문장 System.out.println(6); public static void main(string[] args) { method(true); method(false); // main [ 정답 ] [ 실행결과 ] [ 해설 ] 예외가발생하면 1,3,5가출력되고예외가발생하지않으면, 1,2,5,6이출력된다. ArithmeticException은 RuntimeException의자손이므로 RuntimeException이정의된 catch블럭에서처리된다. 이 catch블럭에 return문이있으므로메서드를종료하고빠져나가게되는데, 이때도 finally블럭이수행된다.

308 308 Java 의정석定石 2 판 - 연습문제풀이 [8-6] 아래의코드가수행되었을때의실행결과를적으시오. [ 연습문제 ]/ch8/exercise8_6.java class Exercise8_6 { public static void main(string[] args) { try { method1(); catch(exception e) { System.out.println(5); static void method1() { try { method2(); System.out.println(1); catch(arithmeticexception e) { System.out.println(2); finally { System.out.println(3); System.out.println(4); // method1() static void method2() { throw new NullPointerException(); [ 정답 ] [ 실행결과 ] 3 5 [ 해설 ] main메서드가 method1() 을호출하고, method1() 은 method2() 를호출한다. method2() 에서 NullPointerException이발생했는데, 이예외를처리해줄 try-catch블럭이없으므로 method2() 는종료되고, 이를호출한 method1() 으로되돌아갔는데여기에는 try-catch블럭이있긴하지만 NullPointerException을처리해줄 catch블럭이없으므로 method1() 도종료되고, 이를호출한 main메서드로돌아간다. 이때 finally블럭이수행되어 '3' 이출력된다. main메서드에서는모든예외를처리할수있는 Exception이선언된 catch블럭이있으므로예외가처리되고 '5' 가출력된다.

309 Java 의정석定石 2 판 - 연습문제풀이 309 [8-7] 아래의코드가수행되었을때의실행결과를적으시오. [ 연습문제 ]/ch8/exercise8_7.java class Exercise8_7 { static void method(boolean b) { try { System.out.println(1); if(b) System.exit(0); System.out.println(2); catch(runtimeexception r) { System.out.println(3); return; catch(exception e) { System.out.println(4); return; finally { System.out.println(5); System.out.println(6); public static void main(string[] args) { method(true); method(false); // main [ 정답 ] [ 실행결과 ] 1 [ 해설 ] 변수 b 의값이 true 이므로 System.exit(0); 이수행되어프로그램이즉시종료된 다. 이럴때는 finally 블럭이수행되지않는다.

310 310 Java 의정석定石 2 판 - 연습문제풀이 [8-8] 다음은 1~100 사이의숫자를맞추는게임을실행하던도중에숫자가아닌영문자를 넣어서발생한예외이다. 예외처리를해서숫자가아닌값을입력했을때는다시입력을 받도록보완하라. 1 과 100 사이의값을입력하세요 :50 더작은수를입력하세요. 1 과 100 사이의값을입력하세요 :asdf Exception in thread "main" java.util.inputmismatchexception at java.util.scanner.throwfor(scanner.java:819) at java.util.scanner.next(scanner.java:1431) at java.util.scanner.nextint(scanner.java:2040) at java.util.scanner.nextint(scanner.java:2000) at Exercise8_8.main(Exercise8_8.java:16) [ 연습문제 ]/ch8/exercise8_8.java import java.util.*; class Exercise8_8 { public static void main(string[] args) { // 1~100 사이의임의의값을얻어서 answer 에저장한다. int answer = (int)(math.random() * 100) + 1; int input = 0; // 사용자입력을저장할공간 int count = 0; // 시도횟수를세기위한변수 do { count++; System.out.print("1 과 100 사이의값을입력하세요 :"); // input = new Scanner(System.in).nextInt(); try { input = new Scanner(System.in).nextInt(); catch(exception e) { System.out.println(" 유효하지않은값입니다. " +" 다시값을입력해주세요."); continue; if(answer > input) { System.out.println(" 더큰수를입력하세요."); else if(answer < input) { System.out.println(" 더작은수를입력하세요."); else { System.out.println(" 맞췄습니다."); System.out.println(" 시도횟수는 "+count+" 번입니다."); break; // do-while 문을벗어난다 while(true); // 무한반복문 // end of main // end of class HighLow

311 Java 의정석定石 2 판 - 연습문제풀이 311 [ 실행결과 ] 1 과 100 사이의값을입력하세요 :50 더작은수를입력하세요. 1 과 100 사이의값을입력하세요 :asdf 유효하지않은값입니다. 다시값을입력해주세요. 1 과 100 사이의값을입력하세요 :25 더큰수를입력하세요. 1 과 100 사이의값을입력하세요 :38 더큰수를입력하세요. 1 과 100 사이의값을입력하세요 :44 맞췄습니다. 시도횟수는 5 번입니다. [ 해설 ] 사용자로부터값을입력받는경우에는유효성검사를철저하게해야한다. 사용자가어떤값을입력할지모르기때문이다. 여기서는간단하게화면으로부터값을입력받는부분에 try-catch구문으로예외처리를해주기만하면된다. 값을입력받을때예외가발생하면, 값을다시입력하라는메세지를보여주고다시입력받으면된다. input = new Scanner(System.in).nextInt(); try { input = new Scanner(System.in).nextInt(); catch(exception e) { System.out.println(" 유효하지않은값입니다. 다시값을입력해주세요."); continue;

312 312 Java 의정석定石 2 판 - 연습문제풀이 [8-9] 다음과같은조건의예외클래스를작성하고테스트하시오. [ 참고 ] 생성자는실행결과를보고알맞게작성해야한다. * 클래스명 : UnsupportedFuctionException * 조상클래스명 : RuntimeException * 멤버변수 : 이름 : ERR_CODE 저장값 : 에러코드타입 : int 기본값 : 100 제어자 : final private * 메서드 : 1. 메서드명 : geterrorcode 기능 : 에러코드 (ERR_CODE) 를반환한다. 반환타입 : int 매개변수 : 없음제어자 : public 2. 메서드명 : getmessage 기능 : 메세지의내용을반환한다.(Exception클래스의 getmessage() 를오버라이딩 ) 반환타입 : String 매개변수 : 없음제어자 : public [ 연습문제 ]/ch8/exercise8_9.java class UnsupportedFuctionException extends RuntimeException { private final int ERR_CODE; UnsupportedFuctionException(String msg, int errcode) { // 생성자 super(msg); ERR_CODE = errcode; UnsupportedFuctionException(String msg) { // 생성자 this(msg, 100); // ERR_CODE 를 100( 기본값 ) 으로초기화한다. public int geterrcode() { // 에러코드를얻을수있는메서드도추가했다. return ERR_CODE; // 이메서드는주로 getmessage() 와함께사용될것이다. public String getmessage() { // Exception 의 getmeesage() 를오버라이딩한다. return "["+geterrcode()+"]" + super.getmessage(); class Exercise8_9 { public static void main(string[] args) throws Exception { throw new UnsupportedFuctionException(" 지원하지않는기능입니다.",100);

313 Java 의정석定石 2 판 - 연습문제풀이 313 [ 실행결과 ] Exception in thread "main" UnsupportedFuctionException: [100] 지원하지않는기능입니다. at Exercise8_9.main(Exercise8_9.java:5) [ 해설 ] 에러메시지를저장하는인스턴스변수 msg는상속받은것이므로조상의생성자를호출해서초기화되도록해야한다. ERR_CODE는한번값이지정되면바뀌는값이아니라서 final을붙여서상수로했다. 그리고생성자를통해초기화하였다. UnsupportedFuctionException(String msg, int errcode) { // 생성자 super(msg); // 조상의생성자 RuntimeException(String msg) 를호출 ERR_CODE = errcode; getmessage() 역시조상으로부터상속받은것이며, ERR_CODE 도같이출력되도록하기위 해오버라이딩했다. 조상의메서드를오버라이딩할때는, 가능하다면조상의메서드를재 활용하는것이좋다. public String getmessage() { // Exception 의 getmeesage() 를오버라이딩한다. return "["+geterrcode()+"]" + super.getmessage();

314 314 Java 의정석定石 2 판 - 연습문제풀이 [8-10] 아래의코드가수행되었을때의실행결과를적으시오. [ 연습문제 ]/ch8/exercise8_10.java class Exercise8_10 { public static void main(string[] args) { try { method1(); // 예외발생!!! System.out.println(6); // 예외가발생해서실행되지않는다. catch(exception e) { System.out.println(7); static void method1() throws Exception { try { method2(); System.out.println(1); catch(nullpointerexception e) { System.out.println(2); throw e; // 예외를다시발생시킨다. 예외되던지기 (re-throwing) catch(exception e) { System.out.println(3); finally { System.out.println(4); System.out.println(5); // method1() static void method2() { throw new NullPointerException(); // NullPointerException 을발생시킨다. [ 정답 ] [ 실행결과 ] [ 해설 ] method2() 에서발생한예외를 method1() 의 try-catch문에서처리했다가다시발생시킨다. catch(nullpointerexception e) { System.out.println(2); throw e; // 예외를다시발생시킨다. 예외되던지기 (re-throwing) catch(exception e) { 예외가발생한 catch 블럭내에이예외 (NullPointerException) 를처리할 try-catch 블럭이 없기때문에 method1() 이종료되면서 main 메서드에예외가전달된다. 이때예외가처리 되진않았지만, finally 블럭의문장이수행되어 4 가출력된다.

315 Java 의정석定石 2 판 - 연습문제풀이 315 main 메서드의 try-catch 블럭은 method1() 으로부터전달된예외를처리할 catch 블럭이있 으므로해당 catch 블럭이수행되어 7 을출력하고 try-catch 블럭을벗어난다. 그리고더 이상수행할코드가없으므로프로그램이종료된다. try { method1(); // NullPointerException 발생!!! System.out.println(6); // 예외가발생해서실행되지않는다. catch(exception e) { // 모든종류의예외를처리할수있다. System.out.println(7);

316 316 Java 의정석定石 2 판 - 연습문제풀이 Chapter 9 java.lang 패키지 java.lang package

317 Java 의정석定石 2 판 - 연습문제풀이 317 [ 연습문제 - 모범답안 ] [9-1] 다음과같은실행결과를얻도록 SutdaCard 클래스의 equals() 를멤버변수인 num, iskwang 의값을비교하도록오버라이딩하고테스트하시오. [ 연습문제 ]/ch9/exercise9_1.java class Exercise9_1 { public static void main(string[] args) { SutdaCard c1 = new SutdaCard(3,true); SutdaCard c2 = new SutdaCard(3,true); System.out.println("c1="+c1); System.out.println("c2="+c2); System.out.println("c1.equals(c2):"+c1.equals(c2)); 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; return false; public String tostring() { return num + ( iskwang? "K":""); [ 실행결과 ] c1=3k c2=3k c1.equals(c2):true

318 318 Java 의정석定石 2 판 - 연습문제풀이 [ 해설 ] 매개변수가 Object타입이므로어떤타입의인스턴스도매개변수로가능하다. 그래서반드시 instanceof로확인한후에형변환해서멤버변수 num과 iskwang의값을비교해야한다. 만일 instanceof의결과가 false라면멤버변수의값을비교할필요도없이그냥 false만반환하면된다. public boolean equals(object obj) { if(obj instanceof SutdaCard) { SutdaCard c = (SutdaCard)obj; return num==c.num && iskwang==c.iskwang; return false;

319 Java 의정석定石 2 판 - 연습문제풀이 319 [9-2] 다음과같은실행결과를얻도록 Point3D 클래스의 equals() 를멤버변수인 x, y, z 의값을비교하도록오버라이딩하고, tostring() 은실행결과를참고해서적절히오버라이 딩하시오. [ 연습문제 ]/ch9/exercise9_2.java class Exercise9_2 { public static void main(string[] args) { Point3D p1 = new Point3D(1,2,3); Point3D p2 = new Point3D(1,2,3); System.out.println(p1); System.out.println(p2); System.out.println("p1==p2?"+(p1==p2)); System.out.println("p1.equals(p2)?"+(p1.equals(p2))); class Point3D { int x,y,z; Point3D(int x, int y, int z) { this.x=x; this.y=y; this.z=z; Point3D() { this(0,0,0); public boolean equals(object obj) { if(obj instanceof Point3D) { Point3D p =(Point3D)obj; return x==p.x && y==p.y && z==p.z; return false; public String tostring() { return "["+x+","+y+","+z+"]"; [ 실행결과 ] [1,2,3] [1,2,3] p1==p2?false p1.equals(p2)?true [ 해설 ] 문제 9-1 과유사한문제이므로설명을생략하겠다.

320 320 Java 의정석定石 2 판 - 연습문제풀이 [9-3] 다음과같은실행결과가나오도록코드를완성하시오. [ 연습문제 ]/ch9/exercise9_3.java class Exercise9_3 { public static void main(string[] args) { String fullpath = "c:\\jdk1.5\\work\\pathseparatetest.java"; String path = ""; String filename = ""; int pos = fullpath.lastindexof("\\"); if(pos!=-1) { path = fullpath.substring(0, pos); filename = fullpath.substring(pos+1); System.out.println("fullPath:"+fullPath); System.out.println("path:"+path); System.out.println("fileName:"+fileName); [ 실행결과 ] fullpath:c:\jdk1.5\work\pathseparatetest.java path:c:\jdk1.5\work filename:pathseparatetest.java [ 해설 ] lastindexof() 와 substring() 을사용해서문자열을나누는문제다. 마지막경로구분자를찾아야하기때문에, indexof() 보다는 lastindexof() 가적합하다. lastindexof() 는찾는문자열이없으면 -1을반환하기때문에조건문을사용해서결과가 -1인경우에는 substring() 을호출하지않아야한다.(pos의값이음수이면, substring() 에서예외가발생한다.) 그래서 if문으로처리를해주었는데, try-catch로처리해도좋다.(if문없이문제를풀었어도충분히좋은답안이다.) [ 참고 ] 아래의두문장은서로같은의미이다. filename = fullpath.substring(pos+1); // 지정된위치부터끝까지잘라낸다. filename = fullpath.substring(pos+1, fullpath.length()); // 위문장과동일

321 Java 의정석定石 2 판 - 연습문제풀이 321 [9-4] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : printgraph 기능 : 주어진배열에담긴값만큼주어진문자를가로로출력한후, 값을출력한다. 반환타입 : 없음매개변수 : int[] dataarr - 출력할그래프의데이터 char ch - 그래프로출력할문자. [ 연습문제 ]/ch9/exercise9_4.java class Exercise9_4 { static void printgraph(int[] dataarr, char ch) { for(int i=0; i < dataarr.length;i++) { for(int j=0; j < dataarr[i];j++) { System.out.print(ch); System.out.println(dataArr[i]); public static void main(string[] args) { printgraph(new int[]{3,7,1,4,'*'); [ 실행결과 ] ***3 *******7 *1 ****4 [ 해설 ] 반복문으로배열의저장된숫자를읽어서, 그숫자만큼별을출력하면된다.

322 322 Java 의정석定石 2 판 - 연습문제풀이 [9-5] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : count 기능 : 주어진문자열 (src) 에찾으려는문자열 (target) 이몇번나오는지세어서반환한다. 반환타입 : int 매개변수 : String src String target [Hint] String 클래스의 indexof(string str, int fromindex) 를사용할것 [ 연습문제 ]/ch9/exercise9_5.java class Exercise9_5 { public static int count(string src, String target) { int count = 0; // 찾은횟수 int pos = 0; // 찾기시작할위치 // (1) 반복문을사용해서아래의과정을반복한다. while(true) { // 1. src 에서 target 을 pos 의위치부터찾는다. pos = src.indexof(target,pos); // 2. 찾으면 count 의값을 1 증가시키고, // pos 의값을 target.length 만큼증가시킨다. if(pos!=-1) { count++; pos += target.length(); // pos 를찾은단어이후로옮긴다. else { // 3. indexof 의결과가 -1 이면반복문을빠져나가서 count 를반환한다. break; return count; public static void main(string[] args) { System.out.println(count("12345AB12AB345AB","AB")); System.out.println(count("12345","AB")); [ 실행결과 ] 3 0 [ 해설 ] indexof() 는지정된문자열을찾아서그위치를알려준다. 만일찾지못한다면 -1 을반환한다. 문자열 "12345AB12AB345AB" 에서문자열 "AB" 를 indexof() 로찾으면그첫 번째위치는아래의표에서알수있듯이 5 이다. 두번째는 9, 세번째는 14 이다. index char A B 1 2 A B A B

323 Java 의정석定石 2 판 - 연습문제풀이 323 지정된문자열을찾으면변수 count를 1증가시키고, 찾기시작할위치를찾은문자열의이후로변경해주어야그다음에나오는일치하는문자열을찾을수있다. 그래서찾은위치 (pos) 에찾은문자열의길이 (target.length()) 를더해주는것이다. 여기서는 target.length() 의값이 2이므로찾은위치에서두글자뒤부터찾기시작한다. // 2. 찾으면 count 의값을 1 증가시키고, pos 의값을 target.length 만큼증가시킨다. if(pos!=-1) { count++; pos += target.length(); // pos 를찾은단어이후로옮긴다. else {... pos pos+target.length() index char A B 1 2 A B A B 참고로반복문을좀더간결히하면아래와같이할수있다. while((pos = src.indexof(target,pos))!=-1) { count++; pos += target.length();

324 324 Java 의정석定石 2 판 - 연습문제풀이 [9-6] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : fillzero 기 능 : 주어진문자열 ( 숫자 ) 로주어진길이의문자열로만들고, 왼쪽빈공간은 '0' 으로 채운다. 만일주어진문자열이 null 이거나문자열의길이가 length 의값과같으면그대로 반환한다. 반환타입 : String 만일주어진 length 의값이 0 보다같거나작은값이면, 빈문자열 ("") 을반환한다. 매개변수 : String src - 변환할문자열 int length - 변환한문자열의길이 [ 연습문제 ]/ch9/exercise9_6.java class Exercise9_6 { public static String fillzero(string src, int length) { // 1. src 가널이거나 src.length() 가 length 와같으면 src 를그대로반환한다. if(src==null src.length()==length) { return src; // 2. length 의값이 0 보다같거나작으면빈문자열 ("") 을반환한다. else if(length <=0) { return ""; // 3. src 의길이가 length 의값보다크면 src 를 length 만큼잘라서반환한다. else if(src.length() > length) { return src.substring(0,length); // 4. 길이가 legnth 인 char 배열을생성한다. char[] charr = new char[length]; // 5. 4 에서생성한 char 배열을 '0' 으로채운다. for(int i=0;i<charr.length;i++) charr[i] = '0'; // 6. src 에서문자배열을뽑아내서 4 에서생성한배열에복사한다. System.arraycopy(src.toCharArray(),0,chArr,length-src.length(), src.length()); // 7. 4 에서생성한배열로 String 을생성해서반환한다. return new String(chArr); public static void main(string[] args) { String src = "12345"; System.out.println(fillZero(src,10)); System.out.println(fillZero(src,-1)); System.out.println(fillZero(src,3)); [ 실행결과 ]

325 Java 의정석定石 2 판 - 연습문제풀이 325 [9-7] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : contains 기능 : 첫번째문자열 (src) 에두번째문자열 (target) 이포함되어있는지확인한다. 포함되어있으면 true, 그렇지않으면 false를반환한다. 반환타입 : boolean 매개변수 : String src String target [Hint] String 클래스의 indexof() 를사용할것 [ 연습문제 ]/ch9/exercise9_7.java class Exercise9_7 { public static boolean contains(string src, String target) { return src.indexof(target)!=-1; public static void main(string[] args) { System.out.println(contains("12345","23")); System.out.println(contains("12345","67")); [ 실행결과 ] true false [ 해설 ] indexof() 는지정된문자열 (src) 에서특정문자열 (target) 을찾아서그위치를알 려준다. 만일찾지못한다면 -1 을반환하므로 indexof() 의결과가 -1 인지만확인해서그 결과를돌려주면된다. 예를들어 'src.indexof(target)' 의결과가 -1 이라면아래와같은연산과정을거친다. return src.indexof(target)!=-1; return -1!=-1; return false;

326 326 Java 의정석定石 2 판 - 연습문제풀이 [9-8] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : round 기능 : 주어진값을반올림하여, 소수점이하 n자리의값을반환한다. 예를들어 n의값이 3이면, 소수점 4째자리에서반올림하여소수점이하 3자리의수를반환한다. 반환타입 : double 매개변수 : double d - 변환할값 int n - 반올림한결과의소수점자리 [Hint] Math.round() 와 Math.pow() 를이용하라. [ 연습문제 ]/ch9/exercise9_8.java class Exercise9_8 { public static double round(double d, int n) { return Math.round(d * Math.pow(10, n)) / Math.pow(10,n); public static void main(string[] args) { System.out.println(round(3.1415,1)); System.out.println(round(3.1415,2)); System.out.println(round(3.1415,3)); System.out.println(round(3.1415,4)); System.out.println(round(3.1415,5)); [ 실행결과 ] [ 해설 ] Math.round() 는소수점첫째자리에서반올림해서 long타입의정수로반환하고 Math.pow(double a, double b) 는 a의 b제곱을반환한다. 10의 3제곱은 Math.pow(10,3) 으로구할수있다. Math.round() 가소수점첫째자리에서반올림하기때문에, 소수점 n+1째자리에서반올림해서소수점 n째자리로만들려면 10의 n제곱을곱한다음에반올림하고다시 10의 n제곱으로나눠줘야한다. 이두메서드는 Math 클래스에선언되어있으며, 선언부는아래와같다. public static long round(double a) public static double pow(double a, double b)

327 Java 의정석定石 2 판 - 연습문제풀이 327 [9-9] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : delchar 기능 : 주어진문자열에서금지된문자들을제거하여반환한다. 반환타입 : String 매개변수 : String src - 변환할문자열 String delch - 제거할문자들로구성된문자열 [ 힌트 ] StringBuffer 와 String 클래스의 charat(int i) 과 indexof(int ch) 를사용하라. [ 연습문제 ]/ch9/exercise9_9.java class Exercise9_9 { public static String delchar(string src, String delch) { StringBuffer sb = new StringBuffer(src.length()); for(int i=0; i < src.length();i++) { char ch = src.charat(i); // ch 가 delch 에포함되있지않으면 (indexof() 로못찾으면 ) sb 에추가 if(delch.indexof(ch)==-1) // indexof(int ch) 를호출 sb.append(ch); return sb.tostring(); // StringBuffer 에저장된내용을 String 으로반환 public static void main(string[] args) { System.out.println("(1!2@3^4~5)"+" -> " + delchar("(1!2@3^4~5)","~!@#$%^&*()")); System.out.println("( \t5)"+" -> " + delchar("( \t5)"," \t")); [ 실행결과 ] (1!2@3^4~5) -> ( ) -> (12345) [ 해설 ] 반복문을이용해서주어진문자열 (src) 의문자를순서대로가져와서, 삭제할문자 열 (delch) 에포함되었는지확인한다. 포함되어있지않을때만 (indexof() 의결과가 -1 일 때만 ), StringBuffer 에추가한다. int indexof(int ch) // 문자열에서특정문자 (ch) 를찾을때사용 // 매개변수타입이 int 지만 char 값을넣으면된다. int indexof(string str) // 문자열에서특정문자열 (str) 을찾을때사용

328 328 Java 의정석定石 2 판 - 연습문제풀이 [9-10] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : format 기능 : 주어진문자열을지정된크기의문자열로변환한다. 나머지공간은공백으로채운다. 반환타입 : String 매개변수 : String str - 변환할문자열 int length - 변환된문자열의길이 int alignment - 변환된문자열의정렬조건 (0: 왼쪽정렬, 1: 가운데정렬, 2: 오른쪽정렬 ) [ 연습문제 ]/ch9/exercise9_10.java class Exercise9_10 { static String format(string str, int length, int alignment) { // 1. length 의값이 str 의길이보다작으면 length 만큼만잘라서반환한다. int diff = length - str.length(); if(diff < 0) return str.substring(0, length); // 2. 1 의경우가아니면, length 크기의 char 배열을생성하고공백으로채운다. char[] source = str.tochararray(); // 문자열을 char 배열로변환 char[] result = new char[length]; for(int i=0; i < result.length; i++) result[i] = ' '; // 배열 result 를공백으로채운다. // 3. 정렬조건 (alignment) 의값에따라문자열 (str) 을복사할위치를결정한다. switch(alignment) { case 0 : default : System.arraycopy(source, 0, result, 0, source.length); break; case 1 : System.arraycopy(source, 0, result, diff/2, source.length); break; case 2 : System.arraycopy(source, 0, result, diff, source.length); break; // 4. 2 에서생성한 char 배열을문자열로만들어서반환한다. return new String(result); // static String format(string str, int length, int alignment) { public static void main(string[] args) { String str = " 가나다 "; System.out.println(format(str,7,0)); // 왼쪽정렬 System.out.println(format(str,7,1)); // 가운데정렬 System.out.println(format(str,7,2)); // 오른쪽정렬 [ 실행결과 ] 가나다가나다가나다

329 Java 의정석定石 2 판 - 연습문제풀이 329 [9-11] 커맨드라인으로 2~9 사이의두개의숫자를받아서두숫자사이의구구단을출력 하는프로그램을작성하시오. 예를들어 3 과 5 를입력하면 3 단부터 5 단까지출력한다. [ 실행결과 ] C:\jdk1.5\work>java Exercise9_11 2 시작단과끝단, 두개의정수를입력해주세요. USAGE : GugudanTest 3 5 C:\jdk1.5\work>java Exercise9_ 단의범위는 2 와 9 사이의값이어야합니다. USAGE : GugudanTest 3 5 C:\jdk1.5\work\ch9>java Exercise9_ *1=3 3*2=6 3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45 [ 정답 ] [ 연습문제 ]/ch9/exercise9_11.java class Exercise9_11 { public static void main(string[] args) { int from = 0; int to = 0; try { if(args.length!=2)

330 330 Java 의정석定石 2 판 - 연습문제풀이 throw new Exception(" 시작단과끝단, 두개의정수를입력해주세요."); from = Integer.parseInt(args[0]); to = Integer.parseInt(args[1]); if(!(2 <= from && from <= 9 && 2 <= to && to <= 9)) throw new Exception(" 단의범위는 2 와 9 사이의값이어야합니다."); catch(exception e) { System.out.println(e.getMessage()); System.out.println("USAGE : GugudanTest 3 5"); System.exit(0); // 시작단 (from) 이끝단 (to) 보다작아야하니까 // to 보다 from 의값이크면두값을바꾼다. if(from > to) { int tmp = from; from = to; to = tmp; // from 단부터 to 단까지출력한다. for(int i=from;i<=to;i++) { for(int j=1;j<=9;j++) { System.out.println(i+"*"+j+"="+i*j); System.out.println(); // main [ 해설 ] 커맨드라인을통해두개의정수를입력받고유효성검사를하는부분을예외로 처리하였는데, 그냥 if 문으로만처리해도되지만코드의중복을줄이려고그렇게했다. 특별히어려운부분은없으므로자세한설명은생략하겠다.

331 Java 의정석定石 2 판 - 연습문제풀이 331 [9-12] 다음과같이정의된메서드를작성하고테스트하시오. [ 주의 ] Math.random() 을사용하는경우실행결과와다를수있음. 메서드명 : getrand 기능 : 주어진범위 (from~to) 에속한임의의정수값을반환한다. ( 양쪽경계값모두범위에포함 ) from의값이 to의값보다클경우도처리되어야한다. 반환타입 : int 매개변수 : int from - 범위의시작값 int to - 범위의끝값 [Hint] Math.random() 과절대값을반환하는 Math.abs(int a), 그리고둘중에작은값을반환하는 Math.min(int a, int b) 를사용하라. [ 연습문제 ]/ch9/exercise9_12.java class Exercise9_12 { public static int getrand(int from, int to) { return (int)(math.random() * (Math.abs(to-from)+1))+ Math.min(from,to); public static void main(string[] args) { for(int i=0; i< 20; i++) System.out.print(getRand(1,-3)+","); [ 실행결과 ] 0,-1,1,0,-2,-2,1,1,-3,0,-1,1,1,1,0,-1,1,0,-1,-3, [ 해설 ] 만일 1~10 범위의임의의값을구하려면, 아래와같은식으로구할수있다는것을 이미배웠다. 1 <= (int)(math.random()*10)+1 < 11 위의식에서 Math.random() 에곱해준값 10은바로범위에포함된정수의개수라는것을알수있다. 예를들어 1~10의범위라면 10개의정수중의하나가임의로선택될것이다. 이값은 '( 끝값-시작값 )+1' 로구할수있다. '(10-1)+1' 을계산한결과는 10이된다. 1 <= (int)(math.random()*(to-from+1)+1 < 11 문제의조건중에 from 의값이 to 의값보다클경우도처리하라는것이있으므로 Math.abs() 를이용해서 ' 끝값 - 시작값 ' 이음수가되지않도록처리해야한다. 1 <= (int)(math.random()*(math.abs(to-from)+1)+1 < 11

332 332 Java 의정석定石 2 판 - 연습문제풀이 Math.random() 에더해주는값은범위의시작값이다. 문제의조건중에 from 의값이 to 값 보다클경우도처리해야하므로 from 과 to 중에서작은값이더해져야한다. 삼항연산자 를써서처리할수도있지만, Math.min() 을사용했다. 1 <= (int)(math.random()*(math.abs(to-from)+1)+1 < 11 1 <= (int)(math.random()*(math.abs(to-from)+1) +(from < to? from:to) < 11 1 <= (int)(math.random()*(math.abs(to-from)+1) + Math.min(from,to) < 11

333 Java 의정석定石 2 판 - 연습문제풀이 333 Chapter 10 내부클래스 Inner class

334 334 Java 의정석定石 2 판 - 연습문제풀이 [ 연습문제 - 모범답안 ] [10-1] Outer 클래스의내부클래스 Inner 의멤버변수 iv 의값을출력하시오. [ 연습문제 ]/ch10/exercise10_1.java class Outer { // 외부클래스 class Inner { // 내부클래스 ( 인스턴스클래스 ) int iv=100; class Exercise10_1 { public static void main(string[] args) { Outer o = new Outer(); Outer.Inner ii = o.new Inner(); System.out.println(ii.iv); [ 실행결과 ] 100 [ 해설 ] 내부클래스 ( 인스턴스클래스 ) 의인스턴스를생성하기위해서는먼저외부클래스 의인스턴스를생성해야한다. 왜냐하면 ' 인스턴스클래스 ' 는외부클래스의 ' 인스턴스변 수 ' 처럼외부클래스의인스턴스가생성되어야쓸수있기때문이다.

335 Java 의정석定石 2 판 - 연습문제풀이 335 [10-2] Outer 클래스의내부클래스 Inner 의멤버변수 iv 의값을출력하시오. [ 연습문제 ]/ch10/exercise10_2.java class Outer { // 외부클래스 static class Inner { // 내부클래스 (static클래스) int iv=200; class Exercise10_2 { public static void main(string[] args) { Outer.Inner ii = new Outer.Inner(); System.out.println(ii.iv); [ 실행결과 ] 200 [ 해설 ] 스태틱클래스 (static inner class) 는인스턴스클래스와달리외부클래스의인 스턴스를생성하지않고도사용할수있다. 마치 static 멤버를인스턴스생성없이사용할 수있는것처럼.

336 336 Java 의정석定石 2 판 - 연습문제풀이 [10-3] 다음과같은실행결과를얻도록 (1)~(4) 의코드를완성하시오. [ 연습문제 ]/ch10/exercise10_3.java class Outer { int value=10; // Outer.this.value class Inner { // 인스턴스클래스 (instance inner class) int value=20; // this.value void method1() { int value=30; // value System.out.println( value); System.out.println( this.value); System.out.println(Outer.this.value); // Inner클래스의끝 // Outer클래스의끝 class Exercise10_3 { public static void main(string args[]) { Outer outer = new Outer(); Outer.Inner inner = outer.new Inner(); inner.method1(); [ 실행결과 ] [ 해설 ] 외부클래스와내부클래스에같은이름의인스턴스변수 (value) 가선언되었을때어떻게구별하는가에대한문제이다. 외부클래스의인스턴스변수는내부클래스에서 외부클래스이름.this. 변수이름 로접근할수있다. 내부클래스의종류가인스턴스클래스이기때문에외부클래스의인스턴스를생성한다음에야내부클래스의인스턴스를생성할수있다.

337 Java 의정석定石 2 판 - 연습문제풀이 337 [10-4] 아래의 EventHandler 를익명클래스 (anonymous class) 로변경하시오. [ 연습문제 ]/ch10/exercise10_4.java import java.awt.*; import java.awt.event.*; class Exercise10_4 { public static void main(string[] args) { Frame f = new Frame(); f.addwindowlistener(new EventHandler()); class EventHandler extends WindowAdapter { public void windowclosing(windowevent e) { e.getwindow().setvisible(false); e.getwindow().dispose(); System.exit(0); [ 정답 ] [ 연습문제 ]/ch10/exercise10_4_2.java import java.awt.*; import java.awt.event.*; class Exercise10_4_2 { public static void main(string[] args) { Frame f = new Frame(); f.addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent e) { e.getwindow().setvisible(false); e.getwindow().dispose(); System.exit(0); ); // main

338 338 Java 의정석定石 2 판 - 연습문제풀이 [10-5] 지역클래스에서외부클래스의인스턴스멤버와 static 멤버에모두접근할수있 지만, 지역변수는 final 이붙은상수만접근할수있는이유무엇인가? [ 정답 ] 메서드가수행을마쳐서지역변수가소멸된시점에도, 지역클래스의인스턴스가 소멸된지역변수를참조하려는경우가발생할수있기때문이다. [ 해설 ] 아직쓰레드를배우지않았지만, 쓰레드를사용해서상황을만들어보았다. [ 연습문제 ]/ch10/exercise10_5.java import java.awt.*; import java.awt.event.*; class Exercise10_5 { public static void main(string[] args) { final int VALUE = 10; // 외부클래스의지역변수 Thread t = new Thread(new Runnable() { // 익명클래스 ( 내부클래스 ) public void run() { for(int i=0; i < 10;i++) { // 10 번반복한다. try { Thread.sleep(1*1000); // 1 초간멈춘다. catch(interruptedexception e) { ); System.out.println(VALUE); // 외부클래스의지역변수를사용 // run() t.start(); // 쓰레드를시작한다. System.out.println("main() - 종료."); // main [ 실행결과 ] main() - 종료 실행결과를보면 main메서드가종료된후에도지역변수 VALUE의값을사용하고있다는것을알수있다. 지역변수는메서드가종료되면함께사라지지만, 상수의경우이미컨스턴트풀 (constant pool, 상수를따로모아서저장해놓는곳 ) 에저장되어있기때문에사용할수있는것이다.

339 Java 의정석定石 2 판 - 연습문제풀이 339 Chapter 11 컬렉션프레임웍과유용한클래스 Collection framework & Useful classes

340 340 Java 의정석定石 2 판 - 연습문제풀이 [ 연습문제 - 모범답안 ] [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); kyo.addall(list1); // list1 의모든요소를 kyo 에저장한다. kyo.retainall(list2); // list2 와 kyo 의공통요소만남기고삭제한다. cha.addall(list1); cha.removeall(list2); // cha 에서 list2 와공통된요소들을모두삭제한다. hap.addall(list1); // list1 의모든요소를 hap 에저장한다. hap.removeall(kyo); // hap 에서 kyo 와공통된모든요소를삭제한다. hap.addall(list2); // list2 의모든요소를 hap 에저장한다. 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]

341 Java 의정석定石 2 판 - 연습문제풀이 341 [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); // 중복요소들이제거되고순서유지안됨 2,6,3,7 TreeSet tset = new TreeSet(set); // 오름차순으로정렬된다. 2,3,6,7 Stack stack = new Stack(); // Stack 에넣었다꺼내면저장순서가반대가된다. stack.addall(tset); // TreeSet 의저장된모든요소를 stack 에담는다. while(!stack.empty()) System.out.println(stack.pop()); // stack 에저장된값을하나씩꺼낸다. [ 정답 ] [ 실행결과 ] [ 해설 ] 각컬렉션클래스들의특징을이해하고있는지확인하는문제이다. ArrayList는중복을허용하고저장순서를유지한다. HashSet은중복을허용하지않기때문에중복요소들은저장되지않는다. 그래서 HashSet에는 2,6,3,7이저장된다.(HashSet은저장순서를유지하지않는다는사실을잊지말자 ) HashSet set = new HashSet(list); // 중복요소들이제거되고순서유지안됨 2,6,3,7 TreeSet 은정렬해서저장하기때문에, 그리고따로정렬기준을주지않았기때문에숫자 의기본정렬인오름차순으로정렬한다. 그래서 2,3,6,7 이된다. TreeSet tset = new TreeSet(set); // 오름차순으로정렬된다. 2,3,6,7 Stack 은 FILO 구조 ( 처음넣은것이마지막에나오는구조 ) 로되어있기때문에 TreeSet 의 모든요소들을저장한다음다시꺼내면저장한순서와반대가된다. Stack stack = new Stack(); // Stack에넣었다꺼내면저장순서가반대가된다. stack.addall(tset); // TreeSet의저장된모든요소를 stack에담는다. while(!stack.empty()) System.out.println(stack.pop()); // stack 에저장된값을하나씩꺼낸다.

342 342 Java 의정석定石 2 판 - 연습문제풀이 [11-3] 다음중 ArrayList에서제일비용이많이드는작업은? 단, 작업도중에 ArrayList의크기변경이발생하지않는다고가정한다. a. 첫번째요소삭제 b. 마지막요소삭제 c. 마지막에새로운요소추가 d. 중간에새로운요소추가 [ 정답 ] a [ 해설 ] ArrayList는배열을기반으로하고, 배열은크기를변경할수없기때문에저장할공간이부족하면새로운배열을만들고내용을복사해야하므로많은비용이든다. 그리고배열의중간에새로운요소를추가또는삭제하는것은다른요소들을이동시켜야하기때문에배열을새로생성하는것보다는적지만역시비용이많이드는작업이다. 특히배열의첫번째요소를삭제하면, 빈자리를채우기위해나머지모든요소들을이동시켜야하기때문에많은비용이든다. 반면에 ArrayList의마지막에요소를추가또는삭제하는것은다른요소들을이동시킬필요가없기때문에아주적은비용만으로처리가가능하다.

343 Java 의정석定石 2 판 - 연습문제풀이 343 [11-4] LinkedList클래스는이름과달리실제로는이중원형연결리스트 (doubly circular linked list) 로구현되어있다. LinkedList인스턴스를생성하고 11개의요소를추가했을때, 이 11개의요소중접근시간 (access time) 이가장오래걸리는요소는몇번째요소인가? [ 정답 ] 여섯번째요소 (LinkedList 에서제일가운데위치한요소 ) [ 해설 ] LinkedList 는각요소가서로참조로연결되어있어서, n 번째요소에접근하기위 해서는첫번째요소부터순서대로각요소를거쳐야된다. 예를들어세번째요소에접 근하기위해서는첫번째요소에서두번째요소로, 두번째요소에서세번째요소로이 동해야한다. linkedlist 0x200 0x300 0x350 0x380 0x400 0x200 0x300 0x350 0x380 0x400 null 이런식이면 LinkedList 의마지막요소에접근하는것이시간이제일많이걸릴것같은 데, 그렇지않은이유는 LinkedList 가실제로는아래의그림과같은이중원형연결리스 트로되어있기때문이다. 0x200 0x300 0x350 0x380 0x400 0x200 0x300 0x350 0x380 0x400 0x200 0x400 0x200 0x300 0x350 0x [ 그림 11-11] 더블써큘러링크드리스트 ( 이중원형연결리스트, doubly circular linked list) 이중원형연결리스트는첫번째요소와마지막요소를연결해서 LinkedList의단점인접근성 (accessibility) 를향상시킨것이다. 이중원형연결리스트에서는마지막요소에접근하기위해서는첫번째요소에서한번만이동하면된다. 마지막요소에서첫번째요소에접근하기위해서도역시한번만이동하면된다. 이것은마치 Tv리모콘의첫번째채널에서채널을감소시키면마지막채널로이동하고, 마지막채널에서채널을증가시키면첫번째채널로이동하는것과같다고할수있다. 그래서 LinkedList의제일가운데있는요소가접근시간이가장길다는것을알수있다.

344 344 Java 의정석定石 2 판 - 연습문제풀이 [11-5] 다음에제시된 Student 클래스가 Comparable 인터페이스를구현하도록변경해서 이름 (name) 이기본정렬기준이되도록하시오. [ 연습문제 ]/ch11/exercise11_5.java import java.util.*; class Student implements Comparable { 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 +","+gettotal() +","+getaverage(); +","+eng +","+math public int compareto(object o) { if(o instanceof Student) { Student tmp = (Student)o; return name.compareto(tmp.name); // String 클래스의 compareto() 를호출 else { return -1; 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); // list 에저장된요소들을정렬한다.(compareTo() 호출 ) Iterator it = list.iterator();

345 Java 의정석定石 2 판 - 연습문제풀이 345 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 [ 해설 ] Collections.sort(List list) 를이용하면 ArrayList 에저장된요소들을쉽게정렬 할수있다. Collections.sort(list); // list 에저장된요소들을정렬한다.(compareTo() 호출 ) 그러나한가지조건이있다. ArrayList 에저장된요소들은모두 Comparable 인터페이스를 구현한것이어야한다는것이다. 이인터페이스에는 compareto 메서드가정의되어있는데, 이메서드는 Collections.sort(List list) 에의해호출되어정렬기준을제공하게된다. public interface Comparable { public int compareto(object o); // 주어진객체 (o) 와자신의멤버변수를비교 compareto 메서드는매개변수로주어진객체 (o) 를인스턴스자신과비교해서자신이작으면 음수를, 같으면 0 을, 크면양수를반환하도록구현되어야한다. 문제에서는학생의이름으로정렬될것을요구했으므로, 인스턴스변수 name 만비교하도 록 compareto 메서드를구현하면된다. 문자열 name 을어떻게비교하도록구현해야할까? 고민되겠지만, String 클래스에는이미문자열비교를위한 compareto 메서드를구현해놓 았고우리는단지그것을활용하기만하면된다. public final class String implements java.io.serializable, Comparable<String>, CharSequence {... class Student implements Comparable {... public int compareto(object o) { if(o instanceof Student) { Student tmp = (Student)o; return name.compareto(tmp.name); // String 클래스의 compareto() 를호출 else { return -1;

346 346 Java 의정석定石 2 판 - 연습문제풀이 참고로제네릭스 (generics) 를적용한예제를추가한다. 어떤차이가있는지잘비교해보 자. [ 연습문제 ]/ch11/exercise11_5_2.java import java.util.*; class Student implements Comparable<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 +","+gettotal() +","+getaverage(); +","+eng +","+math public int compareto(student s) { return name.compareto(s.name); class Exercise11_5_2 { public static void main(string[] args) { ArrayList<Student> list = new ArrayList<Student>(); 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());

347 Java 의정석定石 2 판 - 연습문제풀이 347 [11-6] 다음의코드는성적평균의범위별로학생수를세기위한것이다. TreeSet이학생들의평균을기준으로정렬하도록 compare(object o1, Object o2) 와평균점수의범위를주면해당범위에속한학생의수를반환하는 getgroupcount() 를완성하라. [Hint] TreeSet 의 subset(object from, Object to) 를사용하라. [ 연습문제 ]/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

348 348 Java 의정석定石 2 판 - 연습문제풀이 class Exercise11_6 { static int getgroupcount(treeset tset, int from, int to) { Student s1 = new Student("",0,0,from,from,from); Student s2 = new Student("",0,0,to,to,to); return tset.subset(s1,s2).size(); public static void main(string[] args) { TreeSet set = new TreeSet(new Comparator() { // 익명클래스 public int compare(object o1, Object o2) { if(o1 instanceof Student && o2 instanceof Student) { Student s1 = (Student)o1; Student s2 = (Student)o2; return (int)(s1.getaverage() - s2.getaverage()); ); return -1; 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

349 Java 의정석定石 2 판 - 연습문제풀이 349 [ 해설 ] 평균이지정된범위 (from~to) 에속하는학생의수를세는메서드 getgroupcount를작성하는문제이다. TreeSet은정렬된상태로요소 (element) 를저장하고, 검색과정렬특히부분정렬에유리하다. TreeSet클래스의 subset() 은지정된범위에속하는요소들이포함된 TreeSet을반환한다. 단, 끝범위의경계값 (to) 은결과에포함되지않는다.(from x < to) static int getgroupcount(treeset tset, int from, int to) { Student s1 = new Student("",0,0,from,from,from); Student s2 = new Student("",0,0,to,to,to); return tset.subset(s1,s2).size(); 왼쪽의코드는오른쪽의코드를한줄로간단히쓴것이다. 두코드를잘비교해보자. return tset.subset(s1,s2).size(); TreeSet tmp = tset.subset(s1,s2); return tmp.size(); // 크기를반환 compare(object o1, Object o2) 는주어진두객체를비교해서그결과를양수, 0, 음수 중의하나로반환한다. 그래서학생점수의평균을반환하는 getaverage() 로계산한다음 에 int 타입으로형변환해주었다. TreeSet set = new TreeSet(new Comparator() { // 익명클래스 public int compare(object o1, Object o2) { if(o1 instanceof Student && o2 instanceof Student) { Student s1 = (Student)o1; Student s2 = (Student)o2; return (int)(s1.getaverage() - s2.getaverage()); return -1; TreeSet은요소 (element) 를저장할때정렬해서저장하는데, 그정렬기준은어떤것일까? 이미배운것과같이 Comparable인터페이스를구현한클래스, 예를들면, Integer와같은 wrapper클래스나 String은정렬기준이내부에정의되어있다. 이처럼 Comparable인터페이스를구현해서내부적으로정렬기준을가지고있는클래스의객체들은 TreeSet에저장할때, 정렬기준을지정해주지않아도되지만, Comparable인터페이스를구현하지않은클래스 ( 정렬기준이없는클래스 ) 는생성자 TreeSet(Comparator c) 를이용해서반드시정렬기준을제공해주어야한다. 정렬기준이내부에정의되어있어도다른기준으로정렬하고싶을때이생성자를사용하면된다.

350 350 Java 의정석定石 2 판 - 연습문제풀이 Student 클래스는 Comparable 인터페이스를구현함으로써기본정렬기준을정의하였다. class Student implements Comparable { String name;... public int compareto(object o) { if(o instanceof Student) { Student tmp = (Student)o; return name.compareto(tmp.name); // 이름을기준으로정렬 ( 오름차순 ) // return tmp.name.compareto(name); // 이름을기준으로정렬 ( 내림차순 ) else { return -1; // public int comareto(object o) 이와달리평균을기준으로오름차순정렬을하기위해서는다른정렬기준을제공해야한 다. 그래서 Comparator 인터페이스를구현한클래스를작성하고이클래스의인스턴스를 생성자 TreeSet(Comparator c) 의매개변수로넘겨주었다. // 생성자 TreeSet(Comparator c) 를사용. TreeSet set = new TreeSet(new Comparator() { // 익명클래스 public int compare(object o1, Object o2) {... 매개변수를통해넘겨진정렬기준은 TreeSet 의멤버변수로정의된 comparator 에저장된 다. 그리고이 comparator 는 TreeSet 에요소를저장할때사용되는메서드 put() 에서저 장할위치를결정하기위해사용된다. [ 참고 ] 아래의코드는 TreeSet 의원본소스를이해하기쉽게재구성한것이므로원본과다르다. TreeSet set = new TreeSet(new Comparator(){...); // Comparator 를제공받는다. class TreeSet { private Comparator comparator = null; // Comparator( 정렬기준 ) 가정의되어있다. TreeSet(Comparator c) { this.comparator = c; // 생성자를통해제공받은정렬기준을 comparator 로설정 // TreeSet 에요소를저장하는데사용되는메서드. 저장할때정렬해서저장하므로 compare() 를호출 public Object put(object key, Object value) {... while(true) { int cmp = comparator.compare(key, t.key); // compare() 를호출한다

351 Java 의정석定石 2 판 - 연습문제풀이 351 [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) { if(o1 instanceof Student && o2 instanceof Student) { Student s1 = (Student)o1; Student s2 = (Student)o2; int result = s1.ban - s2.ban; if(result==0) { // 반이같으면, 번호를비교한다. return s1.no - s2.no;

352 352 Java 의정석定石 2 판 - 연습문제풀이 return result; return -1; class Exercise11_7 { 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)); 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 [ 해설 ] 조금어렵다고느꼈을지도모르겠다. 그러나답은쉽다. 반 (ban) 을뺄셈한결과가 0 이면 ( 반이같으면 ), 번호 (no) 를뺄셈해서반환하기만하면된다. public int compare(object o1, Object o2) { if(o1 instanceof Student && o2 instanceof Student) { Student s1 = (Student)o1; Student s2 = (Student)o2; int result = s1.ban - s2.ban; if(result==0) { // 반이같으면, 번호를비교한다. return s1.no - s2.no; return result; return -1;

353 Java 의정석定石 2 판 - 연습문제풀이 353 위의코드를삼항연산자를이용해서작성하면다음과같다. public int compare(object o1, Object o2) { if(o1 instanceof Student && o2 instanceof Student) { Student s1 = (Student)o1; Student s2 = (Student)o2; return s1.ban==s2.ban? s1.no - s2.no : s1.ban - s2.ban; return -1;

354 354 Java 의정석定石 2 판 - 연습문제풀이 [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) { 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

355 Java 의정석定石 2 판 - 연습문제풀이 355 +","+gettotal() +","+getaverage() +","+schoolrank // 새로추가 ; // 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(); // 1. 반복문을이용해서 list 에저장된 Student 객체를하나씩읽는다. for(int i=0;i < length; i++) { Student s = (Student)list.get(i); // 1.1 총점 (total) 이이전총점 (prevtotal) 과같으면 // 이전등수 (prevrank) 를등수 (schoolrank) 로한다. if(s.total==prevtotal) { s.schoolrank = prevrank; else { // 1.2 총점이서로다르면, // 등수 (schoolrank) 의값을알맞게계산해서저장한다. // 이전에동점자였다면, 그다음등수는동점자의수를고려해야한다. s.schoolrank = i + 1; // 1.3 현재총점과등수를이전총점 (prevtotal) 과이전등수 (prevrank) 에저장한다. prevrank = s.schoolrank; prevtotal = s.total; // for 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

356 356 Java 의정석定石 2 판 - 연습문제풀이 남궁성,1,1,90,70,80,240,80.0,3 이자바,2,1,70,90,70,230,76.7,5 [ 해설 ] 등수를계산하기위해서는먼저총점기준의내림차순으로정렬되어있어야한다. 그리고바로전데이터와의비교를위해이전등수 (prevrank), 이전총점 (prevtotal) 을 저장하는변수를선언했다. public static void calculateschoolrank(list list) { Collections.sort(list); // 먼저 list 를총점기준내림차순으로정렬한다. int prevrank = -1; // 이전전교등수 int prevtotal = -1; // 이전총점 int length = list.size();... 반복문을이용해서 list 에저장된학생정보를하나씩가져와이전총점 (prevtotal) 과비 교한다. 현재데이터의총점 (s.total) 과이전총점 (prevtotal) 이같으면, 등수 (s.school Rank) 를이전등수 (prevrank) 로저장한다. if(s.total==prevtotal) { // 총점이이전총점과같으면, s.schoolrank = prevrank; // 등수를이전등수와같은값으로한다. else { s.schoolrank = i + 1; 다음은실행과정에서변수값의변화를표로나타낸것이다. schoolrank 가 i+1 의값으로 저장되지만, s.total 과 prevtotal 의값이같을때는 i+1 의값이아닌 prevrank 의값으로 저장되는것을알수있다. s.total prevtotal prevrank schoolrank i

357 Java 의정석定石 2 판 - 연습문제풀이 357 [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 int int total; schoolrank; // 전교등수 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

358 358 Java 의정석定石 2 판 - 연습문제풀이 +","+gettotal() +","+getaverage() +","+schoolrank +","+classrank // 새로추가 ; // class Student class ClassTotalComparator implements Comparator { public int compare(object o1, Object o2) { Student s1 = (Student)o1; Student s2 = (Student)o2; int result = s1.ban - s2.ban; // 반 (ban) 기준정렬 ( 오름차순 ) if(result==0) result = s2.total - s1.total; // 총점 (total) 기준정렬 ( 내림차순 ) return result; 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(); for(int i=0, n=0; i < length; i++, n++) { // 1. 반복문을이용해서 list 에저장된 Student 객체를하나씩읽는다. Student s = (Student)list.get(i); // 1.1 반이달라지면,(ban 와 prevban 가다르면 ) // 이전등수 (prevrank) 와이전총점 (prevtotal) 을초기화한다. if(s.ban!=prevban) { prevrank = -1; prevtotal = -1; n = 0; // 1.2 총점 (total) 이이전총점 (prevtotal) 과같으면 // 이전등수 (prevrank) 를등수 (schoolrank) 로한다. if(s.total==prevtotal) { s.classrank = prevrank; else { // 1.3 총점이서로다르면, // 등수 (schoolrank) 의값을알맞게계산해서저장한다. // 이전에동점자였다면, 그다음등수는동점자의수를고려해야한다. s.classrank = n + 1; // 1.4 현재반과총점과등수를이전반 (prevban), // 이전총점 (prevtotal), 이전등수 (prevrank) 에저장한다.

359 Java 의정석定石 2 판 - 연습문제풀이 359 prevban = s.ban; prevrank = s.classrank; prevtotal = s.total; // public static void calculateclassrank(list list) { public static void calculateschoolrank(list list) { Collections.sort(list); // 먼저 list 를총점기준내림차순으로정렬한다. int prevrank = -1; // 이전전교등수 int prevtotal = -1; // 이전총점 int length = list.size(); for(int i=0;i < length; i++) { Student s = (Student)list.get(i); if(s.total==prevtotal) { s.schoolrank = prevrank; else { s.schoolrank = i + 1; prevrank = s.schoolrank; prevtotal = s.total; // for 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); 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-8 을보다발전시킨예제이다. 문제 11-8 과달리반별오름차순과총점별내 림차순, 2 가지기준으로정렬한다음, 반이달라질때마다이전총점과이전등수, 그리 고등수 (n) 를초기화해준다는것만다르다.

360 360 Java 의정석定石 2 판 - 연습문제풀이 등수를계산하기위해서는먼저반별오름차순과총점별내림차순, 2 가지기준으로정렬 한다. 그래서 ClassTotalComparator 는반을기준으로비교하고, 반이같으면총점을비교 해서정렬하도록정의하고, 반별총점을계산하는 calculateclassrank 메서드내의 sort() 에 ClassTotalComparator 인스턴스를정렬기준으로제공한다. class ClassTotalComparator implements Comparator { public int compare(object o1, Object o2) { Student s1 = (Student)o1; Student s2 = (Student)o2; int result = s1.ban - s2.ban; // 반 (ban) 기준정렬 ( 오름차순 ) if(result==0) // 반이같으면, 총점을비교한다. result = s2.total - s1.total; // 총점 (total) 기준정렬 ( 내림차순 ) return result; // return {s1.ban==s2.ban? s1.ban-s2.ban : s2.total-s1.total; class Exercise11_9 { public static void calculateclassrank(list list) { // 먼저반별총점기준내림차순으로정렬한다. Collections.sort(list, new ClassTotalComparator()); 그다음에는문제 11-8 에서와같이반복문을이용해서정렬된데이터를한줄씩읽어서 등수를계산한다. 문제 11-8 과다른점은, 반이달라지면다시 1 등부터시작해서등수를 매겨야하므로이전총점 (prevtotal), 이전등수 (prevrank), 등수 (n) 을초기화한다는것이 다. for(int i=0, n=0; i < length; i++, n++) { Student s = (Student)list.get(i); // 1.1 반이달라지면,(ban 와 prevban 가다르면 ) // 이전등수 (prevrank) 와이전총점 (prevtotal) 을초기화한다. if(s.ban!=prevban) { prevrank = -1; prevtotal = -1; n = 0; if(s.total==prevtotal) { s.classrank = prevrank; else { s.classrank = n + 1; prevban = s.ban; prevrank = s.classrank; prevtotal = s.total;

361 Java 의정석定石 2 판 - 연습문제풀이 361 다음은실행과정에서변수값의변화를표로나타낸것이다. 전과는달리등수를매길때 반복문의카운터 i 대신 n 을사용하였으며, 현재반 (s.ban) 과이전반 (prevban) 의값이다 르면, 이전총점 (prevtotal), 이전등수 (prevrank), 등수 (n) 을초기화한다는것을확인하 다. s.total s.ban prevban prevtotal prevrank classrank i n n

362 362 Java 의정석定石 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 [ 정답 ] HashSet 은중복을허용하지않고순서를유지하지않기때문에발생하는문제이 다. 아무리임의의순서로저장을해도, 해싱 (hashing) 알고리즘의특성상한숫자가고 정된위치에저장되기때문이다. 이문제를해결하기위해서는저장순서를유지하는 List 인터페이스를구현한컬렉션클 래스를사용하도록변경해야한다. [ 연습문제 ]/ch11/exercise11_10_2.java import java.util.*; class Exercise11_10_2 { 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+""); ArrayList list = new ArrayList(set); Collections.shuffle(list);

363 Java 의정석定石 2 판 - 연습문제풀이 363 Iterator it = list.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 [ 해설 ] 중복된값을허용하지않는다는특성을이용해서 HashSet 에서로다른임의의값 을저장하는것까지는좋았는데, 해싱알고리즘의특성상같은값은같은자리에저장되기 때문에빙고판의숫자들이잘섞이지않는다는문제가발생하였다. 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+""); 그래서저장순서를유지하는 ArrayList 에 HashSet 의데이터를옮겨담은다음, Collections.shuffle() 을이용해서저장된데이터들의순서를뒤섞었다. ArrayList list = new ArrayList(set); // set 과같은데이터를가진 ArrayList 를생성 Collections.shuffle(list); // list 에저장된데이터의순서를섞는다. Iterator it = list.iterator(); 이처럼대부분의컬렉션클래스들은다른컬렉션으로데이터를쉽게옮길수있게설계되 어있다. 매개변수의타입이 Collection 인터페이스이므로 Collection 인터페이스의자손인 List 인터페이스와 Set 인터페이스를구현한모든클래스의인스턴스가매개변수로가능하 다. ArrayList(Collection<? extends E> c) LinkedList(Collection<? extends E> c) Vector(Collection<? extends E> c) HashSet(Collection<? extends E> c) TreeSet(Collection<? extends E> c) LinkedHashSet(Collection<? extends E> c)

364 364 Java 의정석定石 2 판 - 연습문제풀이 [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":""); public int hashcode() { return tostring().hashcode(); // String 클래스의 hashcode() 를호출한다. 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]

365 Java 의정석定石 2 판 - 연습문제풀이 365 [ 해설 ] hashcode() 의기본구현은클래스이름과메모리주소와관련된정수값으로이루어져있기때문에, 두객체의 hashcode() 값은절대로같을수가없다.( 서로다른두객체가같은메모리번지에존재할수없기때문에 ) 대부분의경우서로다른객체라도클래스의인스턴스변수값이같으면, 예를들어 SutdaCar의경우 num과 iskwang의값이같으면같은객체로인식해야한다. 즉, equals() 의결과가 true이어야하고, 두객체의해시코드 (hashcode() 를호출한결과 ) 가같아야한다. 그래서 equals() 와 hashcode() 를적절히오버라이딩해줘야한다. 때로는 equals() 만오버라이딩해줘도되지만, 해시알고리즘을사용하는 HashSet에담을때는반드시 hashcode() 도오버라이딩해줘야한다. 이문제의실행결과를보면중복을허용하지않는 HashSet 을사용하고도 [1K, 3K, 3K] 와 같은결과를얻는다. 그이유는 hashcode() 를오버라이딩하지않았기때문이다. 그러나 hashcode() 를오버라이딩한후에는 [3K, 1K] 와같이중복이제거된결과를얻을 수있다. hashcode() 를오버라이딩하라고하면어떻게해야할지막막할것이다. 그러나걱정하지 말자. 이미다구현되어있으니그냥가져다쓰기만하면된다. String 클래스의 hashcode() 는객체의주소가아닌문자열의내용을기반으로해시코드를 생성하므로문자열의내용이같으면항상같은값의해시코드를반환한다. SutdaCard 의 tostring() 이 num 과 iskwang 의값으로문자열을만들어반환하기때문에, tostring() 을호출한결과에 hashcode() 를호출함으로써 SutdaCard 의 hashcode() 를간단 히구현할수있었다. public String tostring() { return num + ( iskwang? "K":""); public int hashcode() { return tostring().hashcode(); // String 클래스의 hashcode() 를호출한다. 인스턴스변수들의값을결합한문자열을만들고, 그문자열에대해 hashcode() 를호출하 는방법은쉬우면서도효과적이다.

366 366 Java 의정석定石 2 판 - 연습문제풀이 [11-12] 다음은섯다게임에서카드의순위를결정하는등급목록 ( 족보 ) 이다. HashMap에등급과점수를저장하는 registerjokbo() 와게임참가자의점수를계산해서반환하는 getpoint() 를완성하시오. [ 참고 ] 섯다게임은두장의카드의숫자를더한값을 10으로나눈나머지가높은쪽이이기는게임이다. 그외에도특정숫자로구성된카드로이루어진등급 ( 족보 ) 이있어서높은등급의카드가이긴다. 카드1 카드2 점수 K K 카드1 카드2 점수 [ 연습문제 ]/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); registerjokbo(); // 족보를등록한다.

367 Java 의정석定石 2 판 - 연습문제풀이 367 void registerjokbo() { jokbo.put("kk", 4000); jokbo.put("1010",3100); jokbo.put("99", 3090); jokbo.put("88", 3080); jokbo.put("77", 3070); jokbo.put("66", 3060); jokbo.put("55", 3050); jokbo.put("44", 3040); jokbo.put("33", 3030); jokbo.put("22", 3020); jokbo.put("11", 3010); jokbo.put("12", 2060); jokbo.put("21", 2060); jokbo.put("14", 2050); jokbo.put("41", 2050); jokbo.put("19", 2040); jokbo.put("91", 2040); jokbo.put("110", 2030); jokbo.put("101", 2030); jokbo.put("104", 2020); 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; // Integer result = new Integer(0); // 1. 카드두장이모두광이면, jokbo 에서키를 "KK" 로해서점수를조회한다. if(c1.iskwang && c2.iskwang) { result = (Integer)jokbo.get("KK"); else { // 2. 두카드의숫자 (num) 로 jokbo 에서등급을조회한다. result = (Integer)jokbo.get(""+c1.num+c2.num); // 3. 해당하는등급이없으면, 아래의공식으로점수를계산한다. // (c1.num + c2.num) % if(result==null) { result = new Integer((c1.num + c2.num) % ); // 4. Player 의점수 (point) 에계산한값을저장한다. p.point = result.intvalue(); return result.intvalue();

368 368 Java 의정석定石 2 판 - 연습문제풀이 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 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() {

369 Java 의정석定石 2 판 - 연습문제풀이 369 return num + ( iskwang? "K":""); [ 실행결과 ] [ 타짜 ]5, [ 고수 ]1,1K 3010 [ 해설 ] registerjokbo() 는단순히 put() 을호출해서 HashMap에값을저장하는것이므로설명하지않아도이해하는데어려움이없을것같다. 굳이설명한다면, put(object key, Object value) 에대한것인데, 이메서드의매개변수타입을보면 Object라서오른쪽의코드와같이 wrapper클래스를써야하는것이원칙이다. 그러나 JDK1.5에서부터오토박싱기능이추가되어컴파일러가기본형 (primitive type) 을자동적으로 wrapper클래스로변환해준다. 그래서왼쪽과같은코드가가능한것이다. 왼쪽과같이코드를작성해도컴파일러가오른쪽과같은코드로자동변환해주는것이다. jokbo.put("kk", 4000); jokbo.put("kk", new Integer(4000); getpoint(player p) 는게임참가자 (Player) 의카드를평가해서점수를반환하는메서드인 데, 게임참가자가가진카드의숫자를족보 (jokbo) 에서찾아서해당점수를가져온다. 카드의숫자를문자열로만들어서 get(object key) 를호출하면, 족보에해당하는지알 수있다. get 메서드의호출결과가 null 이면족보에없다는것을의미한다. 족보에없는 숫자조합이라면, 두숫자를더한다음 10 으로나눈나머지에 1000 을더해서점수를계산 한다. // 1. 카드두장이모두광이면, jokbo 에서키를 "KK" 로해서점수를조회한다. if(c1.iskwang && c2.iskwang) { result = (Integer)jokbo.get("KK"); else { // 2. 두카드의숫자 (num) 로 jokbo 에서등급을조회한다. result = (Integer)jokbo.get(""+c1.num+c2.num); // 3. 해당하는등급이없으면, 아래의공식으로점수를계산한다. // (c1.num + c2.num) % if(result==null) { result = new Integer((c1.num + c2.num) % ); // 4. Player 의점수 (point) 에계산한값을저장한다. p.point = result.intvalue(); // Integer 를 int 로변환해서반환한다.

370 370 Java 의정석定石 2 판 - 연습문제풀이 [11-13] 다음코드는문제 를발전시킨것으로각 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) { if(o1 instanceof Player && o2 instanceof Player) { Player p1 = (Player)o1; Player p2 = (Player)o2; return p2.point - p1.point; // 점수기준의내림차순으로정렬 ); return -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);

371 Java 의정석定石 2 판 - 연습문제풀이 371 cards[i] = new SutdaCard(num,isKwang); 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) % ); 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;

372 372 Java 의정석定石 2 판 - 연습문제풀이 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, [ 물주 ]1, [ 중수 ]10, [ 하수 ]9, 위는 [ 중수 ]10,4 입니다.

373 Java 의정석定石 2 판 - 연습문제풀이 373 [11-14] Calendar 클래스와 SimpleDateFormat 클래스를이용해서 2010 년의매월두번째 일요일의날짜를출력하시오. [ 실행결과 ] 은 2 번째일요일입니다 은 2 번째일요일입니다 은 2 번째일요일입니다 은 2 번째일요일입니다 은 2 번째일요일입니다 은 2 번째일요일입니다 은 2 번째일요일입니다 은 2 번째일요일입니다 은 2 번째일요일입니다 은 2 번째일요일입니다 은 2 번째일요일입니다 은 2 번째일요일입니다. [ 정답 ] [ 연습문제 ]/ch11/exercise11_14.java import java.util.*; import java.text.*; class Exercise11_14 { public static void main(string[] args) { Calendar cal = Calendar.getInstance(); cal.set(2010,0,1); // cal 의날짜를 2010 년 1 월 1 일로설정한다. for(int i=0; i < 12;i++) { int weekday = cal.get(calendar.day_of_week); // 1 일의요일을구한다. // 두번째일요일은 1 일의요일에따라달라진다. // 1 일이일요일인경우에는두번째일요일은 8 일이고, // 1 일이다른요일일때는 16 에서 1 일의요일 (weekday) 을빼면알수있다. int secondsunday = (weekday==1)? 8 : 16 - weekday; // 두번째일요일 (secondsunday) 로 cal 의날짜 (DAY_OF_MONTH) 를바꾼다. cal.set(calendar.day_of_month, secondsunday); Date d = cal.gettime(); // Calendar 를 Date 로변환한다. System.out.println(new SimpleDateFormat("yyyy-MM-dd 은 F 번째 E 요일입니다.").format(d)); // 날짜를다음달 1 일로변경한다. cal.add(calendar.month, 1); cal.set(calendar.day_of_month,1);

374 374 Java 의정석定石 2 판 - 연습문제풀이 [ 해설 ] 매월두번째일요일 (secondsunday) 을구하려면, 매월 1일이무슨요일인지알아내야한다. 만일 1일이일요일이라면 2번째일요일은 8일이된다. 1일이월요일이라면 2 번째일요일은 14일이된다. 1일이일요일인경우를제외하고는 1일의요일 (weekday) 과 2 번째일요일의날짜를더하면일정한값 (16) 이라는것을알수있다. 즉, 16에서 1일의요일 (weekday) 을빼면 2번째일요일이며칠인지알수있는것이다.(1일이일요일인경우에는 9에서 1을뺀 8이된다.) int secondsunday = (weekday==1)? 8 : 16 - weekday; 1일의요일 weekday 2번째일요일 weekday+2번째일요일 일 1 8일 9 월 2 14일 16 화 3 13일 16 수 4 12일 16 목 5 11일 16 금 6 10일 16 토 7 9일 16 이제두번째일요일의날짜 (secondsunday) 를알아냈으니, set() 를사용해서 cal 의날짜 (DAY_OF_MONTH) 를두번째일요일의날짜로변경한다. SimpleDateFormat 클래스의 format 메서드는매개변수로 Date 타입을받기때문에 cal.gettime() 을호출해서 Calendar 를 Date 로변환해야한다. // 두번째일요일 (secondsunday) 로 cal 의날짜 (DAY_OF_MONTH) 를바꾼다. cal.set(calendar.day_of_month, secondsunday); Date d = cal.gettime(); // Calendar 를 Date 로변환한다. System.out.println(new SimpleDateFormat("yyyy-MM-dd 은 F 번째 E 요일입니다.").format(d));

375 Java 의정석定石 2 판 - 연습문제풀이 375 [11-15] 어떤회사의월급날이매월 21 일이다. 두날짜사이에월급날이몇번있는지 계산해서반환하는메서드를작성하고테스트하시오. [ 연습문제 ]/ch11/exercise11_15.java import java.util.*; import java.text.*; class Exercise11_15 { static int paycheckcount(calendar from, Calendar to) { // 1. from 또는 to 가 null 이면 0 을반환한다. if(from==null to==null) return 0; // 2. from 와 to 가같고날짜가 21 일이면 1 을반환한다. if(from.equals(to) && from.get(calendar.day_of_month)==21) { return 1; int fromyear = from.get(calendar.year); int frommon = from.get(calendar.month); int fromday = from.get(calendar.day_of_month); int toyear = to.get(calendar.year); int tomon = to.get(calendar.month); int today = to.get(calendar.day_of_month); // 3. to 와 from 이몇개월차이인지계산해서변수 mondiff 에담는다. int mondiff = (toyear * 12 + tomon) - (fromyear * 12 + frommon); // 4. mondiff 가음수이면 0 을반환한다. if(mondiff < 0) return 0; // 5. 만일 from 의일 (DAY_OF_MONTH) 이 21 일이거나이전이고 // to 의일 (DAY_OF_MONTH) 이 21 일이거나이후이면 mondiff 의값을 1 증가시킨다. if(fromday <= 21 && today >= 21) mondiff++; // 6. 만일 from 의일 (DAY_OF_MONTH) 이 21 일이후고 // to 의일 (DAY_OF_MONTH) 이 21 일이전이면 mondiff 의값을 1 감소시킨다. if(fromday > 21 && today < 21) mondiff--; return mondiff; static void printresult(calendar from, Calendar to) { Date fromdate = from.gettime(); Date todate = to.gettime(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); System.out.print(sdf.format(fromDate)+" ~ " +sdf.format(todate)+":"); System.out.println(paycheckCount(from, to)); public static void main(string[] args) { Calendar fromcal = Calendar.getInstance();

376 376 Java 의정석定石 2 판 - 연습문제풀이 Calendar tocal = Calendar.getInstance(); fromcal.set(2010,0,1); tocal.set(2010,0,1); printresult(fromcal, tocal); fromcal.set(2010,0,21); tocal.set(2010,0,21); printresult(fromcal, tocal); fromcal.set(2010,0,1); tocal.set(2010,2,1); printresult(fromcal, tocal); fromcal.set(2010,0,1); tocal.set(2010,2,23); printresult(fromcal, tocal); fromcal.set(2010,0,23); tocal.set(2010,2,21); printresult(fromcal, tocal); fromcal.set(2011,0,22); tocal.set(2010,2,21); printresult(fromcal, tocal); [ 실행결과 ] ~ : ~ : ~ : ~ : ~ : ~ :0 [ 해설 ] 지정된날짜범위에 21 일이몇번포함되는지계산하려면, 범위의시작일과마지 막일간의개월수차이를구한다음에시작일또는마지막일이 21 일인지아닌지확인해 서둘다 21 일이면 1 을더하고둘다 21 일이아니면 1 을뺀다. [ 참고 ] 1~5 의범위의정수가몇개인지알려면범위의끝값인 5 에서시작값인 1 을뺀다음에 1 과 5 가범위에 포함된다면 1 을더해서 5-1+1=5 가된다.(1,2,3,4,5) 그러나 1 과 5 가범위에포함되지않는다면 1 을빼서 5-1-1=3 이된다.(2,3,4) 어느한쪽경계값만범위에포함된다면두경계값의차이 (5-1=4) 가범위에포함된정수의개수이 다. // 3. to 와 from 이몇개월차이인지계산해서변수 mondiff 에담는다. int mondiff = (toyear * 12 + tomon) - (fromyear * 12 + frommon); // 4. mondiff 가음수이면 0 을반환한다. if(mondiff < 0) return 0; // 5. 만일 from 의일 (DAY_OF_MONTH) 이 21 일이거나이전이고 // to 의일 (DAY_OF_MONTH) 이 21 일이거나이후이면 mondiff 의값을 1 증가시킨다. if(fromday <= 21 && today >= 21) mondiff++; // 6. 만일 from 의일 (DAY_OF_MONTH) 이 21 일이후고 // to 의일 (DAY_OF_MONTH) 이 21 일이전이면 mondiff 의값을 1 감소시킨다. if(fromday > 21 && today < 21) mondiff--;

377 Java 의정석定石 2 판 - 연습문제풀이 377 [11-16] 문자열 123,456,789.5 를소수점첫번째자리에서반올림하고, 그값을만 단위마다콤마 (,) 로구분해서출력하시오. [ 실행결과 ] data:123,456,789.5 반올림 : 만단위 :1,2345,6790 [ 정답 ] [ 연습문제 ]/ch11/exercise11_16.java import java.text.*; class Exercise11_16 { public static void main(string[] args) { String data = "123,456,789.5"; DecimalFormat df = new DecimalFormat("#,###.##"); // 변환할문자열의형식을지정 DecimalFormat df2 = new DecimalFormat("#,####"); try { Number num = df.parse(data); double d = num.doublevalue(); System.out.println("data:"+data); System.out.println(" 반올림 :"+Math.round(d)); System.out.println(" 만단위 :"+df2.format(d)); catch(exception e) { // main [ 해설 ] 특정형식의문자열을숫자로변환하려면 DecimalFormat 클래스에형식을정의해준 다음에 parse() 를이용하면된다. parse() 의반환타입이 Number 이기때문에, Number 에서 다시 doublevalue() 를호출해서 double 타입의값을얻어야한다. DecimalFormat df = new DecimalFormat("#,###.##"); // 변환할문자열의형식을지정 Number num = df.parse(data); // 문자열 (data) 에서숫자를뽑아내서 Number 를반환한다. double d = num.doublevalue(); // Number 에서숫자를 double 형태로뽑아낸다. format() 은주어진값을정해진형식에맞게변환한다음에문자열 (StringBuffer) 로반환 한다. DecimalFormat df2 = new DecimalFormat("#,####"); System.out.println(" 만단위 :"+df2.format(d));

378 378 Java 의정석定石 2 판 - 연습문제풀이 [11-17] 화면으로부터날짜를 2007/05/11 의형태로입력받아서무슨요일인지출력하는프로그램을작성하시오. 단, 입력된날짜의형식이잘못된경우메세지를보여주고다시입력받아야한다. [ 실행결과 ] 날짜를 yyyy/mm/dd의형태로입력해주세요.( 입력예 :2007/05/11) >> 날짜를 yyyy/mm/dd의형태로입력해주세요.( 입력예 :2007/05/11) >>2009/12/12 입력하신날짜는토요일입니다. [ 정답 ] [ 연습문제 ]/ch11/exercise11_16.java import java.util.*; import java.text.*; class Exercise11_17 { public static void main(string[] args) { String pattern = "yyyy/mm/dd"; String pattern2 = " 입력하신날짜는 E 요일입니다."; // 'E' 는월 ~ 토중의하나가된다. DateFormat df = new SimpleDateFormat(pattern); DateFormat df2 = new SimpleDateFormat(pattern2); Scanner s = new Scanner(System.in); Date indate = null; do { System.out.println(" 날짜를 " + pattern + " 의형태로입력해주세요.( 입력예 :2007/05/11)"); try { System.out.print(">>"); indate = df.parse(s.nextline()); // 입력받은날짜를 Date 로변환한다. break; // parse() 에서예외가발생하면이문장은수행되지않는다. catch(exception e) { while(true); System.out.println(df2.format(inDate)); // main [ 해설 ] SimpleDateFormat은날짜를지정된형식으로출력하거나문자열을지정된형식으로변환또는유효성검사에사용할수있다. 이문제에서는입력된날짜가지정된형식에맞는지검사하고, 변환하는역할을한다. Scanner를이용해서화면으로부터날짜를입력받고, 입력받은날짜 ( 문자열 ) 가지정된형식과다르면 parse() 에서 ParseException이발생한다.

379 Java 의정석定石 2 판 - 연습문제풀이 379 do { System.out.println(" 날짜를 " + pattern + " 의형태로입력해주세요.( 입력예 :2007/05/11)"); try { System.out.print(">>"); indate = df.parse(s.nextline()); // ParseException이발생할수있다. break; // parse() 에서예외가발생하면이문장은수행되지않는다. catch(exception e) { while(true); parse() 에서예외가발생하면 break 문이수행되지않기때문에예외가발생하지않을때 까지, 즉지정된형식에맞게날짜가입력될때까지반복하게된다.

380 380 Java 의정석定石 2 판 - 연습문제풀이 [11-18] 다음은화면으로부터전화번호의일부를입력받아일치하는전화번호를주어진 문자열배열에서찾아서출력하는프로그램이다. 알맞은코드를넣어프로그램을완성하 시오. [Hint] Pattern, Matcher 클래스를사용하라. [ 연습문제 ]/ch11/exercise11_18.java import java.util.*; import java.util.regex.*; class Exercise11_18 { public static void main(string[] args) { String[] phonenumarr = { " ", " ", " ", " " ; ArrayList list = new ArrayList(); // 검색결과를담을 ArrayList Scanner s = new Scanner(System.in); while(true) { System.out.print(">>"); String input = s.nextline().trim(); // trim() 으로입력내용에서공백을제거 if(input.equals("")) { continue; else if(input.equalsignorecase("q")) { System.exit(0); String pattern = ".*"+input+".*"; // input 을포함하는모든문자열 Pattern p = Pattern.compile(pattern); for(int i=0; i< phonenumarr.length;i++) { String phonenum = phonenumarr[i]; String tmp = phonenum.replace("-",""); // phonenum 에서 '-' 를제거 Matcher m = p.matcher(tmp); if(m.find()) { // 패턴과일치하면, list 에 phonenum 을추가한다. list.add(phonenum); if(list.size()>0) { System.out.println(list); list.clear(); else { System.out.println(" 일치하는번호가없습니다."); // main

381 Java 의정석定石 2 판 - 연습문제풀이 381 [ 실행결과 ] >> >> >>asdf 일치하는번호가없습니다. >> >> >>0 [ , , , ] >>234 [ , ] >>7890 [ , ] >>q [ 해설 ] 입력받은문자열을포함하는모든문자열을의미하는패턴은다음과같다. String pattern = ".*"+input+".*"; // input 을포함하는모든문자열 Pattern p = Pattern.compile(pattern); 패턴을정의하였으니, 이제는반복문으로배열 phonenumarr 의전화번호를하나씩읽어서 패턴과일치하는지확인한다. 이때주의해야할것은사용자가 "234" 를입력했을때 " " 과 " " 이모두검색될수있도록전화번호에서 '-' 를제거한 후에패턴과일치하는지확인해야한다는것이다. for(int i=0; i< phonenumarr.length;i++) { String phonenum = phonenumarr[i]; String tmp = phonenum.replace("-",""); // phonenum 에서 '-' 를제거 Matcher m = p.matcher(tmp); if(m.find()) { // 패턴과일치하는부분을찾으면, list 에 phonenum 을추가한다. list.add(phonenum);

382 382 Java 의정석定石 2 판 - 연습문제풀이 [11-19] 다음과같이정의된메서드를작성하고테스트하시오. 메서드명 : getdaydiff 기능 : yyyymmdd형식의두문자열을넘겨받으면두날짜의차이를일 (day) 단위로반환한다. 단, 첫번째날짜빼기두번째날짜의결과를반환한다. 만일주어진문자열이유효하지않으면 0을반환한다. 반환타입 : int 매개변수 : String yyyymmdd1 - 시작날짜 String yyyymmdd2 - 끝날짜 [ 연습문제 ]/ch11/exercise11_19.java import java.util.*; class Exercise11_19 { static int getdaydiff(string yyyymmdd1, String yyyymmdd2) { int diff = 0; try { int year1 = Integer.parseInt(yyyymmdd1.substring(0,4)); int month1 = Integer.parseInt(yyyymmdd1.substring(4,6)) - 1; int day1 = Integer.parseInt(yyyymmdd1.substring(6,8)); int year2 = Integer.parseInt(yyyymmdd2.substring(0,4)); int month2 = Integer.parseInt(yyyymmdd2.substring(4,6)) - 1; int day2 = Integer.parseInt(yyyymmdd2.substring(6,8)); Calendar date1 = Calendar.getInstance(); Calendar date2 = Calendar.getInstance(); date1.set(year1, month1, day1); date2.set(year2, month2, day2); diff = (int)((date1.gettimeinmillis()-date2.gettimeinmillis()) /(24*60*60*1000)); catch(exception e) { diff = 0; // substring(), parseint() 에서예외가발생하면 0 을반환한다. return diff; public static void main(string[] args){ System.out.println(getDayDiff(" "," ")); System.out.println(getDayDiff(" "," ")); System.out.println(getDayDiff(" ","200103")); [ 실행결과 ] 2 0 0

383 Java 의정석定石 2 판 - 연습문제풀이 383 [ 해설 ] 넘겨받은문자열을 substring() 으로잘라서년, 월, 일을각각구한다음, 이값 들을가지고 Calendar 의년월일을설정한다. [ 참고 ] Calendar 클래스의 month 값은 1 이아닌 0 부터시작하기때문에 1 을빼주어야한다. int year1 = Integer.parseInt(yyyymmdd1.substring(0,4)); int month1 = Integer.parseInt(yyyymmdd1.substring(4,6)) - 1; int day1 = Integer.parseInt(yyyymmdd1.substring(6,8)); Calendar date1 = Calendar.getInstance(); date1.set(year1, month1, day1); Calendar 의 gettimeinmillis() 는날짜를천분의일초단위로변환해서반환한다. gettime Millis() 를이용해서두날짜를천분의일초로변환해서차이를구한다음에일 (day) 단 위로변환하면두날짜의날 (day) 차이를구할수있다. 천분의일초단위를일단위로바꾸려면 24*60*60*1000 로나눠주면된다.(1 일 = 24 시간 = 24*60 분 = 24*60*60 초 = 24*60*60*1000 밀리세컨드 ) date1.set(year1, month1, day1); date2.set(year2, month2, day2); diff = (int)((date1.gettimeinmillis()-date2.gettimeinmillis()) /(24*60*60*1000));

384 384 Java 의정석定石 2 판 - 연습문제풀이 [11-20] 다음은성적처리프로그램의일부이다. Scanner 클래스를이용해서화면으로부 터데이터를입력하고보여주는기능을완성하시오. [ 연습문제 ]/ch11/exercise11_20.java import java.io.*; import java.util.*; class Exercise11_20 { 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; do { try { menu = Integer.parseInt(s.nextLine().trim()); if(1 <= menu && menu <= 3) { break; else { throw new Exception(); catch(exception e) { System.out.println(" 메뉴를잘못선택하셨습니다. 다시입력해주세요.");

385 Java 의정석定石 2 판 - 연습문제풀이 385 System.out.print(" 원하는메뉴를선택하세요.(1~3) : "); while(true); return menu; // public static int displaymenu(){ // 데이터를입력받는메서드 static void inputrecord() { System.out.println("1. 학생성적입력하기 "); System.out.println(" 이름, 반, 번호, 국어성적, 영어성적, 수학성적 ' 의순서로공백없이입력하세요."); System.out.println(" 입력을마치려면 q 를입력하세요. 메인화면으로돌아갑니다."); while(true) { System.out.print(">>"); try { String input = s.nextline().trim(); if(!input.equalsignorecase("q")) { // Scanner 를이용해서화면으로부터데이터를입력받는다.(',' 를구분자로 ) Scanner s2 = new Scanner(input).useDelimiter(","); // 입력받은값으로 Student 인스턴스를생성하고 record 에추가한다. record.add(new Student(s2.next(), s2.nextint(), s2.nextint(), s2.nextint(), s2.nextint(), s2.nextint())); System.out.println(" 잘입력되었습니다. 입력을마치려면 q 를입력하세요."); else { // 입력받은값이 q 또는 Q 이면메서드를종료한다. return; catch(exception e) { // 입력받은데이터에서예외가발생하면, " 입력오류입니다." 를보여주고다시입력받는다. System.out.println(" 입력오류입니다. 이름, 반, 번호, 국어성적, 영어성적, 수학성적 ' 의순서로입력하세요."); // 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;

386 386 Java 의정석定石 2 판 - 연습문제풀이 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() { 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;

387 Java 의정석定石 2 판 - 연습문제풀이 387 public String tostring() { return name +","+ban +","+no +","+kor +","+eng +","+math +","+gettotal() +","+getaverage() +","+schoolrank +","+classrank ; // class Student [ 실행결과 ] ************************************************** * 성적관리프로그램 * ************************************************** 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 를입력하세요.

388 388 Java 의정석定石 2 판 - 연습문제풀이 >>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 ==================================================== 총점 : ************************************************** * 성적관리프로그램 * ************************************************** 1. 학생성적입력하기 2. 학생성적보기 3. 프로그램종료 원하는메뉴를선택하세요.(1~3) : 3 프로그램을종료합니다. [ 해설 ] 다음은사용자로부터메뉴를입력받아처리하는부분이다. Scanner 의 nextline() 을이용해서라인단위로입력을받고, 공백을제거하기위해 trim() 을사용했다. do-while 문을사용해서사용자가유효한값 (1~3 범위의값 ) 을입력할때까지반복해서입 력을받도록하였다. int menu = 0; do { try { menu = Integer.parseInt(s.nextLine().trim()); if(1 <= menu && menu <= 3) { break; // 유효한메뉴값을입력하면 do-while 문을빠져나간다. else { throw new Exception(); // 메뉴의범위를벗어나면예외를발생시킨다. catch(exception e) { System.out.println(" 메뉴를잘못선택하셨습니다. 다시입력해주세요."); System.out.print(" 원하는메뉴를선택하세요.(1~3) : "); while(true); return menu;

389 Java 의정석定石 2 판 - 연습문제풀이 389 다음은성적을입력하는부분이다. Scanner 를이용해서라인단위로입력받은다음, Scanner 를한번더사용해서라인을 ',' 을구분자로다시나눈다. 그리고이값을이용 해서 Student 인스턴스를생성해서성적데이터를저장하는공간인 record 에추가한다. 무 한반복문 (while) 에둘러쌓여있기때문에, 'q' 나 'Q' 를입력할때까지반복해서성적을입 력할수있다. while(true) { System.out.print(">>"); try { String input = s.nextline().trim(); if(!input.equalsignorecase("q")) { // Scanner 를이용해서화면으로부터데이터를입력받는다.(',' 를구분자로 ) Scanner s2 = new Scanner(input).useDelimiter(","); // 입력받은값으로 Student 인스턴스를생성하고 record 에추가한다. record.add(new Student(s2.next(), s2.nextint(), s2.nextint(), s2.nextint(), s2.nextint(), s2.nextint())); System.out.println(" 잘입력되었습니다. 입력을마치려면 q 를입력하세요."); else { // 입력받은값이 q 또는 Q 이면메서드를종료한다. return; catch(exception e) { // 입력받은데이터에서예외가발생하면, " 입력오류입니다." 를보여주고다시입력받는다. System.out.println(" 입력오류입니다. 이름, 반, 번호, 국어성적, 영어성적, 수학성적 ' 의순서로입력하세요."); // end of while

390 390 Java 의정석定石 2 판 - 연습문제풀이 Chapter 12 쓰레드 Thread

391 Java 의정석定石 2 판 - 연습문제풀이 391 [ 연습문제 - 모범답안 ] [12-1] 쓰레드를구현하는방법에는 Thread 클래스로부터상속받는것과 Runnable 인터페 이스를구현하는것두가지가있는데, 다음의코드는 Thread 클래스를상속받아서쓰레드 를구현한것이다. 이코드를 Runnable 인터페이스를구현하도록변경하시오. [ 연습문제 ]/ch12/exercise12_1.java class Exercise12_1 { public static void main(string args[]) { Thread1 th1 = new Thread1(); th1.start(); class Thread1 extends Thread { public void run() { for(int i=0; i < 300; i++) { System.out.print('-'); [ 정답 ] [ 연습문제 ]/ch12/exercise12_1_2.java class Exercise12_1_2 { public static void main(string args[]) { Thread th1 = new Thread(new Thread1()); th1.start(); class Thread1 implements Runnable { public void run() { for(int i=0; i < 300; i++) { System.out.print('-');

392 392 Java 의정석定石 2 판 - 연습문제풀이 [12-2] 다음코드의실행결과로옳은것은? [ 연습문제 ]/ch12/exercise12_2.java class Exercise12_2 { public static void main(string[] args) { Thread2 t1 = new Thread2(); t1.run(); for(int i=0; i < 10; i++) System.out.print(i); class Thread2 extends Thread { public void run() { for(int i=0; i < 10; i++) System.out.print(i); a 처럼 0 부터 9 까지의숫자가섞여서출력된다. b 처럼 0 부터 9 까지의숫자가순서대로출력된다. c. IllegalThreadStateException 이발생한다. [ 정답 ] b [ 해설 ] Thread2클래스의인스턴스를생성하긴했지만, start() 가아닌 run() 을호출함으로써쓰레드를실행시킨것이아니라단순히 Thread2클래스의메서드를호출한셈이되었다. 만일 run() 이아닌 start() 를호출하였다면, 숫자가섞여서출력되었을것이다.

393 Java 의정석定石 2 판 - 연습문제풀이 393 [12-3] 다음중쓰레드를일시정지상태 (WAITING) 로만드는것이아닌것은? ( 모두고르시오 ) a. suspend() b. resume() c. join() d. sleep() e. wait() f. notify() [ 정답 ] b, f [ 해설 ] resume() 은 suspend() 의호출로인해일시정지상태가된쓰레드를실행대기상태로바꿔준다. notify() 역시 wait() 의호출로인해일시정지상태가된쓰레드를다시실행대기상태로바꿔준다. join() 은현재실행중인쓰레드를멈추고다른쓰레드가실행되도록한다.

394 394 Java 의정석定石 2 판 - 연습문제풀이 [12-4] 다음중 interrupt() 에의해서실행대기상태 (RUNNABLE) 가되지않는경우는? ( 모두고르시오 ) a. sleep() 에의해서일시정지상태인쓰레드 b. join() 에의해서일시정지상태인쓰레드 c. wait() 에의해서일시정지상태인쓰레드 d. suspend() 에의해서일시정지상태인쓰레드 [ 정답 ] d [ 해설 ] suspend() 를제외한나머지메서드들은 interrupt() 가호출되면 InterruptedExcep tion이발생하여일시정지상태에서벗어나실행대기상태가된다.(try-catch문으로 InterruptedException을처리해주어야한다.)

395 Java 의정석定石 2 판 - 연습문제풀이 395 [12-5] 다음의코드를실행한결과를예측하고, 직접실행한결과와비교하라. 만일예 측한결과와실행한결과의차이가있다면그이유를설명하라. [ 연습문제 ]/ch12/exercise12_5.java class Exercise12_5 { public static void main(string[] args) throws Exception { Thread3 th1 = new Thread3(); th1.start(); try { Thread.sleep(5*1000); // main 쓰레드를 5 초간정지시킨다. catch(exception e) { throw new Exception(" 꽝 ~!!!"); class Thread3 extends Thread { public void run() { for(int i=0; i < 10; i++) { System.out.println(i); try { Thread.sleep(1000); catch(exception e) { // run() [ 정답 ] [ 실행결과 ] Exception in thread "main" java.lang.exception: 꽝 ~!!! at Exercise12_5.main(Exercise12_5.java:12)

396 396 Java 의정석定石 2 판 - 연습문제풀이 [ 해설 ] main 과 th1 두개의쓰레드는별도의호출스택 (call stack) 에서실행된다. 그래서 main 에서예외가발생하여종료되고호출스택이없어져도, 쓰레드 th1 이실행되는호출스 택에는아무런영향을미치지못한다. 예외가발생하기전 예외가발생한후 main run run

397 Java 의정석定石 2 판 - 연습문제풀이 397 [12-6] 다음의코드를실행한결과를예측하고, 직접실행한결과와비교하라. 만일예 측한결과와실행한결과의차이가있다면그이유를설명하라. [ 연습문제 ]/ch12/exercise12_6.java class Exercise12_6 { public static void main(string[] args) throws Exception { Thread4 th1 = new Thread4(); th1.setdaemon(true); // 쓰레드 th1 을데몬쓰레드로설정한다. th1.start(); try { th1.sleep(5*1000); catch(exception e) { throw new Exception(" 꽝 ~!!!"); class Thread4 extends Thread { public void run() { for(int i=0; i < 10; i++) { System.out.println(i); try { Thread.sleep(1000); catch(exception e) { // run() [ 정답 ] [ 실행결과 ] Exception in thread "main" java.lang.exception: 꽝 ~!!! at Exercise12_6.main(Exercise12_6.java:13) [ 해설 ] 문제12-6에 'th1.setdaemon(true);' 한문장을추가해서쓰레드 th1을데몬쓰레드로 (daemon thread) 설정하였다. 데몬쓰레드는일반쓰레드 ( 데몬쓰레드가아닌쓰레드 ) 가모두종료되면자동종료되므로, main쓰레드 ( 일반쓰레드 ) 가종료됨과동시에자동종료된다. 그래서문제12-6과는달리쓰레드th1이 main메서드의종료와동시에종료되었다.

398 398 Java 의정석定石 2 판 - 연습문제풀이 [12-7] 다음의코드는쓰레드 th1 을생성해서실행시킨다음 6 초후에정지시키는코드 이다. 그러나실제로실행시켜보면쓰레드를정지시킨다음에도몇초가지난후에서야 멈춘다. 그이유를설명하고, 쓰레드를정지시키면바로정지되도록코드를개선하시오. [ 연습문제 ]/ch12/exercise12_7.java class Exercise12_7 { static boolean stopped = false; public static void main(string[] args) { Thread5 th1 = new Thread5(); th1.start(); try { Thread.sleep(6*1000); catch(exception e) { stopped = true; // 쓰레드를정지시킨다. th1.interrupt(); // 일시정지상태에있는쓰레드를깨운다. System.out.println("stopped"); class Thread5 extends Thread { public void run() { // Exercise12_7.stopped의값이 false인동안반복한다. for(int i=0;!exercise12_7.stopped; i++) { System.out.println(i); try { Thread.sleep(3*1000); catch(exception e) { // run() [ 실행결과 ] stopped [ 정답 ] Exercise12_7.stopped 의값이바뀌어도 for 문내의 Thread.sleep(3*1000); 문장에 의해일시정지상태에있는경우, 시간이지나서일시정지상태를벗어날때까지 for 문을 벗어날수없기때문에이런현상이발생한다. 그래서 interrupt() 를호출해서자고있는

399 Java 의정석定石 2 판 - 연습문제풀이 399 (sleep() 에의해일시정지상태에있는 ) 쓰레드를깨워야즉시정지하게된다. [ 해설 ] 쓰레드 th1은아래의반복문을수행하다가 main메서드에서 Exercise12_7.stopped 의값을 true로바꾸면반복문을빠져나와수행을종료하게된다. 반복문안에쓰레드를 3초동안일시정지상태로하는 Thread.sleep(3*1000) 이있기때문에 Exercise12_7. stopped의값이바뀌었다하더라도일시정지상태에있다면, 일시정지상태가끝나야만반복문을빠져나오게된다. public void run() { // Exercise12_7.stopped의값이 false인동안반복한다. for(int i=0;!exercise12_7.stopped; i++) { System.out.println(i); try { Thread.sleep(3*1000); // 3초간쉰다. catch(exception e) { // run() 그래서쓰레드의실행을바로종료시키려면 Exercise12_7.stopped 의값을 true 로바꾸는 것만으로는부족하다. 그외에다른방법이더필요하다. 그것은바로 interrupt() 를호 출하는것이다. stopped = true; // 쓰레드를정지시킨다. stopped = true; // 쓰레드를정지시킨다. th1.interrupt(); // 쓰레드를깨운다. interrupt() 는 InterruptedException을발생시킴으로써 Thread.sleep() 에의해일시정지상태에있던쓰레드를즉시깨운다. 그래서 Exercise12_7.stopped의값을 true로바꾸고, interrupt() 를호출하면지연없이즉시쓰레드를멈추게할수있다.

400 400 Java 의정석定石 2 판 - 연습문제풀이 [12-8] 다음의코드는 '-' 를출력하는쓰레드와 ' ' 를출력하는쓰레드를생성해서실행시킨다. 이두개의쓰레드가실행결과처럼 '-' 와 ' ' 를한번씩갈아가며찍게하려면아래의코드를어떻게변경해야하는가? [ 참고 ] 쓰레드의불확실성때문에실행결과가다소다를수있다. [ 연습문제 ]/ch12/exercise12_8.java class Exercise12_8 { public static void main(string args[]) { Thread6_1 th1 = new Thread6_1(); Thread6_2 th2 = new Thread6_2(); th1.start(); th2.start(); class Thread6_1 extends Thread { public void run() { for(int i=0; i < 300; i++) { System.out.print('-'); yield(); // 자신에게주어진실행시간을다른쓰레드에게양보한다. class Thread6_2 extends Thread { public void run() { for(int i=0; i < 300; i++) { System.out.print(' '); yield(); // 자신에게주어진실행시간을다른쓰레드에게양보한다. [ 실행결과 ] [ 정답 ] 반복문안에 yield() 를호출하는코드를넣으면된다. [ 해설 ] 쓰레드는스케쥴러에의해서계산된실행시간을할당받는데, 자신에게주어진시

401 Java 의정석定石 2 판 - 연습문제풀이 401 간중에서남아있는시간을다른쓰레드에게양보 (yield) 하도록하는것이바로 yield() 이다. '-' 또는 ' ' 를한번만출력하고남아있는실행시간을다른쓰레드에게양보하면, 원하는결과를얻을수있다. yield() 대신 sleep() 을사용할수도있지만, sleep() 은쓰레드를일정시간동안정지상태로만드는것이기때문에 yield() 가보다효율적이라고할수있다. 여기서한가지짚고넘어갈것은쓰레드의불확실성에대한것이다. 쓰레드의스케줄링은 OS와하드웨어에의존적이기때문에불확실성을가지고있으며, 이러한이유로같은프로그램일지라도실행하는환경에따라다르게실행될수있다. 즉, 쓰레드가실행되는순서와할당받는실행시간이환경 (OS, 하드웨어 ) 에따라달라진다는얘기다. 이문제도실행하는환경에따라결과가다를수있다. 다만, 이문제를통해서여러분들 이얻어야하는것은 yield() 를언제어떻게사용해야하는가에대한이해이다.

402 402 Java 의정석定石 2 판 - 연습문제풀이 [12-9] 다음의코드는텍스트기반의타자연습게임인데 WordGenerator 라는쓰레드가 Vector 에 2 초마다단어를하나씩추가하고, 사용자가단어를입력하면 Vector 에서일치하 는단어를삭제하도록되어있다. WordGenerator 의 run() 을완성하시오. [ 연습문제 ]/ch12/exercise12_9.java import java.util.*; class Exercise12_9 { Vector words = new Vector(); String[] data = {" 태연 "," 유리 "," 윤아 "," 효연 "," 수영 "," 서현 "," 티파니 "," 써니 "," 제시카 "; int interval = 2 * 1000; // 2 초 WordGenerator wg = new WordGenerator(); public static void main(string args[]) { Exercise12_9 game = new Exercise12_9(); game.wg.start(); // 단어를생성하는쓰레드를실행시킨다. Vector words = game.words; while(true) { System.out.println(words); String prompt = ">>"; System.out.print(prompt); // 화면으로부터라인단위로입력받는다. Scanner s = new Scanner(System.in); String input = s.nextline().trim(); int index = words.indexof(input); // 입력받은단어를 words 에서찾는다. if(index!=-1) { // 찾으면 words.remove(index); // words에서해당단어를제거한다. // main class WordGenerator extends Thread { public void run() { while(true) { // 1. interval(2초 ) 마다배열 data의값중하나를임의로선택해서

403 Java 의정석定石 2 판 - 연습문제풀이 403 int rand = (int)(math.random()*data.length); // 2. words 에저장한다. words.add(data[rand]); try { Thread.sleep(interval); // 2초 (interval) 동안쉰다. catch(exception e) { // end of run() // class WordGenerator // Exercise12_9 [ 실행결과 ] [] >> [ 서현 ] >> 서현 [ 수영, 윤아 ] >> 수영 [ 윤아, 유리 ] >> 유리 [ 윤아, 티파니 ] >> 티파니 [ 윤아, 윤아, 유리 ] >> 윤아 [ 윤아, 유리 ] >> 유리 [ 윤아, 효연 ] >> 효연 [ 윤아, 티파니 ] >> 윤아 [ 티파니, 윤아 ] >> 티파니 [ 윤아, 수영, 써니 ] >> [ 해설 ] 쉬운문제라서별로설명할것이없다. 쓰레드가그렇게어려운것만은아니라고느낄수있으면좋겠다. 13장 AWT를배운다음에이예제를발전시켜서 GUI를갖춘타자게임을만들어보면재미있을것이다.( 카페의 'java1000제' 게시판에개발단계별로공개되어있음 ) 혹시라도질문이있으면

404 404 Java 의정석定石 2 판 - 연습문제풀이 Chapter 13 AWT 와애플릿 AWT & Applet

405 Java 의정석定石 2 판 - 연습문제풀이 405 [ 연습문제 ] [13-1] 아래의실행결과처럼가로, 세로크기가 5 인빙고판을만드시오. 그리고버튼을 누르면, 버튼의배경색이밝은회색 (Color.LIGHT_GRAY) 으로바뀌고누른버튼의글자가 콘솔에출력되게하시오. [ 실행결과 ] [ 정답 ] [ 연습문제 ]/ch11/exercise13_1.java import java.awt.*; import java.awt.event.*; class Exercise13_1 extends Frame { final int SIZE = 5; // 빙고판의크기 Button[] btnarr = null; String[] birds = { // 버튼에넣을문자열들 " 참새 "," 두루미 "," 황새 "," 비둘기 "," 까오기 ", " 오리 "," 타조 "," 부엉이 "," 올빼미 "," 뱁새 ", " 꿩 "," 닭 "," 구관조 "," 잉꼬 "," 매 ", " 거위 "," 독수리 "," 콘돌 "," 봉황 "," 공작 ", " 까치 "," 까마귀 "," 앵무새 "," 꾀꼬리 "," 고니 " ;

406 406 Java 의정석定石 2 판 - 연습문제풀이 Exercise13_1() { this("bingo Game"); Exercise13_1(String title) { super(title); setlayout(new GridLayout(SIZE, SIZE)); // Frame 의 layout 을 GridLayout 으로 MyEventHandler handler = new MyEventHandler(); addwindowlistener(handler); btnarr = new Button[SIZE*SIZE]; // 5*5=25 개의버튼을담을객체배열을만든다. // Frame 에버튼을추가한다. for(int i=0; i < SIZE*SIZE;i++) { btnarr[i] = new Button(birds[i]);// 배열 birds 의값을버튼의 Label 로한다. btnarr[i].addactionlistener(handler); // 버튼에이벤트리스너를추가 add(btnarr[i]); // 버튼을 Frame 에추가한다. setbounds(500, 200, 300, 300); setvisible(true); public static void main(string args[]) { Exercise13_1 win = new Exercise13_1("Bingo Game"); win.show(); class MyEventHandler extends WindowAdapter implements ActionListener { public void actionperformed(actionevent ae) { Button btn = (Button)ae.getSource(); System.out.println(btn.getLabel()); // 눌러진버튼의 Label 을콘솔에출력 btn.setbackground(color.light_gray); // 백그라운드를밝은회색으로변경 // Frame 의우측상단의 x 버튼 ( 닫기버튼 ) 을누르면프로그램을종료한다. public void windowclosing(windowevent e) { e.getwindow().setvisible(false); e.getwindow().dispose(); System.exit(0); // MyEventHandler [ 해설 ] Frame의 layout을 5 * 5의 GridLayout으로설정하고 25개의버튼을추가하면된다. 버튼을누르면 ActionEvent가발생하니까 ActionListener를구현한이벤트처리기 (MyEventHandler) 를작성하였다. 그리고이벤트처리기의 actionperformed메서드에서는발생한이벤트에대한참조 (ae) 를사용할수있어서, ActionEvent의 getsource() 를호출하면 ActionEvent가발생한곳 (event source, 눌러진 Button) 에대한참조를얻을수있다.

407 Java 의정석定石 2 판 - 연습문제풀이 407 버튼을다음과같이 2 차원배열로처리하는것도괜찮다. [ 연습문제 ]/ch11/exercise13_1_2.java import java.awt.*; import java.awt.event.*; class Exercise13_1_2 extends Frame { final int SIZE = 5; // 빙고판의크기 Button[][] btnarr = null; String[][] birds = { // 버튼에넣을문자열들 {" 참새 "," 두루미 "," 황새 "," 비둘기 "," 까오기 ", {" 오리 "," 타조 "," 부엉이 "," 올빼미 "," 뱁새 ", {" 꿩 "," 닭 "," 구관조 "," 잉꼬 "," 매 ", {" 거위 "," 독수리 "," 콘돌 "," 봉황 "," 공작 ", {" 까치 "," 까마귀 "," 앵무새 "," 꾀꼬리 "," 고니 " ; Exercise13_1_2() { this("bingo Game"); Exercise13_1_2(String title) { super(title); setlayout(new GridLayout(SIZE, SIZE)); MyEventHandler handler = new MyEventHandler(); addwindowlistener(handler); btnarr = new Button[SIZE][SIZE]; // 5*5=25 개의버튼을담을객체배열을만든다. // Frame 에버튼을추가한다. for(int i=0; i < SIZE;i++) { for(int j=0; j < SIZE;j++) { btnarr[i][j] = new Button(birds[i][j]); btnarr[i][j].addactionlistener(handler); // 버튼에이벤트리스너를추가 add(btnarr[i][j]); // 버튼을 Frame 에추가한다. setbounds(500, 200, 300, 300); setvisible(true); public static void main(string args[]) { Exercise13_1_2 win = new Exercise13_1_2("Bingo Game"); win.show(); class MyEventHandler extends WindowAdapter implements ActionListener { public void actionperformed(actionevent ae) { Button btn = (Button)ae.getSource(); System.out.println(btn.getLabel()); // 눌러진버튼의 Label 을콘솔에출력 btn.setbackground(color.light_gray); // 백그라운드를밝은회색으로변경

408 408 Java 의정석定石 2 판 - 연습문제풀이 public void windowclosing(windowevent e) { e.getwindow().setvisible(false); e.getwindow().dispose(); System.exit(0); // MyEventHandler

409 Java 의정석定石 2 판 - 연습문제풀이 409 [13-2] 다음중기본레이아웃매니저가 BorderLayout이아닌컨테이너는? ( 모두고르시오 ) a. Window b. Panel c. Applet d. Frame e. Dialog [ 정답 ] b, c [ 해설 ] 컨테이너는기본레이아웃매니저 (default layout manager) 를가지고있다. 다음의그림에서알수있는것처럼, Panel과 Applet의기본레이아웃매니저는 FlowLayout이다. 그리고 Window, Frame, Dialog, FileDialog의기본레이아웃매니저는 BorderLayout 이다. [ 그림 13-2] AWT 컴포넌트의상속계층도

410 410 Java 의정석定石 2 판 - 연습문제풀이 [13-3] 다음중 ActionEvent가발생하는경우가아닌것은? ( 모두고르시오 ) a. Button을클릭했을때 b. Menu를클릭했을때 c. TextArea에서 Enter키를눌렀을때 d. List에서 item을선택하여클릭했을때 e. Label을더블클릭했을때 [ 정답 ] d, e [ 해설 ] ActionEvent 가발생하는경우는다음과같다. ActionEvent가발생하는경우 - Button이눌러졌을때 - Menu를클릭했을때 - TextField에서 Enter키를눌렀을때 - List의 item하나를선택하여더블클릭했을때

411 Java 의정석定石 2 판 - 연습문제풀이 411 [13-4] 타이틀바에현재시간을출력하는시계를작성하시오. 단, 쓰레드를이용해서 시간이 1 초마다계속변경되도록해야한다. [Hint] SimpleDateFormat 을사용하라. [ 실행결과 ] [ 정답 ] [ 연습문제 ]/ch13/exercise13_4.java import java.util.*; import java.text.*; import java.awt.*; import java.awt.event.*; class Exercise13_4 extends Frame { SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss a"); public static void main(string args[]) { Exercise13_4 win = new Exercise13_4(); win.start(); Exercise13_4() { super(""); MyEventHandler handler = new MyEventHandler(); addwindowlistener(handler); setbounds(500, 200, 200, 0); updateclock(); setresizable(false); setvisible(true); void updateclock() { // Frame 의 title 에현재시간을표시한다. Date currenttime = new Date(System.currentTimeMillis()); settitle(sdf.format(currenttime)); void start() { Thread t = new Thread(new Runnable(){ public void run() { while(true) { try { Thread.sleep(1000); // 1 초쉰다. catch(exception e) { ); updateclock(); // run()

412 412 Java 의정석定石 2 판 - 연습문제풀이 t.start(); class MyEventHandler extends WindowAdapter { public void windowclosing(windowevent e) { e.getwindow().setvisible(false); e.getwindow().dispose(); System.exit(0); // MyEventHandler [ 해설 ] 현재시간을 Frame 의 title 에표시하는메서드 updateclock() 을정의한다음에 SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss a"); void updateclock() { // Frame 의 title 에현재시간을표시한다. Date currenttime = new Date(System.currentTimeMillis()); settitle(sdf.format(currenttime)); 쓰레드를이용해서 1 초마다 updateclock() 을호출하면된다. 아래의코드는 1 초마다 updateclock() 을호출하는쓰레드를생성해서실행시킨다. void start() { Thread t = new Thread(new Runnable(){ public void run() { while(true) { try { Thread.sleep(1000); // 1 초쉰다. catch(exception e) { ); updateclock(); // Frame의 title을현재시간으로변경한다. // run() t.start();

413 Java 의정석定石 2 판 - 연습문제풀이 413 [13-5] 다음의코드는현재년과월을보여주고왼쪽의버튼을누르면이전달로, 오른 쪽버튼을누르면다음달로이동하는프로그램이다. 알맞은코드를넣어프로그램을완 성하시오. [ 연습문제 ]/ch13/exercise13_5.java import java.io.*; import java.util.*; import java.text.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; class Exercise13_5 extends Frame { Panel pup = new Panel(); Button btnprevmon = new Button(" "); Button btnnextmon = new Button(" "); Label lblyearmon = new Label(); Calendar curmon = Calendar.getInstance(); Exercise13_5(String title) { super(title); pup.setbackground(color.yellow); pup.setlayout(new FlowLayout(FlowLayout.CENTER)); pup.add(btnprevmon); pup.add(lblyearmon); pup.add(btnnextmon); btnprevmon.addactionlistener(new BtnEventHandler()); btnnextmon.addactionlistener(new BtnEventHandler()); addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent we) { we.getwindow().setvisible(false); we.getwindow().dispose(); System.exit(0); ); add(pup); setbounds(200,200,200,70); setdays(curmon); setvisible(true); // Exercise13_5 void setdays(calendar date) { int year = date.get(calendar.year); int month = date.get(calendar.month); // 0~11 을반환받는다. 0 은 1 월의의미. lblyearmon.settext(year+" 년 "+(month+1)+" 월 "); class BtnEventHandler implements ActionListener { public void actionperformed(actionevent ae) {

414 414 Java 의정석定石 2 판 - 연습문제풀이 Button src = (Button)ae.getSource(); // 1. 눌러진버튼이 btnprevmon 이면, curmon 을한달이전으로변경한다. if(src==btnprevmon) { curmon.add(calendar.month, -1); // 2. 눌러진버튼이 btnnextmon 이면, curmon 을한달이후로변경한다. else if(src==btnnextmon) { curmon.add(calendar.month, 1); // 3. setdays() 를호출해서변경된내용이레이블에보이게한다. setdays(curmon); repaint(); public static void main(string[] args) { Exercise13_5 mainwin = new Exercise13_5("Scheduler"); // main [ 실행결과 ] [ 해설 ] Calendar 의 add() 를사용하는방법만알면간단히해결할수있는문제이다. 한가지주의할점은 setday() 를호출한다음에 repaint() 를호출해서화면을다시그리 게해야한다는것이다.

415 Java 의정석定石 2 판 - 연습문제풀이 415 [13-6] 다음의코드는문제 13-5 를발전시켜서해당월의날짜를버튼으로추가하는코드 이다. (1)~(2) 에알맞은코드를넣어프로그램을완성하시오. [ 연습문제 ]/ch13/exercise13_6.java import java.io.*; import java.util.*; import java.text.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; class Exercise13_6 extends Frame { Panel pdate = new Panel(); Panel pup = new Panel(); Button btnprevmon = new Button(" "); Button btnnextmon = new Button(" "); Label lblyearmon = new Label(); Button[] btnarr = new Button[42]; Calendar curmon = Calendar.getInstance(); Exercise13_6(String title) { super(title); pup.setbackground(color.yellow); pup.setlayout(new FlowLayout(FlowLayout.CENTER)); pup.add(btnprevmon); pup.add(lblyearmon); pup.add(btnnextmon); pdate.setlayout(new GridLayout(6,7)); for(int i=0; i < btnarr.length;i++) { btnarr[i] = new Button(""); pdate.add(btnarr[i]); btnprevmon.addactionlistener(new BtnEventHandler()); btnnextmon.addactionlistener(new BtnEventHandler()); addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent we) { we.getwindow().setvisible(false); we.getwindow().dispose(); System.exit(0); ); add(pup,"north"); add(pdate,"center"); setbounds(200,200,500,300); setdays(curmon); setvisible(true);

416 416 Java 의정석定石 2 판 - 연습문제풀이 // MyScheduler void setdays(calendar date) { int year = date.get(calendar.year); int month = date.get(calendar.month); lblyearmon.settext(year+" 년 "+(month+1)+" 월 "); Calendar sday = Calendar.getInstance(); // 시작일 // 1. 시작일 (sday) 을해당월의 1 일이포함된일요일로설정한다. sday.set(year, month, 1); // 입력월의 1 일로설정한다. sday.add(calendar.date, -sday.get(calendar.day_of_week) + 1); // 2. 반복문을사용해서 sday 의값을 1 씩증가시키면서버튼에날짜를넣는다. for(int i=0; i < btnarr.length; i++, sday.add(calendar.date, 1)) { int day = sday.get(calendar.date); // sday 에서날자를뽑아서 day 에저장 btnarr[i].setlabel(day+""); // 3. 만일날짜가해당월에속하면버튼의배경색을흰색 (Color.white) 으로하고그렇지않으면밝은회색 (Color.lightGray) 으로설정한다. if(sday.get(calendar.month)!=month) { btnarr[i].setbackground(color.lightgray); else { btnarr[i].setbackground(color.white); // setdays(calendar date) class BtnEventHandler implements ActionListener { public void actionperformed(actionevent ae) { Button src = (Button)ae.getSource(); if(src==btnprevmon) { curmon.add(calendar.month, -1); else if(src==btnnextmon) { curmon.add(calendar.month, 1); setdays(curmon); repaint(); public static void main(string[] args) { Exercise13_6 mainwin = new Exercise13_6("Scheduler"); // main

417 Java 의정석定石 2 판 - 연습문제풀이 417 [ 실행결과 ] [ 해설 ] sday 는 Frame 에나타나는달력의첫날을의미한다. 예를들어실행결과의달력에 서 sday 는 29 일이다. sday 는해당월의 1 일이어떤요일이냐에따라달라진다. 1 일이월 요일이면 1 을, 화요일이면 2 를빼야 sday 를구할수있다. 실행결과에서는 1 일이화요일 이기때문에 2 일을빼주어야한다. sday.set(year, month, 1); // sday 를입력월의 1 일로설정한다. sday.add(calendar.date, -2); // sday 를 2 일전으로변경한다. // sday.add(calendar.date, 2); // sday를 2일후로변경한다. // sday.add(calendar.month, -2); // sday를 2달전으로변경한다. 일단 sday를해당월의 1일로설정한다음에, sday.get(calendar.day_of_week) 를이용해서 1일의요일을알아내서그에맞게날짜를조정하면된다. 만일 1일이화요일이면 sday.get(calendar.day_of_ WEEK) 는 3을반환한다. 1일이화요일인경우 2일을빼주어야하니까, sday의일 (Calendar.DATE) 에서 sday.get(calendar. DAY_OF_WEEK) 값을빼고 1을더하면된다. [ 참고 ] sday.get(calendar.day_of_week) 는 sday 의요일을반환한다.(1: 일요일 ~7: 토요일 ) // sday 가화요일이면, sday.get(calendar.day_of_week) 는 3 을반환한다. sday.add(calendar.date, -sday.get(calendar.day_of_week) + 1); sday.add(calendar.date, ); sday.add(calendar.date, -2);

418 418 Java 의정석定石 2 판 - 연습문제풀이 [13-7] 다음의코드는오목게임이다. Frame 에오목판을그리고, 그위에왼쪽버튼을누 르면검은돌이오른쪽버튼을누르면흰돌이그려지도록알맞은코드를완성하시오. 단, 돌은클릭한곳의가장가까운교차점에놓여야한다. [ 연습문제 ]/ch13/exercise13_7.java import java.awt.*; import java.awt.event.*; class Exercise13_7 extends Frame implements MouseListener { final int LINE_NUM = 9; // 오목판줄수 final int LINE_WIDTH = 30; // 오목판줄간격 final int BOARD_SIZE = LINE_WIDTH * (LINE_NUM-1); // 오목판의크기 final int STONE_SIZE = (int)(line_width * 0.8); // 돌의크기 final int X0; // 오목판시작위치 x 좌표 final int Y0; // 오목판시작위치 y 좌표 final int FRAME_WIDTH; // Frame 의폭 final int FRAME_HEIGHT; // Frame 의높이 Image img = null; Graphics gimg = null; public Exercise13_7(String title) { super(title); // Event Handler 를등록한다. addmouselistener(this); addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent we) { System.exit(0); ); setvisible(true); // Frame 을화면에보이게한다. Insets insets = getinsets(); // 화면에보이기전에는 Insets 의값을얻을수없다. // 오목판그려질위치 (LEFT, TOP) 의좌표 X0, Y0 를지정한다. X0 = insets.left + LINE_WIDTH; Y0 = insets.top + LINE_WIDTH; // Frame 의크기를계산한다. FRAME_WIDTH = BOARD_SIZE+LINE_WIDTH*2+insets.left+insets.right; FRAME_HEIGHT = BOARD_SIZE+LINE_WIDTH*2+insets.top+insets.bottom; // Frame 을화면의 (100,100) 의위치에계산된크기로보이게한다. setbounds(100,100, FRAME_WIDTH, FRAME_HEIGHT); img = createimage(frame_width, FRAME_HEIGHT); gimg = img.getgraphics(); setresizable(false); // Frame 의크기를변경하지못하게한다. drawboard(gimg); // Exercise13_7(String title)

419 Java 의정석定石 2 판 - 연습문제풀이 419 public void drawboard(graphics g) { for(int i=0; i<line_num;i++) { g.drawline(x0,y0+i*line_width,x0+board_size, Y0+i*LINE_WIDTH); g.drawline(x0+i*line_width,y0, X0+i*LINE_WIDTH, Y0+BOARD_SIZE); public void paint(graphics g) { if(img==null) return; g.drawimage(img,0,0,this); // 가상화면에그려진그림을 Frame 에복사 public void mousepressed(mouseevent e) { int x = e.getx(); // 마우스포인터의 x좌표 int y = e.gety(); // 마우스포인터의 y좌표 // MouseListener // 1. x 또는 y 의값이오목판의밖을벗어난곳이면메서드를종료한다. if(x < X0-LINE_WIDTH/2 x > X0+(LINE_NUM-1)*LINE_WIDTH+LINE_WIDTH/2) return; if(y < Y0-LINE_WIDTH/2 y > Y0+(LINE_NUM-1)*LINE_WIDTH+LINE_WIDTH/2) return; // 2. x 와 y 의값을클릭한곳에서가장가까운교차점으로변경한다.( 반올림 ) x = (x-x0 + LINE_WIDTH/2)/LINE_WIDTH * LINE_WIDTH + X0; y = (y-y0 + LINE_WIDTH/2)/LINE_WIDTH * LINE_WIDTH + Y0; // 3. x 와 y 의값에서돌의크기 (STONE_SIZE) 의절반을빼야클릭한곳에돌이그려진다. x -= STONE_SIZE / 2; y -= STONE_SIZE / 2; // 4. 눌러진버튼이마우스왼쪽버튼이면, (x,y) 의위치에검은돌을그리고 if(e.getmodifiersex()==mouseevent.button1_down_mask) { gimg.setcolor(color.black); gimg.filloval(x,y,stone_size, STONE_SIZE); // 눌러진버튼이마우스오른쪽버튼이면, (x,y) 의위치에흰돌을그린다. else if (e.getmodifiersex()==mouseevent.button3_down_mask) { gimg.setcolor(color.white); gimg.filloval(x,y,stone_size, STONE_SIZE); // 흰색돌을위해검은색테두리를그린다. gimg.setcolor(color.black); gimg.drawoval(x,y,stone_size, STONE_SIZE); // 5. repaint() 를호출한다. repaint(); public void mouseclicked(mouseevent e) { // MouseListener public void mouseentered(mouseevent e) { // MouseListener public void mouseexited(mouseevent e) { // MouseListener public void mousereleased(mouseevent e) { // MouseListener public static void main(string[] args) { new Exercise13_7("OmokTest");

420 420 Java 의정석定石 2 판 - 연습문제풀이 [ 실행결과 ] [ 해설 ] 먼저바둑판을그려봐야이해하기쉬울것이다. X0, Y0는바둑판의좌측상단의시작점을의미한다. 바둑한줄의간격은 LINE_WIDTH이고바둑돌의크기는 STONE_WIDTH로정의했다. 먼저클릭한곳이아래그림의점선사각형의내부가아니면메서드를종료하도록하였다. 점선사각형의영역은바둑판보다바둑판한칸의절반크기 (LINE_WIDTH/2) 만큼상하좌우로크게지정하였다. (X0-LINE_WIDTH/2, Y0-LINE_WIDTH/2) (X0, Y0) (X0+(LINE_NUM-1)*LINE_WIDTH, Y0+(LINE_NUM-1)*LINE_WIDTH) (X0+(LINE_NUM-1)*LINE_WIDTH+LINE_WIDTH/2, Y0+(LINE_NUM-1)*LINE_WIDTH)+LINE_WIDTH/2 // 1. x 또는 y 의값이오목판의밖을벗어난곳이면메서드를종료한다. if(x < X0-LINE_WIDTH/2 x > X0+(LINE_NUM-1)*LINE_WIDTH+LINE_WIDTH/2) return; if(y < Y0-LINE_WIDTH/2 y > Y0+(LINE_NUM-1)*LINE_WIDTH+LINE_WIDTH/2) return;

421 Java 의정석定石 2 판 - 연습문제풀이 421 바둑판을클릭했을때돌이아무곳에나놓여서는안되고, 반드시교차점에만돌이놓여 야한다. 그래서아래의그림에서점선사각형내부의어느곳을클릭해도교차점 (x,y) 에 돌이놓이도록돌이그려질위치를계산해줘야한다. (X0, Y0) LINE_WIDTH (x-line_width/2, y-line_width/2) (x, y) 만일 LINE_WIDTH 가 10 이고바둑판의시작점 (X0,Y0) 의좌표가 (0,0) 이라면 (x,y) 의좌표 는 (10,10) 이될것이다. 바둑돌이교차점에놓이려면, x 또는 y 의범위가 5 <= x, y <15 의범위안에포함되는 x, y 의값은모두 10 이되어야하는것이다. 예를들어 (11,11) 이 나 (6,8) 의위치를클릭해도 (10,10) 에돌이놓여야한다. 범위 5 <= x, y <15 에있는값이 10 이되려면, 반올림을하면된다. 5 를더해준다음 10 으로나누고곱하면반올림이된다. 아래는 6 을반올림해서 10 을만드는과정이다. (6 + 5) / 10 * / 10 * 10 1 * 여기서 10 은 'LINE_WIDTH' 이고 5 는 'LINE_WIDTH/2' 이다. 클릭한곳의좌표가 (x, y) 라면 새로운좌표 (x1, y1) 은다음과같은식으로구할수있다. x1 = (x + LINE_WIDTH/2) / LINE_WIDTH * LINE_WIDTH; y1 = (y + LINE_WIDTH/2) / LINE_WIDTH * LINE_WIDTH; 그러나처음에바둑판의시작점 (X0,Y0) 의좌표가 (0,0) 이라고가정해서얻은식이기때 문에 x 좌표에서실제 (X0,Y0) 의좌표를빼줘서시작점의좌표를 (0,0) 으로만들어계산한 다음에, 다시 (X0,Y0) 의좌표를더해야한다. 그렇게해야만반올림이올바르게처리된 다. x1 = (x-x0 + LINE_WIDTH/2)/LINE_WIDTH * LINE_WIDTH + X0; y1 = (y-y0 + LINE_WIDTH/2)/LINE_WIDTH * LINE_WIDTH + Y0; filloval(x,y, STONE_SIZE, STONE_SIZE) 은좌표 (x, y) 에크기가 STONE_SIZE 인원을그린

422 422 Java 의정석定石 2 판 - 연습문제풀이 다. 그런데, 여기서좌표 (x, y) 가원의원점이아니라원을포함하는사각형의좌측상단 점을의미한다. 아래의그림에서검은돌은좌표 (x, y) 에그린것이고, 흰돌은좌표 (x-stone_size/2, y-stone_size/2) 에그린것이다. (X0, Y0) (x-stone_size/2, y-stone_size/2) STONE_SIZE (x, y) 그래서그림의흰돌처럼교차점에그리려면, 돌크기의절반 (STONE_SIZE/2) 을교차점의 좌표에서빼줘야한다. // 3. x 와 y 의값에서돌의크기 (STONE_SIZE) 의절반을빼야클릭한곳에돌이그려진다. x -= STONE_SIZE / 2; // x = x - STONE_SIZE / 2; y -= STONE_SIZE / 2; // y = y - STONE_SIZE / 2;

423 Java 의정석定石 2 판 - 연습문제풀이 423 [13-8] 다음은 Frame 의내부를튀어다니는공을그리는프로그램이다. 공이 Frame 의 벽에부딪히면방향을바꾸어이동한다. 알맞은코드를넣어완성하시오. [ 연습문제 ]/ch13/exercise13_8.java import java.awt.*; import java.awt.event.*; class BouncingBall extends Frame { final int BALL_SIZE = 20; final int FRAME_WIDTH = 400; final int FRAME_HEIGHT = 300; final int TOP; final int BOTTOM; final int LEFT; final int RIGHT; final int SPEED = 3; int x = 100; int y = 100; int xstep = SPEED; int ystep = SPEED; BouncingBall(String title) { super(title); addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent e) { System.exit(0); ); setbounds(300,200, FRAME_WIDTH, FRAME_HEIGHT); setresizable(false); setvisible(true); Insets insets = getinsets(); // Frame 의테두리의두께를얻어온다. TOP = insets.top; LEFT = insets.left; BOTTOM = FRAME_HEIGHT - insets.bottom ; RIGHT = FRAME_WIDTH - insets.right; void start() { while(true) { x +=xstep; y +=ystep; // 1. x의값이왼쪽테두리 (LEFT) 보다작거나같으면 // x의값을 LEFT로바꾸고 x축이동방향 (xstep) 을반대로한다. if(x <=LEFT) { x = LEFT; xstep = -xstep;

424 424 Java 의정석定石 2 판 - 연습문제풀이 // 2. x의값이오른쪽테두리 (RIGHT-BALL_SIZE) 보다작거나같으면 x의값을 RIGHT-BALL_SIZE로바꾸고 x축이동방향 (xstep) 을반대로한다. if(x >= RIGHT-BALL_SIZE) { x = RIGHT-BALL_SIZE; xstep = -xstep; // 3. y의값이윗쪽테두리 (TOP) 보다작거나같으면 // y의값을 TOP으로바꾸고 y축이동방향 (ystep) 을반대로한다. if(y <= TOP) { y = TOP; ystep = -ystep; // 4. y의값이아래쪽테두리 (BOTTON-BALL_SIZE) 보다작거나같으면 // y의값을 BOTTON-BALL_SIZE로바꾸고 y축이동방향 (ystep) 을반대로한다. if(y >= BOTTOM-BALL_SIZE) { y = BOTTOM-BALL_SIZE; ystep = -ystep; repaint(); try { Thread.sleep(100); catch (Exception e) { // start() public void paint(graphics g) { g.setcolor(color.red); g.filloval(x, y, BALL_SIZE, BALL_SIZE); class Exercise13_8 { public static void main(string[] args) { new BouncingBall("Bouncing Ball").start(); [ 실행결과 ]

425 Java 의정석定石 2 판 - 연습문제풀이 425 [13-9] 문제 13-8 을발전시켜서 BallGenerator 라는쓰레드를생성시켜서 3 초마다새로운 공을하나씩생성하는프로그램이다. 알맞은코드를넣어프로그램을완성하시오. [ 연습문제 ]/ch13/exercise13_9.java import java.util.*; import java.awt.*; import java.awt.event.*; class BouncingBall extends Frame { final int FRAME_WIDTH = 400; final int FRAME_HEIGHT = 300; final int TOP; final int BOTTOM; final int LEFT; final int RIGHT; ArrayList balls = new ArrayList(); BouncingBall(String title) { super(title); setbounds(300,200, FRAME_WIDTH, FRAME_HEIGHT); setresizable(false); setvisible(true); Insets insets = getinsets(); // Frame 의테두리의두께를얻어온다. TOP = insets.top; LEFT = insets.left; BOTTOM = FRAME_HEIGHT - insets.bottom; RIGHT = FRAME_WIDTH - insets.right; addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent e) { System.exit(0); ); void start() { new BallGenerator().start(); while(true) { int size = balls.size(); for(int i=0 ; i < size; i++) { Ball b = (Ball)balls.get(i); b.x +=b.xstep; b.y +=b.ystep; // 1. x의값이왼쪽테두리 (LEFT) 보다작거나같으면 // x의값을 LEFT로바꾸고 x축이동방향 (xstep) 을반대로한다. if(b.x <=LEFT) {

426 426 Java 의정석定石 2 판 - 연습문제풀이 b.x = LEFT; b.xstep = -b.xstep; // 2. x의값이오른쪽테두리 (RIGHT-BALL_SIZE) 보다작거나같으면 // x의값을 RIGHT-BALL_SIZE로바꾸고 x축이동방향 (xstep) 을반대로한다. if(b.x >= RIGHT-Ball.SIZE) { b.x = RIGHT-Ball.SIZE; b.xstep = -b.xstep; // 3. y의값이윗쪽테두리 (TOP) 보다작거나같으면 // y의값을 TOP으로바꾸고 y축이동방향 (ystep) 을반대로한다. if(b.y <= TOP) { b.y = TOP; b.ystep = -b.ystep; // 4. y의값이아래쪽테두리 (BOTTON-BALL_SIZE) 보다작거나같으면 // y의값을 BOTTON-BALL_SIZE로바꾸고 y축이동방향 (ystep) 을반대로한다. if(b.y >= BOTTOM-Ball.SIZE) { b.y = BOTTOM-Ball.SIZE; b.ystep = -b.ystep; repaint(); try { Thread.sleep(100); catch (Exception e) { // start() public void paint(graphics g) { g.drawstring("number of balls :"+balls.size(),20,50); g.setcolor(color.red); int size = balls.size(); for(int i=0 ; i < size; i++) { Ball b = (Ball)balls.get(i); g.filloval(b.x, b.y, Ball.SIZE, Ball.SIZE); class BallGenerator extends Thread { public void run() { // 1. 3 초마다 Frame 의임의의위치에공을생성해서 balls 에추가한다. while(true) { int x = (int)(math.random() * (RIGHT-LEFT))+ LEFT; int y = (int)(math.random() * (BOTTOM-TOP))+ TOP; balls.add(new Ball(x,y)); // 새로운 Ball 을생성해서 balls 에추가 try { Thread.sleep(3*1000); // 3 초간쉰다. catch(exception e) {

427 Java 의정석定石 2 판 - 연습문제풀이 427 // run() class Ball { int x = 100; int y = 100; static final int SIZE = 30; final int SPEED = 5; int xstep = SPEED; int ystep = SPEED; Ball(int x, int y) { this.x = x; this.y = y; // class BouncingBall class Exercise13_9 { public static void main(string[] args) { new BouncingBall("Bouncing Ball").start(); [ 실행결과 ]

428 428 Java 의정석定石 2 판 - 연습문제풀이 [13-10] 다음은키보드의화살표키를이용해서공을 Frame 의테두리내에서상하좌우로 이동시키는프로그램이다. 알맞은코드를넣어프로그램을완성하시오. [ 연습문제 ]/ch13/exercise13_10.java import java.awt.*; import java.awt.event.*; class BouncingBall extends Frame { final int BALL_SIZE = 20; final int FRAME_WIDTH = 400; final int FRAME_HEIGHT = 300; final int TOP; final int BOTTOM; final int LEFT; final int RIGHT; int x; int y; final int SPEED = 3; int xstep = SPEED; int ystep = SPEED; BouncingBall(String title) { super(title); x = FRAME_WIDTH/2 - BALL_SIZE/2; y = FRAME_HEIGHT/2 - BALL_SIZE/2; setvisible(true); setbounds(300,200, FRAME_WIDTH, FRAME_HEIGHT); Insets insets = getinsets(); // Frame의테두리의두께를얻어온다. TOP = insets.top; LEFT = insets.left; BOTTOM = FRAME_HEIGHT - insets.bottom ; RIGHT = FRAME_WIDTH - insets.right; registereventhandler(); setresizable(false); void registereventhandler() { addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent e) { System.exit(0); ); addkeylistener(new KeyAdapter() { public void keypressed(keyevent ke){ int key = ke.getkeycode(); if(key==keyevent.vk_up){ y -= SPEED; if(y <= TOP)

429 Java 의정석定石 2 판 - 연습문제풀이 429 ); y = TOP; // 위쪽경계를넘어가지않도록한다. else if(key==keyevent.vk_down){ y += SPEED; if(y >= BOTTOM-BALL_SIZE) y = BOTTOM-BALL_SIZE; // 아래쪽경계를넘어가지않도록한다. else if(key==keyevent.vk_left){ x -= SPEED; if(x <= LEFT) x = LEFT; // 왼쪽경계를넘어가지않도록한다. else if(key==keyevent.vk_right){ x += SPEED; if(x >= RIGHT-BALL_SIZE) x = RIGHT-BALL_SIZE; // 오른쪽경계를넘어가지않도록한다. // public void keypressed(keyevent ke) void start() { while(true) { repaint(); try { Thread.sleep(100); catch (Exception e) { // start() public void paint(graphics g) { g.setcolor(color.light_gray); g.filloval(x, y, BALL_SIZE, BALL_SIZE); class Exercise13_10 { public static void main(string[] args) { new BouncingBall("Bouncing Ball").start(); [ 실행결과 ]

430 430 Java 의정석定石 2 판 - 연습문제풀이 [13-11] 다음은문제 13-9 와 을결합해서발전시킨것으로회색공을키보드로움직 여서빨간공들을피해다니다빨간공과회색공이충돌하면중단되는프로그램이다. 알맞은 코드를넣어코드를완성하시오. [ 연습문제 ]/ch13/exercise13_11.java import java.util.*; import java.awt.*; import java.awt.event.*; class BouncingBall extends Frame { final int BALL_SIZE = 20; final int FRAME_WIDTH = 400; final int FRAME_HEIGHT = 300; final int TOP; final int BOTTOM; final int LEFT; final int RIGHT; final int SPEED = 7; int x; int y; boolean isplaying = true; ArrayList balls = new ArrayList(); BouncingBall(String title) { super(title); x = FRAME_WIDTH/2 - BALL_SIZE/2; y = FRAME_HEIGHT/2 - BALL_SIZE/2; setbounds(300,200, FRAME_WIDTH, FRAME_HEIGHT); setresizable(false); setvisible(true); Insets insets = getinsets(); TOP = insets.top; LEFT = insets.left; BOTTOM = FRAME_HEIGHT - insets.bottom; RIGHT = FRAME_WIDTH - insets.right; registereventhandler(); void registereventhandler() { addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent e) { System.exit(0); ); addkeylistener(new KeyAdapter() { public void keypressed(keyevent ke){ if(!isplaying) return;

431 Java 의정석定石 2 판 - 연습문제풀이 431 int key = ke.getkeycode(); if(key==keyevent.vk_up){ y -= SPEED; if(y <= TOP) y = TOP; else if(key==keyevent.vk_down){ y += SPEED; if(y >= BOTTOM-BALL_SIZE) y = BOTTOM-BALL_SIZE; else if(key==keyevent.vk_left){ x -= SPEED; if(x <= LEFT) x = LEFT; ); else if(key==keyevent.vk_right){ x += SPEED; if(x >= RIGHT-BALL_SIZE) x = RIGHT-BALL_SIZE; // public void keypressed(keyevent ke) void start() { new BallGenerator().start(); while(isplaying) { int size = balls.size(); for(int i=0 ; i < size; i++) { Ball b = (Ball)balls.get(i); b.x +=b.xstep; b.y +=b.ystep; if(b.x <=LEFT) { b.x = LEFT; b.xstep = -b.xstep; if(b.x >= RIGHT-b.size) { b.x = RIGHT-b.size; b.xstep = -b.xstep; if(b.y <= TOP) { b.y = TOP; b.ystep = -b.ystep; if(b.y >= BOTTOM-b.size) { b.y = BOTTOM-b.size; b.ystep = -b.ystep;

432 432 Java 의정석定石 2 판 - 연습문제풀이 if(collisioncheck(b)) { // 충돌하면실행을멈춘다. isplaying = false; break; // for repaint(); try { Thread.sleep(100); catch (Exception e) { // start() boolean collisioncheck(ball b) { // 충돌체크 // 1. 회색공의중심과빨간공의중심간의거리 (distance) 가회색공의 // 반지름 (BALL_SIZE/2) 과빨간공의반지름 (b.size) 보다같거나작으면 // true 를반환하고그렇지않으면 false 를반환한다. double dx = (b.x + b.size/2) - (x + BALL_SIZE/2); double dy = (b.y + b.size/2) - (y + BALL_SIZE/2); int distance = (int)(math.sqrt(dx*dx+dy*dy)); return distance < (b.size + BALL_SIZE)/2; public void paint(graphics g) { g.drawstring("number of balls :"+balls.size(),20,50); g.setcolor(color.light_gray); g.filloval(x, y, BALL_SIZE, BALL_SIZE); g.setcolor(color.red); int size = balls.size(); for(int i=0 ; i < size; i++) { Ball b = (Ball)balls.get(i); g.filloval(b.x, b.y, b.size, b.size); class BallGenerator extends Thread { public void run() { while(isplaying) { int x=(int)(math.random()*(right-left-ball.max_size))+left; int y=(int)(math.random()*(bottom-top-ball.max_size))+top; balls.add(new Ball(x,y)); try { Thread.sleep(3*1000); catch(exception e) { // run()

433 Java 의정석定石 2 판 - 연습문제풀이 433 class Ball { int x = 100; int y = 100; int size = 30; static final int MAX_SIZE = 30; static final int MIN_SIZE = 10; final int SPEED = 5; int xstep = SPEED; int ystep = SPEED; Ball(int x, int y) { this(x, y,(int)(math.random()*(max_size-min_size))+min_size); Ball(int x, int y, int size) { this.x = x; this.y = y; this.size = size; // class BouncingBall class Exercise13_11 { public static void main(string[] args) { new BouncingBall("Bouncing Ball").start(); [ 실행결과 ] [ 해설 ] collisioncheck() 는회색공과빨간색공의충돌을체크한다. 두공이충돌했는지 는두공의거리를측정함으로써간단히알수있다. 두공의거리가각공의반지름을 더한값보다작으면두공은충돌한것이다.

434 434 Java 의정석定石 2 판 - 연습문제풀이 아래의그림에서알수있듯이 (x,y) 와 (b.x, b.y) 의거리가 BALL_SIZE/2 + b.size/2 보다 작으면충돌이다. 두공의거리 (distance) 는아래의공식으로구할수있다. double dx = b.x - x; double dy = b.y - y; int distance = (int)(math.sqrt(dx*dx+dy*dy)); return distance < (b.size + BALL_SIZE)/2; (x, y) BALL_SIZE/2 b.y - y b.size/2 b.x - x (b.x, b.y) 그러나아직문제 13-7 에서와같은문제가남아있다. filloval() 이그리는원의좌표는원 점이아니기때문에, 원점의좌표를계산해야한다. (x, y) (b.x, b.y) (x+ball_size/2, y+ball_size/2) (b.x+b.size/2, b.y+b.size/2) 위의그림에서알수있듯이회색공이 (x, y) 에있을때, 회색공의원점은 (x+ball_size/2, y+ball_size/2) 이다. 즉, 각좌표에공의절반크기 (BALL_SIZE/2) 를더해줘야한다. 빨간공도마찬가지이다. 그래서이전의코드는다음과같이바뀌어야한다.

435 Java 의정석定石 2 판 - 연습문제풀이 435 double dx = b.x - x; double dx = (b.x + b.size/2) - (x + BALL_SIZE/2); double dy = b.y - y; double dy = (b.y + b.size/2) - (y + BALL_SIZE/2); 최종적으로다음과같은코드가만들어진다. // 1. 회색공의중심과빨간공의중심간의거리 (distance) 가회색공의 // 반지름 (BALL_SIZE/2) 과빨간공의반지름 (b.size) 보다같거나작으면 // true 를반환하고그렇지않으면 false 를반환한다. double dx = (b.x + b.size/2) - (x + BALL_SIZE/2); double dy = (b.y + b.size/2) - (y + BALL_SIZE/2); int distance = (int)(math.sqrt(dx*dx+dy*dy)); return distance < (b.size + BALL_SIZE)/2;

436 436 Java 의정석定石 2 판 - 연습문제풀이 Chapter 14 입출력 I/O

437 Java 의정석定石 2 판 - 연습문제풀이 437 [ 연습문제 - 모범답안 ] [14-1] 커맨드라인으로부터파일명과숫자를입력받아서, 입력받은파일의내용의처음 부터입력받은숫자만큼의라인을출력하는프로그램 (FileHead.java) 을작성하라. [Hint] BufferedReader 의 readline() 을사용하라. [ 실행결과 ] C:\jdk1.5\work\ch14>java FileHead 10 USAGE: java FileHead 10 FILENAME C:\jdk1.5\work\ch14>java FileHead 10 aaa aaa 은 / 는디렉토리이거나, 존재하지않는파일입니다. C:\jdk1.5\work\ch14>java FileHead 10 FileHead.java 1:import java.io.*; 2: 3:class FileHead 4:{ 5: public static void main(string[] args) 6: { 7: try { 8: int line = Integer.parseInt(args[0]); 9: String filename = args[1]; 10: C:\jdk1.5\work\ch14> [ 정답 ] [ 연습문제 ]/ch14/filehead.java import java.io.*; class FileHead { public static void main(string[] args) { try { int linenum = Integer.parseInt(args[0]); String filename = args[1]; File f = new File(fileName); if(f.exists()&&!f.isdirectory()) { BufferedReader br = new BufferedReader(new FileReader(fileName)); String line = ""; int i=1;

438 438 Java 의정석定石 2 판 - 연습문제풀이 while((line = br.readline())!=null && i <= linenum) { System.out.println(i+":"+line); i++; else { throw new FileNotFoundException(fileName +" 은 / 는디렉토리이거나, 존재하지않는파일입니다."); catch(filenotfoundexception e) { System.out.println(e.getMessage()); catch(exception e) { System.out.println("USAGE: java FileHead 10 FILENAME"); // main [ 해설 ] 파일을라인단위로읽기위해 BufferedReader 의 readline() 를사용했다. 작업을 하기에앞서사용자로부터입력받은이름의파일이존재하는지, 디렉토리는아닌지확인 해야한다. if(f.exists()&&!f.isdirectory()) { BufferedReader br = new BufferedReader(new FileReader(fileName)); 그다음에는반복문을이용해서입력받은라인수만큼만파일의내용을라인화면에출력 한다. while((line = br.readline())!=null && i <= linenum) { System.out.println(i+":"+line); i++; 참고로 while 문에사용된조건식이처리되는순서는다음과같다. (line = br.readline())!=null 1 line = br.readline() // readline() 으로읽은라인 ( 문자열 ) 을 line 에저장한다. 2 line!= nulll // line 에저장된값이 null 이아닌지비교한다. * readline() 은더이상읽을라인이없으면 null 을반환한다.

439 Java 의정석定石 2 판 - 연습문제풀이 439 [14-2] 지정된이진파일의내용을실행결과와같이 16 진수로보여주는프로그램 (HexaViewer.java) 을작성하라. [Hint] PrintStream 과 printf() 를사용하라. [ 실행결과 ] C:\jdk1.5\work\ch14>java HexaViewer HexaViewer.class CA FE BA BE A 00 0C 00 1E F A A 00 1F A A A A 0A 00 2B 00 2C 0A D 0A E 0A F 0A F A C 69 6E E F F 4C 69 6E 65 4E 75 6D C D E B 4C 6A F 6C 61 6E 67 2F 중간생략 C:\jdk1.5\work\ch14> [ 정답 ] [ 연습문제 ]/ch14/hexaviewer.java import java.io.*; class HexaViewer { public static void main(string[] args) throws IOException { if(args.length!=1) { System.out.println("USAGE: java HexaViewer FILENAME"); System.exit(0); String inputfile = args[0]; try { FileInputStream input = new FileInputStream(inputFile); PrintStream output = new PrintStream(System.out); int data = 0; int i=0; while((data = input.read())!=-1) { output.printf("%02x ", data); if(++i%16==0) output.println(); input.close(); output.close();

440 440 Java 의정석定石 2 판 - 연습문제풀이 catch (IOException e) { e.printstacktrace(); // main [ 해설 ] 사실 System.out 이 PrintStream 이기때문에굳이 PrintStream 을따로생성해서사 용할필요는없다. 그냥 System.out.printf() 를사용하면된다. 그러나출력대상이화면 이아니라파일로바뀐다면아래의붉은색부분만변경하면다른곳은고치지않아도된 다는장점이있다. FileInputStream input = new FileInputStream(inputFile); PrintStream output = new PrintStream(System.out); data 를 16 진수로출력하려면 printf 의 format 옵션중에서 '%x' 를사용해야한다. 빈자리를 0 으로채우는 2 자리 16 진수이어야하므로 '%02x' 가된다. while((data = input.read())!=-1) { output.printf("%02x ", data); // data 를두자리의 16 진수형태로출력한다. if(i++%16==0) output.println(); format 설명 결과 (int i=65) %d 10진수 (decimal integer) 65 %o 8진수 (octal integer) 101 %x 16진수 (hexadecimal integer) 41 %c 문자 A %s 문자열 65 %5d 5자리숫자. 빈자리는공백으로채운다. 65 %-5d 5자리숫자. 빈자리는공백으로채운다.( 왼쪽정렬 ) 65 %05d 5자리숫자. 빈자리는 0으로채운다

441 Java 의정석定石 2 판 - 연습문제풀이 441 [14-3] 다음은디렉토리의요약정보를보여주는프로그램이다. 파일의개수, 디렉토리의 개수, 파일의총크기를계산하는 countfiles() 를완성하시오. [ 연습문제 ]/ch14/directoryinfotest.java import java.io.*; class DirectoryInfoTest { static int totalfiles = 0; static int totaldirs = 0; static int totalsize = 0; public static void main(string[] args) { if(args.length!= 1) { System.out.println("USAGE : java DirectoryInfoTest DIRECTORY"); System.exit(0); File dir = new File(args[0]); if(!dir.exists()!dir.isdirectory()) { System.out.println(" 유효하지않은디렉토리입니다."); System.exit(0); countfiles(dir); System.out.println(); System.out.println(" 총 " + totalfiles + " 개의파일 "); System.out.println(" 총 " + totaldirs + " 개의디렉토리 "); System.out.println(" 크기 " + totalsize + " bytes"); // main public static void countfiles(file dir) { // 1. dir 의파일목록 (File[]) 을얻어온다. File[] files = dir.listfiles(); for(int i=0; i < files.length; i++) { // 2. 얻어온파일목록의파일중에서... 디렉토리이면, totaldirs의값을증가시키고 countfiles() 를재귀호출한다. if(files[i].isdirectory()) { totaldirs++; countfiles(files[i]); else { // 3. 파일이면, totlafiles를증가시키고파일의크기를 totalsize에더한다. totalfiles++; totalsize += files[i].length();

442 442 Java 의정석定石 2 판 - 연습문제풀이 // countfiles [ 실행결과 ] C:\jdk1.5\work>java DirectoryInfoTest. 총 786 개의파일 총 27 개의디렉토리 크기 bytes C:\jdk1.5\work>

443 Java 의정석定石 2 판 - 연습문제풀이 443 [14-4] 커맨드라인으로부터여러파일의이름을입력받고, 이파일들을순서대로합쳐 서새로운파일을만들어내는프로그램 (FileMergeTest.java) 을작성하시오. 단, 합칠파 일의개수에는제한을두지않는다. [ 실행결과 ] C:\jdk1.5\work\ch14>java FileMergeTest USAGE: java FileMergeTest MERGE_FILENAME FILENAME1 FILENAME2... C:\jdk1.5\work\ch14>java FileMergeTest result.txt 1.txt 2.txt 3.txt C:\jdk1.5\work\ch14>type result.txt C:\jdk1.5\work\ch14>java FileMergeTest result.txt 1.txt 2.txt C:\jdk1.5\work\ch14>type result.txt C:\jdk1.5\work\ch14>type 1.txt C:\jdk1.5\work\ch14>type 2.txt C:\jdk1.5\work\ch14>type 3.txt C:\jdk1.5\work\ch14> [ 정답 ] [ 연습문제 ]/ch14/filemergetest.java import java.io.*; import java.util.*; class FileMergeTest { public static void main(string[] args) { if(args.length < 2) { // 입력값이 2보다작으면, 메세지를출력하고종료한다. System.out.println("USAGE: java FileMergeTest MERGE_FILENAME FILENAME1 FILENAME2..."); System.exit(0); try { Vector v = new Vector();

444 444 Java 의정석定石 2 판 - 연습문제풀이 for(int i=1; i < args.length;i++) { File f = new File(args[i]); if(f.exists()) { v.add(new FileInputStream(args[i])); else { System.out.println(args[i]+ " - 존재하지않는파일입니다."); System.exit(0); SequenceInputStream input = new SequenceInputStream(v.elements()); FileOutputStream output = new FileOutputStream(args[0]); int data = 0; while((data = input.read())!=-1) { output.write(data); catch(ioexception e) { // main [ 해설 ] 여러개의파일을하나로연결하기위해서는 SequenceInputStream이적합하다. SequenceInputStream은여러 Stream을하나의 Stream처럼다룰수있다. 커맨드라인으로입력받은파일을 Vector에저장하고, 이 Vector로 SequenceInputStream 을생성한다음에읽고쓰면끝이다. 반복되는얘기지만, 사용자로부터입력받은값은항상유효성체크를해주어야한다. 입력받은파일이존재하지않을수도있기때문이다. 메서드 / 생성자 SequenceInputStream(Enumeration e) SequenceInputStream(InputStream s1, InputStream s2) 설명 Enumeration에저장된순서대로입력스트림을하나의스트림으로연결한다. 두개의입력스트림을하나로연결한다. [ 표 14-14] SequenceInputStream 의생성자 다음은 SequenceInputStream 의사용예이다 [ 사용예 1] Vector files = new Vector(); files.add(new FileInputStream("file.001")); files.add(new FileInputStream("file.002")); SequenceInputStream in = new SequenceInputStream(files.elements()); [ 사용예 2] FileInputStream file1 = new FileInputStream("file.001"); FileInputStream file2 = new FileInputStream("file.002"); SequenceInputStream in = new SequenceInputStream(file1, file2);

445 Java 의정석定石 2 판 - 연습문제풀이 445 [14-5] 다음은 FilterWriter 를상속받아서직접구현한 HtmlTagFilterWriter 를사용해 서주어진파일에있는태그를모두제거하는프로그램이다. HtmlTagFilterWriter 의 write() 가태그를제거하도록코드를완성하시오. [ 연습문제 ]/ch14/exercise14_5.java import java.io.*; class Exercise14_5 { public static void main(string[] args) { if(args.length!= 2) { System.out.println("USAGE: java Exercise14_5 TAGET_FILE RESULT_FILE"); System.exit(0); String inputfile = args[0]; String outputfile = args[1]; try { BufferedReader input = new BufferedReader(new FileReader(inputFile)); HtmlTagFilterWriter output = new HtmlTagFilterWriter(new FileWriter(outputFile)); int ch = 0; while((ch=input.read())!=-1) { output.write(ch); input.close(); output.close(); catch(ioexception e) { class HtmlTagFilterWriter extends FilterWriter { StringWriter tmp = new StringWriter(); boolean intag = false; HtmlTagFilterWriter(Writer out) { super(out);

446 446 Java 의정석定石 2 판 - 연습문제풀이 public void write(int c) throws IOException { // 1. 출력할문자 (c) 가 '<' 이면 intag의값을 true로한다. if(c=='<') { intag = true; // 2. 출력할문자 (c) 가 '>' 이면 intag의값을 false로한다. else if(c=='>' && intag) { intag = false; // 새로운 StringWriter를생성한다.( 기존 StringWriter의내용을버린다.) tmp = new StringWriter(); return; // 3. intag의값이 true이면, StringWriter에문자 (c) 를출력하고 if(intag) tmp.write(c); else // intag의값이 false이면, out에문자 (c) 를출력한다. out.write(c); public void close() throws IOException { out.write(tmp.tostring()); // StringWriter 의내용을출력하고 super.close(); // 조상의 close() 를호출해서기반스트림을닫는다. [ 실행결과 ] C:\jdk1.5\work\ch14>java Exercise14_5 test.html result.txt C:\jdk1.5\work\ch14>type result.txt New Document > 안녕하세요. 태그없애기테스트용파일입니다. < 태그가열린채로끝난것은태그로처리하지마세요. C:\jdk1.5\work\ch14>type test.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Document </TITLE> </HEAD> <BODY>

447 Java 의정석定石 2 판 - 연습문제풀이 447 > 안녕하세요. 태그없애기테스트용파일입니다. </BODY> < 태그가열린채로끝난것은태그로처리하지마세요. [ 해설 ] 태그가아닐때는기반스트림 (out) 에출력하고, 태그가시작되면 (c 가 '<' 이면 ) intag 의값을 true 로변경하고, intag 의값이 true 이면 tmp 에출력한다. // 3. intag의값이 true이면, StringWriter에문자 (c) 를출력하고 if(intag) tmp.write(c); // StringWriter tmp = new StringWriter(); else // intag의값이 false이면, out에문자 (c) 를출력한다. out.write(c); 태그가끝나면 (c가 '>' 이면 ), intag의값을 false로변경하고, 새로운 StringWriter를생 성해서 tmp에할당한다. 이렇게하면기존의내용 ( 태그 ) 은없어지게된다. // 1. 출력할문자 (c) 가 '<' 이면 intag의값을 true로한다. if(c=='<') { intag = true; // 2. 출력할문자 (c) 가 '>' 이면 intag의값을 false로한다. else if(c=='>' && intag) { intag = false; // 새로운 StringWriter를생성한다.( 기존 StringWriter의내용을버린다.) tmp = new StringWriter(); return; StringWriter 에내용이남아있을수있으므로, 스트림을닫기전에 StringWriter 의내용 을스트림에써주어야한다. public void close() throws IOException { out.write(tmp.tostring()); // StringWriter 의내용을출력하고 super.close(); // 조상의 close() 를호출해서기반스트림을닫는다.

448 448 Java 의정석定石 2 판 - 연습문제풀이 [14-6] 다음은콘솔명령어중에서디렉토리를변경하는 cd 명령을구현한것이다. 알맞 은코드를넣어 cd() 를완성하시오. [ 연습문제 ]/ch14/exercise14_6.java import java.io.*; import java.util.*; import java.util.regex.*; class Exercise14_6 { static String[] argarr; // 입력한매개변수를담기위한문자열배열 static File curdir; // 현재디렉토리 static { try { curdir = new File(System.getProperty("user.dir")); catch(exception e) { public static void main(string[] args) { Scanner s = new Scanner(System.in); while(true) { try { String prompt = curdir.getcanonicalpath() + ">>"; System.out.print(prompt); // 화면으로부터라인단위로입력받는다. String input = s.nextline(); input = input.trim(); // 입력받은값에서불필요한앞뒤공백을제거한다. argarr = input.split(" +"); String command = argarr[0].trim(); if("".equals(command)) continue; command = command.tolowercase(); // 명령어를소문자로바꾼다. if(command.equals("q")) { // q 또는 Q를입력하면실행종료한다. System.exit(0); else if(command.equals("cd")) { cd(); else { for(int i=0; i < argarr.length;i++) { System.out.println(argArr[i]);

449 Java 의정석定石 2 판 - 연습문제풀이 449 catch(exception e) { e.printstacktrace(); System.out.println(" 입력오류입니다."); // while(true) // main public static void cd() { if(argarr.length==1) { System.out.println(curDir); return; else if(argarr.length > 2) { System.out.println("USAGE : cd directory"); return; String subdir = argarr[1]; // 1. 입력된디렉토리 (subdir) 가 ".." 이면, if("..".equals(subdir)) { // 부모디렉토리 // 1.1 현재디렉토리의조상디렉토리를얻어서현재디렉토리로지정한다. File newdir = curdir.getparentfile(); if(newdir==null) { System.out.println(" 유효하지않은디렉토리입니다."); else { curdir = newdir; // 조상디렉토리를현재디렉토리로지정한다. // 2. 입력된디렉토리 (subdir) 가 "." 이면, 단순히현재디렉토리의경로를화면에출력한다. else if(".".equals(subdir)) { // 현재디렉토리 System.out.println(curDir); else { // 3. 1 또는 2의경우가아니면, // 3.1 입력된디렉토리 (subdir) 가현재디렉토리의하위디렉토리인지확인한다. File newdir = new File(curDir, subdir); if(newdir.exists() && newdir.isdirectory()) { // 3.2 확인결과가 true이면, 현재디렉토리 (curdir) 을입력된디렉토리 (subdir) 로변경한다. curdir = newdir; else { // 3.3 확인결과가 false이면, " 유효하지않은디렉토리입니다." 고화면에출력한다. System.out.println(" 유효하지않은디렉토리입니다."); // if

450 450 Java 의정석定石 2 판 - 연습문제풀이 // cd() [ 실행결과 ] C:\jdk1.5\work\ch14>java Exercise14_6 C:\jdk1.5\work\ch14>> C:\jdk1.5\work\ch14>>cd ch14 유효하지않은디렉토리입니다. C:\jdk1.5\work\ch14>>cd.. C:\jdk1.5\work>>cd ch14 C:\jdk1.5\work\ch14>> C:\jdk1.5\work\ch14>>cd. C:\jdk1.5\work\ch14 C:\jdk1.5\work\ch14>>q C:\jdk1.5\work\ch14> [ 해설 ] 콘솔 (console) 의 cd명령 (change directory) 을직접구현해보는문제이다. cd명령다음에이동할디렉토리를적어주는데, 현재디렉토리를의미하는. 과조상의디렉토리를의미하는.. 도처리해주어야하므로 if-else if로 3가지경우에대해처리하였다. // 1. 입력된디렉토리 (subdir) 가 ".." 이면, if("..".equals(subdir)) { // 부모디렉토리... // 2. 입력된디렉토리 (subdir) 가 "." 이면, 단순히현재디렉토리의경로를화면에출력한다. else if(".".equals(subdir)) { // 현재디렉토리 System.out.println(curDir); else { // 3. 1 또는 2의경우가아니면,... // if 니머지는별로어렵지않으니설명을생략하겠다.

451 Java 의정석定石 2 판 - 연습문제풀이 451 [14-7] 다음의코드는예제 을발전시킨것으로대화내용을파일에저장할수있는 기능을추가한프로그램이다. 저장 버튼을누르면대화내용이저장되도록알맞은코드 를넣어완성하시오. [ 연습문제 ]/ch14/chatwin2.java import java.io.*; import java.awt.*; import java.awt.event.*; class ChatWin2 extends Frame { String nickname = ""; TextArea ta = new TextArea(); Panel p = new Panel(); TextField tf = new TextField(30); Button bsave = new Button(" 저장 "); ChatWin2(String nickname) { super("chatting"); this.nickname = nickname; setbounds(200, 100, 300, 200); p.setlayout(new FlowLayout()); p.add(tf, "Center"); p.add(bsave, "Center"); add(ta, "Center"); add(p, "South"); addwindowlistener(new WindowAdapter(){ public void windowclosing(windowevent e) { System.exit(0); ); bsave.addactionlistener(new ActionListener(){ public void actionperformed(actionevent ae) { FileDialog filesave = new FileDialog(ChatWin2.this, " 파일저장 ", FileDialog.SAVE); filesave.setvisible(true); String filename = filesave.getdirectory() + filesave.getfile(); saveas(filename); );

452 452 Java 의정석定石 2 판 - 연습문제풀이 EventHandler handler = new EventHandler(); ta.addfocuslistener(handler); tf.addfocuslistener(handler); tf.addactionlistener(handler); ta.settext("#" + nickname + " 님즐거운채팅되세요."); ta.seteditable(false); setresizable(false); setvisible(true); tf.requestfocus(); void saveas(string filename) { FileWriter fw = null; BufferedWriter bw = null; try { fw = new FileWriter(fileName); bw= new BufferedWriter(fw); bw.write(ta.gettext()); // TextArea의내용을파일에저장한다. catch (IOException ie) { ie.printstacktrace(); finally { try { if(bw!=null) bw.close(); catch(ioexception e) { // try // saveas메서드의끝 public static void main(string[] args) { if(args.length!= 1) { System.out.println("USAGE : java ChatWin2 NICKNAME"); System.exit(0); new ChatWin2(args[0]); // main class EventHandler extends FocusAdapter implements ActionListener { public void actionperformed(actionevent ae) { String msg = tf.gettext(); if("".equals(msg)) return; ta.append("\r\n" + nickname +">"+ msg);

453 Java 의정석定石 2 판 - 연습문제풀이 453 tf.settext(""); public void focusgained(focusevent e) { tf.requestfocus(); // class EventHandler // class [ 실행결과 ] [ 해설 ] 답을보고나니쉬워서허탈할수도있을것같다. BufferedWriter를생성한다음에, ta.gettext() 로채팅내용을얻어다 write(string str) 을통해출력하면되는것이다. FileWriter fw = null; BufferedWriter bw = null; try { fw = new FileWriter(fileName); bw= new BufferedWriter(fw); bw.write(ta.gettext()); // TextArea의내용을파일에저장한다. 아래와같이코드를작성하면 write() 에서예외가발생하면 bw.close() 가수행되지않기때문에예외가발생해도수행되는 finally블럭에서 bw.close() 가호출되도록하는것이좋다. try { fw = new FileWriter(fileName); bw= new BufferedWriter(fw); bw.write(ta.gettext()); // TextArea의내용을파일에저장한다. bw.close(); // 윗줄 bw.write() 에서예외가발생하면이문장은수행되지않는다. catch (IOException ie) { ie.printstacktrace(); // try

454 454 Java 의정석定石 2 판 - 연습문제풀이 이전의코드를변경하여 finally블럭에서 bw.close() 를호출하도록했다. bw.close() 역시예외가발생할수있으므로 try-catch문으로감싸주었다. try { fw = new FileWriter(fileName); bw= new BufferedWriter(fw); bw.write(ta.gettext()); // TextArea의내용을파일에저장한다. catch (IOException ie) { ie.printstacktrace(); finally { try { if(bw!=null) bw.close(); catch(ioexception e) { // try

455 Java 의정석定石 2 판 - 연습문제풀이 455 [14-8] 다음의코드는파일로부터한줄씩데이터를읽어서보여주는프로그램이다. 버 튼을이용해서첫줄, 다음줄, 이전줄, 마지막줄로이동할수있으며, 각줄의개행문 자는 를사용한다. (1)~(2) 에알맞은코드를넣어완성하시오. [ 연습문제 ]/ch14/wordstudy.java import java.util.*; import java.io.*; import java.awt.*; import java.awt.event.*; class WordStudy extends Frame { Button first = new Button("<<"); Button prev = new Button("<"); Button next = new Button(">"); Button last = new Button(">>"); Panel buttons = new Panel(); TextArea ta = new TextArea(); ArrayList wordlist = new ArrayList(); final String WORD_FILE = "word_data.txt"; final String CR_LF = System.getProperty("line.separator"); // 개행문자 int pos = 0; WordStudy(String title) { super(title); buttons.add(first); buttons.add(prev); buttons.add(next); buttons.add(last); add("south", buttons); add("center", ta); EventHandler handler = new EventHandler(); addwindowlistener(handler); first.addactionlistener(handler); prev.addactionlistener(handler); next.addactionlistener(handler); last.addactionlistener(handler); loadfile(word_file); setbackground(color.black); setsize(300, 200); setlocation(200, 200); setresizable(true);

456 456 Java 의정석定石 2 판 - 연습문제풀이 setvisible(true); showfirst(); void showfirst() { pos = 0; display(pos); void showprevious() { pos = (pos > 0)? --pos : 0; display(pos); void shownext() { int size = wordlist.size(); pos = (pos < size-1)? ++pos : size-1; display(pos); void showlast() { pos = wordlist.size()-1; display(pos); void display(int pos) { // pos위치에있는라인의내용을보여준다. // 1. wordlist에서 pos번째의위치에있는데이터를읽어온다. String tmp = (String)wordList.get(pos); StringBuffer sb = new StringBuffer(tmp.length()); // 2. StringTokenizer 를이용해서 를구분자로자른다. StringTokenizer st = new StringTokenizer(tmp, " "); // 3. 잘라진 Token에개행문자 (CR_LF) 를붙여서 StringBuffer에붙인다.(append) while(st.hasmoretokens()) { sb.append(st.nexttoken()).append(cr_lf); // 4. StringBuffer의내용을뽑아서 TextArea에보여준다. ta.settext(sb.tostring()); void loadfile(string filename) { try { BufferedReader br = new BufferedReader(new FileReader(fileName)); String line = "";

457 Java 의정석定石 2 판 - 연습문제풀이 457 // 1. BuffredReader와 FileReader를이용해서파일의내용을라인단위로읽는다. while((line = br.readline())!=null) { // 2. 읽어온라인을 wordlist에저장한다. wordlist.add(line); catch (IOException e) { // 3. 만일예외가발생하면프로그램을종료한다. System.out.println(" 데이터파일을읽을수없습니다."); System.exit(1); public static void main(string args[]) { WordStudy mainwin = new WordStudy("Word Study"); class EventHandler extends WindowAdapter implements ActionListener { public void actionperformed(actionevent ae) { Button b = (Button)ae.getSource(); if(b==first) { showfirst(); else if(b==prev) { showprevious(); else if(b==next) { shownext(); else if(b==last) { showlast(); public void windowclosing(windowevent e) { System.exit(0); // class EventHandler [word_data.txt] mandatory 1. 명령의 2. 통치를위임받은 3. 강제의, 의무의 (obli-gatory); 필수의 preliminary 1. 사전준비 2. 예비시험 3. 주경기이전에펼쳐지는개막경기 commitment 1. 위탁, 위임 ; 위원회회부 2. 인도 ; 투옥, 구류, 수감 3. 언질 [ 공약 ] 을주기 prominent 1. 현저한, 두드러진 2. 돌기한, 양각된 3. 탁월한, 걸출한, 유명한 ; 중요한 Tell me the reason for coming here. 여기에온이유를내게말해라. There is something different about you today. 너오늘평소와좀다르구나. He jumped up and down when he got the news. 그는뉴스를듣고펄쩍뛰었다.

458 458 Java 의정석定石 2 판 - 연습문제풀이 When I opened it, I found a surprise. 그것을열었을때, 나는놀라운것을발견했다. I have known him since he was a child. 나는그를어려서부터알고있다. [ 실행결과 ]

459 Java 의정석定石 2 판 - 연습문제풀이 459 [14-9] 다음은메모장프로그램의일부인데, fileopen() 과 saveas() 가아직구현되어 있지않다. 이두메서드를구현하여프로그램을완성하시오. [ 연습문제 ]/ch14/exercise14_9.java import java.awt.*; import java.awt.event.*; import java.io.*; class Exercise14_9 extends Frame { String filename; TextArea content; MenuBar mb; Menu mfile; MenuItem minew, miopen, misaveas, miexit; Exercise14_9(String title) { super(title); content = new TextArea(); add(content); mb mfile = new MenuBar(); = new Menu("File"); minew = new MenuItem("New"); miopen = new MenuItem("Open"); misaveas = new MenuItem("Save As..."); miexit = new MenuItem("Exit"); mfile.add(minew); mfile.add(miopen); mfile.add(misaveas); mfile.addseparator(); // 메뉴분리선 (separator) 을넣는다. mfile.add(miexit); mb.add(mfile); // MenuBar 에 Menu 를추가한다. setmenubar(mb); // Frame 에 MenuBar 를포함시킨다. // 메뉴에이벤트핸들러를등록한다. MyHandler handler = new MyHandler(); minew.addactionlistener(handler); miopen.addactionlistener(handler); misaveas.addactionlistener(handler); miexit.addactionlistener(handler); setsize(300, 200); setvisible(true);

460 460 Java 의정석定石 2 판 - 연습문제풀이 // 선택된파일의내용을읽어서 TextArea에보여주는메서드 void fileopen(string filename) { FileReader fr = null; BufferedReader br = null; StringWriter sw = null; try { fr = new FileReader(fileName); br = new BufferedReader(fr); sw = new StringWriter(); String line = ""; // 1. BuffredReader와 FileReader를이용해서지정된파일을 // 라인단위로읽는다. while ((line=br.readline())!=null) { // 2. StringWriter에출력한다. sw.write(line); sw.write('\n'); // 개행문자를출력한다. // 3. StringWriter의내용을 content(textarea) 에보여준다. content.settext(sw.tostring()); catch(ioexception e) { e.printstacktrace(); finally { try { if(br!=null) br.close(); catch(ioexception e) { // fileopen메서드의끝 // TextArea의내용을지정된파일에저장하는메서드 void saveas(string filename) { try { // 1. BuffredWriter와 FileWriter를생성한다. fw = new FileWriter(fileName); bw = new BufferedWriter(fw); // 2. content에있는내용을가져와서 BufferedWriter에출력한다. bw.write(content.gettext()); // TextArea의내용을파일에저장한다. catch (IOException ie) { ie.printstacktrace(); finally { try { // 3. BufferedWriter를닫는다.

461 Java 의정석定石 2 판 - 연습문제풀이 461 if(bw!=null) bw.close(); catch(ioexception e) { // try // saveas메서드의끝 public static void main(string args[]) { Exercise14_9 mainwin = new Exercise14_9("Text Editor"); // main 메서드의끝 // 메뉴를클릭했을때메뉴별처리코드 class MyHandler implements ActionListener { public void actionperformed(actionevent e) { String command = e.getactioncommand(); if(command.equals("new")) { content.settext(""); else if(command.equals("open")) { FileDialog fileopen = new FileDialog(Exercise14_9.this, " 파일열기 "); fileopen.setvisible(true); filename = fileopen.getdirectory() + fileopen.getfile(); System.out.println(fileName); // 선택된파일의내용을 TextArea에보여준다. fileopen(filename); else if(command.equals("save As...")) { FileDialog filesave = new FileDialog(Exercise14_9.this, " 파일저장 ",FileDialog.SAVE); filesave.setvisible(true); filename = filesave.getdirectory() + filesave.getfile(); System.out.println(fileName); // 현재 TextArea의내용을선택된파일에저장한다. saveas(filename); else if(command.equals("exit")) { System.exit(0); // 프로그램을종료시킨다. // class MyHandler // Exercise14_9클래스의끝

462 462 Java 의정석定石 2 판 - 연습문제풀이 [ 실행결과 ] [ 해설 ] 입력의효율을높이기위해서 BufferedReader의 readline() 을사용했다. readline() 대신 read() 를사용해도괜찮지만효율은떨어진다. String line = ""; // 1. BuffredReader와 FileReader를이용해서지정된파일을 // 라인단위로읽는다. while ((line=br.readline())!=null) { // 2. StringWriter에출력한다. sw.write(line); sw.write('\n'); // 개행문자를출력한다. // 3. StringWriter의내용을 content(textarea) 에보여준다. content.settext(sw.tostring()); readline() 대신 read() 를사용한코드는다음과같다. readline() 과달리개행문자를출 력할필요가없다. int ch = 0; while ((ch=br.read())!=-1) { sw.write(ch); content.settext(sw.tostring()); 읽어서바로화면에출력할수도있지만, 효율도떨어지고출력하는과정도보이기때문 에 StringWriter 에출력한다음에한번에모아서출력하도록했다.

463 Java 의정석定石 2 판 - 연습문제풀이 463 Chapter 15 네트워킹 Networking

464 464 Java 의정석定石 2 판 - 연습문제풀이 [ 연습문제 - 모범답안 ] [15-1] ip 주소가 이고서브넷마스크 (subnet mask) 가 일 때, 네트워크주소와호스트주소를계산하여화면에출력하는프로그램을작성하시오. 단, 비트연산자를사용해서계산해야한다. [ 실행결과 ] 네트워크주소 : 호스트주소 : [ 정답 ] [ 연습문제 ]/ch15/exercise15_1.java class Exercise15_1 { public static void main(string[] args) { byte[] ip = {(byte)192,(byte)168,(byte)10,(byte)100; byte[] subnet = {(byte)255,(byte)255,(byte)255,(byte)0; byte[] nwaddress = new byte[4]; // 네트워크주소 byte[] hostaddress = new byte[4]; // 호스트주소 System.out.print(" 네트워크주소 :"); for(int i=0; i < ip.length;i++) { nwaddress[i] = (byte)(ip[i] & subnet[i]); // & 연산을수행한다. System.out.print(nwAddress[i] >=0? nwaddress[i] : nwaddress[i]+256); System.out.print("."); System.out.println(); System.out.print(" 호스트주소 :"); for(int i=0; i < ip.length;i++) { hostaddress[i] = (byte)(ip[i] & ~subnet[i]); // & 연산을수행한다. System.out.print(hostAddress[i] >=0? hostaddress[i] : hostaddress[i]+256); System.out.print("."); System.out.println(); [ 해설 ] 바이트배열에 ip 주소와서브넷마스크를저장한다음에반복문을이용해서 1 byte 씩 & 연산을하면호스트주소를얻을수있다. 그리고서브넷마스크에 ~ 연산을 취한다음에 ip 와 & 연산을취하면네트워크주소를얻을수있다.

465 Java 의정석定石 2 판 - 연습문제풀이 465 IP 주소 네트워크주소 호스트주소 서브넷마스크 (Subnet Mask) [ 그림 15-1] IP 주소 ( ) 와서브넷마스크 ( ) 의 2 진법표기 IP 주소와서브넷마스크를비트연산자 & 로연산하면 IP 주소에서네트워크주소만을뽑아낼 수있다 & [ 그림 15-2] IP 주소 ( ) 와서브넷마스크 ( ) 의 & 연산 - 네트워크주소 IP 주소와서브넷마스크에비트연산자 ~ 로연산한다음에비트연산자 & 로연산하면 IP 주 소에서호스트주소만을뽑아낼수있다. 서브넷마스크에 ~ 연산한결과는십진수로 이고이진수로는 이다 & [ 그림 15-3] IP 주소 ( ) 와 ~ 서브넷마스크 ( ) 의 & 연산 - 호스트주소 부호없는정수 : 부호있는정수 : -1 [ 그림 14-3] 모든 bit 의값이 1 인 1 byte(8 bit) 위와같이모든 bit 의값이 1 인 1 byte 의데이터가있다고할때, 왼쪽에서첫번째비트 를부호로인식하지않으면부호없는 1 byte 가되어범위는 0~255 이므로이값은최대

466 466 Java 의정석定石 2 판 - 연습문제풀이 값인 255 가되지만, 부호로인식하는경우범위는 -128~127 이되고, 이값은 0 보다 1 작 은값인 -1 이된다. 결국같은데이터이지만자바의자료형인 byte 의범위가부호있는 1 byte 정수의범위 인 -128~127 이기때문에 -1 로인식한다는것이다. 그래서이값을 0~255 사이의값으로 변환하려면 256 을더해주어야한다. for(int i=0; i < ip.length;i++) { nwaddress[i] = (byte)(ip[i] & subnet[i]); // & 연산을수행한다. System.out.print(nwAddress[i] >=0? nwaddress[i] : nwaddress[i]+256); System.out.print("."); 그래서부호있는정수를부호없는정수로바꾸려면, 양수일때는그대로놔두고음수일 때만 256 을더해주면된다. 반대로부호가없는값을부호가있는값으로바꾸려면, 127 보다큰값의경우에만 256 을빼주면된다. 예를들어 -1 을부호가없는값으로바꾸려면, 256 을더해서 = 255 가된다. byte[] subnet = {(byte)255,(byte)255,(byte)255,(byte)0; byte[] subnet = { -1, -1, -1, 0; 0~255 사이의부호없는정수를부호있는정수로바꾸는또다른방법은위와같이 byte 로형 변환하는것이다. 위의두코드는같은결과를얻는다.

467 Java 의정석定石 2 판 - 연습문제풀이 467 [15-2] 다음중 TCP의특징이아닌것은? a. 전화와같은 1:1 연결기반의프로토콜이다. b. 데이터의전송순서가보장된다. c. UDP보다전송속도가빠르다. d. 데이터의수신여부를확인한다. [ 정답 ] c [ 해설 ] 항목 TCP UDP 연결방식. 연결기반 (connection-oriented) - 연결후통신 ( 전화기 ) - 1:1 통신방식. 비연결기반 (connectionless-oriented) - 연결없이통신 ( 소포 ) - 1:1, 1:n, n:n 통신방식 특징. 데이터의경계를구분안함 (byte-stream). 신뢰성있는데이터전송 - 데이터의전송순서가보장됨 - 데이터의수신여부를확인함 ( 데이터가손실되면재전송됨 ) - 패킷을관리할필요가없음.UDP보다전송속도가느림. 데이터의경계를구분함.(datagram). 신뢰성없는데이터전송 - 데이터의전송순서가바뀔수있음 - 데이터의수신여부를확인안함 ( 데이터가손실되어도알수없음 ) - 패킷을관리해주어야함.TCP보다전송속도가빠름 관련클래스.Socket.ServerSocket.DatagramSocket.DatagramPacket.MulticastSocket [ 표 15-5] TCP 와 UDP 의비교

468 468 Java 의정석定石 2 판 - 연습문제풀이 [15-3] TextField 에 URL 을입력하고 Enter 키를누르면해당페이지의소스를보여주는 'Source Viwer' 프로그램이다. 예제 15-4 를참고해서 (1) 에알맞은코드를넣어완성하시 오. [ 연습문제 ]/ch15/exercise15_3.java import java.net.*; import java.io.*; import java.awt.*; import java.awt.event.*; class SourceViewer extends Frame { TextField tf = new TextField(); TextArea ta = new TextArea(); SourceViewer(String title) { super(title); add(tf, "North"); add(ta, "Center"); tf.addactionlistener(new ActionListener(){ public void actionperformed(actionevent ae) { displaysource(); ); addwindowlistener(new WindowAdapter() { public void windowclosing(windowevent we) { System.exit(0); ); setbounds(500, 200, 500, 300); setvisible(true); void displaysource() { URL url = null; BufferedReader input = null; String address = tf.gettext().trim(); String line = ""; ta.settext(""); try { if(!address.startswith(" address = "

469 Java 의정석定石 2 판 - 연습문제풀이 469 url = new URL(address); input = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8")); while((line=input.readline())!=null) { ta.append(line); ta.append("\n"); input.close(); catch(exception e) { ta.settext(" 유효하지않은 URL입니다."); // displaysource() public static void main(string[] args) { SourceViewer mainwin = new SourceViewer("Source Viewer"); [ 실행결과 ] [ 해설 ] URL클래스를이용해서해당 URL으로부터데이터를읽어오는문제이다. 책의예제 15-4를참고하면어렵지않게작성할수있었을것이다. url = new URL(address); input = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8")); while((line=input.readline())!=null) { ta.append(line); ta.append("\n");

470 470 Java 의정석定石 2 판 - 연습문제풀이 좀더설명을해야할부분이있다면아래의코드인데, 우리가읽어오고자하는내용이 HTML페이지 ( 텍스트 ) 이기때문에 openstream() 이반환하는 InputStream을 InputStreamReader를이용해서문자기반의스트림 (BufferedReader) 으로변환하였다. 만일이미지와같은바이너리파일을읽어올때는 InputStreamReader를이용할필요없이바로 BufferedIinputStream을생성하면된다. url = new URL(address); input = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8")); InputStreamReader을이용해서 URL의텍스트데이터를읽어올때주의해야할점은인코딩을지정해주어야한다는것이다. 인코딩을지정해주지않으면 OS에서사용하는인코딩, 예를들어 XP의경우 MS949로, 지정된다. url = new URL(address); input = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8")); InputStreamReader를생성할때지정해준인코딩하고읽어올 URL의텍스트의인코딩이일치하지않으면내용이바르게보이지않을수있다. 특히영어가아닌한글이나일본어등으로작성된페이지들이그렇다. 다음은어떤 HTML의앞부분인데 meta태그의 content속성에보면인코딩 ( 캐릭터셋, charset) 을알려준다. 페이지를보여주기전에 HTML의앞부분만읽어서인코딩을알아낸다음에화면에보여주면페이지의내용을온전히보여줄수있을것이다. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " <html xmlns=" <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" />...

471 Java 의정석定石 2 판 - 연습문제풀이 471 [15-4] 다음의코드는예제 13-37(p.753) 과 TCP 통신을하는예제 15-6, 15-7 을결합하여 GUI 채팅프로그램을작성한것이다. (1)~(4) 에알맞은코드를넣어프로그램을완성하시 오. [ 연습문제 ]/ch15/chatserver.java import java.net.*; import java.io.*; import java.awt.*; import java.awt.event.*; class ChatServer extends Frame { String nickname = ""; DataOutputStream out; DataInputStream in; Panel p = new Panel(); TextArea ta = new TextArea(); TextField tf = new TextField(); ChatServer(String nickname) { super("chatting"); this.nickname = nickname; p.setlayout(new BorderLayout()); p.add(tf, "Center"); add(ta, "Center"); add(p, "South"); addwindowlistener(new WindowAdapter(){ public void windowclosing(windowevent e) { System.exit(0); ); EventHandler handler = new EventHandler(); ta.addfocuslistener(handler); tf.addfocuslistener(handler); tf.addactionlistener(handler); ta.seteditable(false); setbounds(200, 200, 300, 200); setvisible(true); tf.requestfocus(); void startserver() {

472 472 Java 의정석定石 2 판 - 연습문제풀이 ServerSocket serversocket = null; Socket socket = null; try { // 1. 서비소켓을생성하여 7777번포트와결합시킨다. serversocket = new ServerSocket(7777); // 2. ta에 " 서버가준비되었습니다." 라고보여준다. ta.settext(" 서버가준비되었습니다."); // 3. 상대방의연결을기다린다. socket = serversocket.accept(); // 4. ta에 " 상대방과연결되었습니다." 라고보여준다. ta.append("\r\n" +" 상대방과연결되었습니다."); // 5. 연결된상대방소켓의입력스트림과출력스트립을얻어온다. in = new DataInputStream(socket.getInputStream()); out = new DataOutputStream(socket.getOutputStream()); // 6. 반복문을이용해서입력스트림이 null이아닌동안 while(in!=null) { try { // 입력스트림으로부터데이터를읽어서 ta에 append한다. String msg = in.readutf(); ta.append("\r\n" + msg); catch(ioexception e) { catch (Exception e) { e.printstacktrace(); public static void main(string[] args) { if(args.length!= 1) { System.out.println("USAGE : java ChatServer NICKNAME"); System.exit(0); ChatServer chatwin = new ChatServer(args[0]); chatwin.startserver(); // main class EventHandler extends FocusAdapter implements ActionListener { public void actionperformed(actionevent ae) { String msg = tf.gettext(); if("".equals(msg)) return; if(out!=null) {

473 Java 의정석定石 2 판 - 연습문제풀이 473 try { out.writeutf(nickname+">"+msg); catch(ioexception e) { ta.append("\r\n" + nickname +">"+ msg); tf.settext(""); public void focusgained(focusevent e) { tf.requestfocus(); // class EventHandler // class [ 실행결과 ] [ 연습문제 ]/ch15/chatclient.java import java.net.*; import java.io.*; import java.awt.*; import java.awt.event.*; class ChatClient extends Frame { String nickname = ""; String serverip = ""; int serverport = 0; DataOutputStream out; DataInputStream in; Panel p = new Panel(); TextArea ta = new TextArea(); TextField tf = new TextField();

474 474 Java 의정석定石 2 판 - 연습문제풀이 ChatClient(String nickname, String serverip, String serverport) { super("chatting with " + serverip +":" + serverport); this.nickname = nickname; this.serverip = serverip; this.serverport = Integer.parseInt(serverPort); setbounds(600, 200, 300, 200); p.setlayout(new BorderLayout()); p.add(tf, "Center"); add(ta, "Center"); add(p, "South"); addwindowlistener(new WindowAdapter(){ public void windowclosing(windowevent e) { System.exit(0); ); EventHandler handler = new EventHandler(); ta.addfocuslistener(handler); tf.addfocuslistener(handler); tf.addactionlistener(handler); ta.seteditable(false); setvisible(true); tf.requestfocus(); void startclient() { try { // 1. 소켓을생성하여 serverip의 serverport에연결한다. Socket socket = new Socket(serverIp, serverport); // 2. ta에 " 상대방과연결되었습니다." 라고보여준다. ta.settext(" 상대방과연결되었습니다."); // 3. 연결된상대방소켓의입력스트림과출력스트립을얻어온다. in = new DataInputStream(socket.getInputStream()); out = new DataOutputStream(socket.getOutputStream()); // 4. 반복문을이용해서입력스트림이 null이아닌동안 while(in!=null) { try { // 입력스트림으로부터데이터를읽어서 ta에 append한다. String msg = in.readutf(); ta.append("\r\n" + msg); catch(ioexception e) {

475 Java 의정석定石 2 판 - 연습문제풀이 475 catch(connectexception ce) { ta.settext(" 상대방과연결할수없습니다."); ce.printstacktrace(); catch(ioexception ie) { ie.printstacktrace(); catch(exception e) { e.printstacktrace(); public static void main(string[] args) { if(args.length!= 3) { System.out.println("USAGE : java ChatClient NICKNAME SERVER_IP SERVER_PORT"); System.exit(0); ChatClient chatwin = new ChatClient(args[0],args[1],args[2]); chatwin.startclient(); // main class EventHandler extends FocusAdapter implements ActionListener { public void actionperformed(actionevent ae) { String msg = tf.gettext(); if("".equals(msg)) return; if(out!=null) { try { out.writeutf(nickname+">"+msg); catch(ioexception e) { ta.append("\r\n" + nickname +">"+ msg); tf.settext(""); public void focusgained(focusevent e) { tf.requestfocus(); // class EventHandler // class

476 476 Java 의정석定石 2 판 - 연습문제풀이 [ 실행결과 ]

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

32 Java 의정석定石 2 판 - 연습문제풀이 Chapter 6 객체지향프로그래밍 I Object-oriented Programming I 32 Chapter 6 객체지향프로그래밍 I Object-oriented Programming I 33 [ 연습문제 ] [6-1] 다음과같은멤버변수를갖는 SutdaCard클래스를정의하시오. 타입 변수명 설명 int num 카드의숫자.(1~10사이의정수 ) boolean iskwang 광 ( 光 ) 이면 true, 아니면 false [6-2] 문제 6-1 에서정의한

More information

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

Chapter 객체지향프로그래밍 I Object-oriented Programming I Chapter 객체지향프로그래밍 I Object-oriented Programming I [ 연습문제 ] [6-1] 다음과같은멤버변수를갖는 SutdaCard 클래스를정의하시오. 타입 변수명 설명 int num 카드의숫자.(1~10 사이의 정수 ) boolean iskwang 광 ( 光 ) 이면 true, 아니면 false [6-2] 문제 6-1 에서정의한 SutdaCard

More information

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

java_jungsuk3_슰ì−µë¬¸ì€œì€—ì²´_ hwp Web Programming 실습 JAVA 연습문제 01 변수 / 연산자 / 조건문 / 반복문 / 배열 1 4 JAVA 연습문제 01 Chapter 변수 Variable 5 [ 연습문제 ] [2-1] 다음표의빈칸에 8 개의기본형 (primitive type) 을알맞은자리에넣으시오. 종류 논리형 크기 1 byte 2 byte 4 byte 8 byte 문자형 정수형

More information

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

java_jungsuk3_슰ì−µë¬¸ì€œì€—ì²´_ hwp Java의 정석定石 3판 - 연습문제 풀이 연습문제 풀이 ver.20170131v1 1 2 Java의정석定石 책이너무두꺼워지는것을막으려고불가피하게별도의 PDF파일로연습문제를 제공하게되었습니다. 많은양해바랍니다. 연습문제가먼저나오고풀이는뒷부 분에넣었습니다. 답을보기원하시면해당예제의번호로검색하시면답을찾으 실수있습니다. 연습문제중에좀어려운것들도있는데, 책안에답이있는경우가많이있습니

More information

PowerPoint Presentation

PowerPoint Presentation 객체지향프로그래밍 클래스, 객체, 메소드 ( 실습 ) 손시운 ssw5176@kangwon.ac.kr 예제 1. 필드만있는클래스 텔레비젼 2 예제 1. 필드만있는클래스 3 예제 2. 여러개의객체생성하기 4 5 예제 3. 메소드가추가된클래스 public class Television { int channel; // 채널번호 int volume; // 볼륨 boolean

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 실습 1 배효철 th1g@nate.com 1 목차 조건문 반복문 System.out 구구단 모양만들기 Up & Down 2 조건문 조건문의종류 If, switch If 문 조건식결과따라중괄호 { 블록을실행할지여부결정할때사용 조건식 true 또는 false값을산출할수있는연산식 boolean 변수 조건식이 true이면블록실행하고 false 이면블록실행하지않음 3

More information

Microsoft PowerPoint - Java7.pptx

Microsoft PowerPoint - Java7.pptx HPC & OT Lab. 1 HPC & OT Lab. 2 실습 7 주차 Jin-Ho, Jang M.S. Hanyang Univ. HPC&OT Lab. jinhoyo@nate.com HPC & OT Lab. 3 Component Structure 객체 (object) 생성개념을이해한다. 외부클래스에대한접근방법을이해한다. 접근제어자 (public & private)

More information

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

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 (   ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각 JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( http://java.sun.com/javase/6/docs/api ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각선의길이를계산하는메소드들을작성하라. 직사각형의가로와세로의길이는주어진다. 대각선의길이는 Math클래스의적절한메소드를이용하여구하라.

More information

PowerPoint Presentation

PowerPoint Presentation Class - Property Jo, Heeseung 목차 section 1 클래스의일반구조 section 2 클래스선언 section 3 객체의생성 section 4 멤버변수 4-1 객체변수 4-2 클래스변수 4-3 종단 (final) 변수 4-4 멤버변수접근방법 section 5 멤버변수접근한정자 5-1 public 5-2 private 5-3 한정자없음

More information

TEST BANK & SOLUTION

TEST BANK & SOLUTION TEST BANK & SOLUTION 어서와자바는처음이지!" 를강의교재로채택해주셔서감사드립니다. 본문제집을만드는데나름대로노력을기울였으나제가가진지식의한계로말미암아잘못된부분이있을것으로사료됩니다. 잘못된부분을발견하시면 chunik@sch.ac.kr로연락주시면더좋은책을만드는데소중하게사용하겠습니다. 다시한번감사드립니다. 1. 자바언어에서지원되는 8 가지의기초자료형은무엇인가?

More information

슬라이드 1

슬라이드 1 UNIT 16 예외처리 로봇 SW 교육원 3 기 최상훈 학습목표 2 예외처리구문 try-catch-finally 문을사용핛수있다. 프로그램오류 3 프로그램오류의종류 컴파일에러 (compile-time error) : 컴파일실행시발생 럮타임에러 (runtime error) : 프로그램실행시발생 에러 (error) 프로그램코드에의해서해결될수없는심각핚오류 ex)

More information

JAVA PROGRAMMING 실습 08.다형성

JAVA PROGRAMMING 실습 08.다형성 2015 학년도 2 학기 1. 추상메소드 선언은되어있으나코드구현되어있지않은메소드 abstract 키워드사용 메소드타입, 이름, 매개변수리스트만선언 public abstract String getname(); public abstract void setname(string s); 2. 추상클래스 abstract 키워드로선언한클래스 종류 추상메소드를포함하는클래스

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 @ Lesson 2... ( ). ( ). @ vs. logic data method variable behavior attribute method field Flow (Type), ( ) member @ () : C program Method A ( ) Method B ( ) Method C () program : Java, C++, C# data @ Program

More information

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

Microsoft PowerPoint 자바-기본문법(Ch2).pptx 자바기본문법 1. 기본사항 2. 자료형 3. 변수와상수 4. 연산자 1 주석 (Comments) 이해를돕기위한설명문 종류 // /* */ /** */ 활용예 javadoc HelloApplication.java 2 주석 (Comments) /* File name: HelloApplication.java Created by: Jung Created on: March

More information

Microsoft PowerPoint - 2강

Microsoft PowerPoint - 2강 컴퓨터과학과 김희천교수 학습개요 Java 언어문법의기본사항, 자료형, 변수와상수선언및사용법, 각종연산자사용법, if/switch 등과같은제어문사용법등에대해설명한다. 또한 C++ 언어와선언 / 사용방법이다른 Java의배열선언및사용법에대해서설명한다. Java 언어의효과적인활용을위해서는기본문법을이해하는것이중요하다. 객체지향의기본개념에대해알아보고 Java에서어떻게객체지향적요소를적용하고있는지살펴본다.

More information

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

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2 객체지향프로그래밍 IT CookBook, 자바로배우는쉬운자료구조 q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2 q 객체지향프로그래밍의이해 v 프로그래밍기법의발달 A 군의사업발전 1 단계 구조적프로그래밍방식 3 q 객체지향프로그래밍의이해 A 군의사업발전 2 단계 객체지향프로그래밍방식 4 q 객체지향프로그래밍의이해 v 객체란무엇인가

More information

JAVA PROGRAMMING 실습 09. 예외처리

JAVA PROGRAMMING 실습 09. 예외처리 2015 학년도 2 학기 예외? 프로그램실행중에발생하는예기치않은사건 예외가발생하는경우 정수를 0으로나누는경우 배열의크기보다큰인덱스로배열의원소를접근하는경우 파일의마지막부분에서데이터를읽으려고하는경우 예외처리 프로그램에문제를발생시키지않고프로그램을실행할수있게적절한조치를취하는것 자바는예외처리기를이용하여예외처리를할수있는기법제공 자바는예외를객체로취급!! 나뉨수를입력하시오

More information

gnu-lee-oop-kor-lec06-3-chap7

gnu-lee-oop-kor-lec06-3-chap7 어서와 Java 는처음이지! 제 7 장상속 Super 키워드 상속과생성자 상속과다형성 서브클래스의객체가생성될때, 서브클래스의생성자만호출될까? 아니면수퍼클래스의생성자도호출되는가? class Base{ public Base(String msg) { System.out.println("Base() 생성자 "); ; class Derived extends Base

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 @ Lesson 3 if, if else, if else if, switch case for, while, do while break, continue : System.in, args, JOptionPane for (,, ) @ vs. logic data method variable Data Data Flow (Type), ( ) @ Member field

More information

PowerPoint Presentation

PowerPoint Presentation public class SumTest { public static void main(string a1[]) { int a, b, sum; a = Integer.parseInt(a1[0]); b = Integer.parseInt(a1[1]); sum = a + b ; // 두수를더하는부분입니다 System.out.println(" 두수의합은 " + sum +

More information

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D> Power Java 제 8 장클래스와객체 I 이번장에서학습할내용 클래스와객체 객체의일생직접 메소드클래스를 필드작성해 UML 봅시다. QUIZ 1. 객체는 속성과 동작을가지고있다. 2. 자동차가객체라면클래스는 설계도이다. 먼저앞장에서학습한클래스와객체의개념을복습해봅시다. 클래스의구성 클래스 (class) 는객체의설계도라할수있다. 클래스는필드와메소드로이루어진다.

More information

PowerPoint Presentation

PowerPoint Presentation Package Class 3 Heeseung Jo 목차 section 1 패키지개요와패키지의사용 section 2 java.lang 패키지의개요 section 3 Object 클래스 section 4 포장 (Wrapper) 클래스 section 5 문자열의개요 section 6 String 클래스 section 7 StringBuffer 클래스 section

More information

금오공대 컴퓨터공학전공 강의자료

금오공대 컴퓨터공학전공 강의자료 C 프로그래밍프로젝트 Chap 14. 포인터와함수에대한이해 2013.10.09. 오병우 컴퓨터공학과 14-1 함수의인자로배열전달 기본적인인자의전달방식 값의복사에의한전달 val 10 a 10 11 Department of Computer Engineering 2 14-1 함수의인자로배열전달 배열의함수인자전달방식 배열이름 ( 배열주소, 포인터 ) 에의한전달 #include

More information

Java ...

Java ... 컴퓨터언어 1 Java 제어문 조성일 조건문 : if, switch 어떠한조건을조사하여각기다른명령을실행 if 문, switch 문 if 문 if - else 문형식 if 문형식 if ( 조건식 ) { 명령문 1; 명령문 2;... if ( 조건식 ) { 명령문 1; 명령문 2;... else { 명령문 a; 명령문 b;... 예제 1 정수를입력받아짝수와홀수를판별하는프로그램을작성하시오.

More information

PowerPoint Presentation

PowerPoint Presentation Package Class 1 Heeseung Jo 목차 section 1 패키지개요와패키지의사용 section 2 java.lang 패키지의개요 section 3 Object 클래스 section 4 포장 (Wrapper) 클래스 section 5 문자열의개요 section 6 String 클래스 section 7 StringBuffer 클래스 section

More information

JAVA PROGRAMMING 실습 02. 표준 입출력

JAVA PROGRAMMING 실습 02. 표준 입출력 자바의기본구조? class HelloJava{ public static void main(string argv[]){ system.out.println( hello,java ~ ){ } } # 하나하나뜯어살펴봅시다! public class HelloJava{ 클래스정의 public static void main(string[] args){ System.out.println(

More information

PowerPoint Presentation

PowerPoint Presentation 자바프로그래밍 1 배열 손시운 ssw5176@kangwon.ac.kr 배열이필요한이유 예를들어서학생이 10 명이있고성적의평균을계산한다고가정하자. 학생 이 10 명이므로 10 개의변수가필요하다. int s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; 하지만만약학생이 100 명이라면어떻게해야하는가? int s0, s1, s2, s3, s4,

More information

슬라이드 1

슬라이드 1 UNIT 08 조건문과반복문 로봇 SW 교육원 2 기 학습목표 2 조건문을사용핛수있다. 반복문을사용핛수있다. 조건문 3 조건식의연산결과에따라프로그램의실행흐름을변경 조건문의구성 조건식 실행될문장 조건문의종류 if switch? : ( 삼항연산자 ) if 조건문 4 if 문의구성 조건식 true 또는 false(boolean 형 ) 의결과값을갖는수식 실행될문장

More information

슬라이드 1

슬라이드 1 UNIT 12 상속과오버라이딩 로봇 SW 교육원 2 기 최상훈 학습목표 2 클래스를상속핛수있다. 메소드오버라이딩을사용핛수있다. 패키지선언과 import 문을사용핛수있다. 상속 (inheritance) 3 상속이란 기존의클래스를기반으로새로운클래스를작성 두클래스를부모와자식으로관계를맺어주는것 자식은부모의모든멤버를상속받음 연관된일렦의클래스에대핚공통적인규약을정의 class

More information

슬라이드 1

슬라이드 1 UNIT 6 배열 로봇 SW 교육원 3 기 학습목표 2 배열을사용핛수있다. 배열 3 배열 (Array) 이란? 같은타입 ( 자료형 ) 의여러변수를하나의묶음으로다루는것을배열이라고함 같은타입의많은양의데이터를다룰때효과적임 // 학생 30 명의점수를저장하기위해.. int student_score1; int student_score2; int student_score3;...

More information

비긴쿡-자바 00앞부속

비긴쿡-자바 00앞부속 IT COOKBOOK 14 Java P r e f a c e Stay HungryStay Foolish 3D 15 C 3 16 Stay HungryStay Foolish CEO 2005 L e c t u r e S c h e d u l e 1 14 PPT API C A b o u t T h i s B o o k IT CookBook for Beginner Chapter

More information

Infinity(∞) Strategy

Infinity(∞) Strategy 반복제어 표월성 passwd74@cherub.sungkyul.edu 개요 for() 문 break문과 continue문 while문 do-while문 for() 문 for() 문형식 for( 표현식1; 표현식2; 표현식3) 여러문장들 ; 표현식 1 : 초기화 (1 번만수행 ) 표현식 2 : 반복문수행조건 ( 없으면무한반복 ) 표현식 3 : 반복문수행횟수 for()

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 System Software Experiment 1 Lecture 5 - Array Spring 2019 Hwansoo Han (hhan@skku.edu) Advanced Research on Compilers and Systems, ARCS LAB Sungkyunkwan University http://arcs.skku.edu/ 1 배열 (Array) 동일한타입의데이터가여러개저장되어있는저장장소

More information

Design Issues

Design Issues 11 COMPUTER PROGRAMMING INHERIATANCE CONTENTS OVERVIEW OF INHERITANCE INHERITANCE OF MEMBER VARIABLE RESERVED WORD SUPER METHOD INHERITANCE and OVERRIDING INHERITANCE and CONSTRUCTOR 2 Overview of Inheritance

More information

Cluster management software

Cluster management software 자바네트워크프로그래밍 (OCJP 국제공인자격취득중심 ) 충북대학교 최민 기본예제 예외클래스를정의하고사용하는예제 class NewException extends Exception { public class ExceptionTest { static void methoda() throws NewException { System.out.println("NewException

More information

C++ Programming

C++ Programming C++ Programming 예외처리 Seo, Doo-okok clickseo@gmail.com http://www.clickseo.com 목 차 예외처리 2 예외처리 예외처리 C++ 의예외처리 예외클래스와객체 3 예외처리 예외를처리하지않는프로그램 int main() int a, b; cout > a >> b; cout

More information

02 C h a p t e r Java

02 C h a p t e r Java 02 C h a p t e r Java Bioinformatics in J a va,, 2 1,,,, C++, Python, (Java),,, (http://wwwbiojavaorg),, 13, 3D GUI,,, (Java programming language) (Sun Microsystems) 1995 1990 (green project) TV 22 CHAPTER

More information

PowerPoint Presentation

PowerPoint Presentation 객체지향프로그래밍 클래스, 객체, 메소드 손시운 ssw5176@kangwon.ac.kr 실제세계는객체로이루어진다. 2 객체와메시지 3 객체지향이란? 실제세계를모델링하여소프트웨어를개발하는방법 4 객체 5 객체란? 객체 (Object) 는상태와동작을가지고있다. 객체의상태 (state) 는객체의특징값 ( 속성 ) 이다. 객체의동작 (behavior) 또는행동은객체가취할수있는동작

More information

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Function) 1. 함수의개념 입력에대해적절한출력을발생시켜주는것 내가 ( 프로그래머 ) 작성한명령문을연산, 처리, 실행해주는부분 ( 모듈 ) 자체적으로실행되지않으며,

More information

Microsoft PowerPoint - chap06-1Array.ppt

Microsoft PowerPoint - chap06-1Array.ppt 2010-1 학기프로그래밍입문 (1) chapter 06-1 참고자료 배열 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 배열의선언과사용 같은형태의자료형이많이필요할때배열을사용하면효과적이다. 배열의선언 배열의사용 배열과반복문 배열의초기화 유연성있게배열다루기 한빛미디어

More information

쉽게

쉽게 Power Java 제 4 장자바프로그래밍기초 이번장에서학습할내용 자바프로그램에대한기초사항을학습 자세한내용들은추후에. Hello.java 프로그램 주석 주석 (comment): 프로그램에대한설명을적어넣은것 3 가지타입의주석 클래스 클래스 (class): 객체를만드는설계도 ( 추후에학습 ) 자바프로그램은클래스들로구성된다. 그림 4-1. 자바프로그램의구조 클래스정의

More information

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

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345]) 예외와예외클래스 예외처리 514760-1 2016 년가을학기 12/08/2016 박경신 오류의종류 에러 (Error) 하드웨어의잘못된동작또는고장으로인한오류 에러가발생되면 JVM실행에문제가있으므로프로그램종료 정상실행상태로돌아갈수없음 예외 (Exception) 사용자의잘못된조작또는개발자의잘못된코딩으로인한오류 예외가발생되면프로그램종료 예외처리 추가하면정상실행상태로돌아갈수있음

More information

11장 포인터

11장 포인터 누구나즐기는 C 언어콘서트 제 9 장포인터 이번장에서학습할내용 포인터이란? 변수의주소 포인터의선언 간접참조연산자 포인터연산 포인터와배열 포인터와함수 이번장에서는포인터의기초적인지식을학습한다. 포인터란? 포인터 (pointer): 주소를가지고있는변수 메모리의구조 변수는메모리에저장된다. 메모리는바이트단위로액세스된다. 첫번째바이트의주소는 0, 두번째바이트는 1, 변수와메모리

More information

JAVA PROGRAMMING 실습 02. 표준 입출력

JAVA PROGRAMMING 실습 02. 표준 입출력 # 메소드의구조자주반복하여사용하는내용에대해특정이름으로정의한묶음 반환형메소드이름 ( 매개변수 ) { 실행문장 1; : 실행문장 N; } 메소드의종류 Call By Name : 메서드의이름에의해호출되는메서드로특정매개변수없이실행 Call By Value : 메서드를이름으로호출할때특정매개변수를전달하여그값을기초로실행하는메서드 Call By Reference : 메서드호출시매개변수로사용되는값이특정위치를참조하는

More information

5장.key

5장.key JAVA Programming 1 (inheritance) 2!,!! 4 3 4!!!! 5 public class Person {... public class Student extends Person { // Person Student... public class StudentWorker extends Student { // Student StudentWorker...!

More information

Microsoft PowerPoint - C++ 5 .pptx

Microsoft PowerPoint - C++ 5 .pptx C++ 언어프로그래밍 한밭대학교전자. 제어공학과이승호교수 연산자중복 (operator overloading) 이란? 2 1. 연산자중복이란? 1) 기존에미리정의되어있는연산자 (+, -, /, * 등 ) 들을프로그래머의의도에맞도록새롭게정의하여사용할수있도록지원하는기능 2) 연산자를특정한기능을수행하도록재정의하여사용하면여러가지이점을가질수있음 3) 하나의기능이프로그래머의의도에따라바뀌어동작하는다형성

More information

OCW_C언어 기초

OCW_C언어 기초 초보프로그래머를위한 C 언어기초 4 장 : 연산자 2012 년 이은주 학습목표 수식의개념과연산자및피연산자에대한학습 C 의알아보기 연산자의우선순위와결합방향에대하여알아보기 2 목차 연산자의기본개념 수식 연산자와피연산자 산술연산자 / 증감연산자 관계연산자 / 논리연산자 비트연산자 / 대입연산자연산자의우선순위와결합방향 조건연산자 / 형변환연산자 연산자의우선순위 연산자의결합방향

More information

Microsoft PowerPoint - CSharp-10-예외처리

Microsoft PowerPoint - CSharp-10-예외처리 10 장. 예외처리 예외처리개념 예외처리구문 사용자정의예외클래스와예외전파 순천향대학교컴퓨터학부이상정 1 예외처리개념 순천향대학교컴퓨터학부이상정 2 예외처리 오류 컴파일타임오류 (Compile-Time Error) 구문오류이기때문에컴파일러의구문오류메시지에의해쉽게교정 런타임오류 (Run-Time Error) 디버깅의절차를거치지않으면잡기어려운심각한오류 시스템에심각한문제를줄수도있다.

More information

PowerPoint Presentation

PowerPoint Presentation 자바프로그래밍 1 클래스와메소드심층연구 ( 실습 ) 손시운 ssw5176@kangwon.ac.kr 예제 1. 접근제어 class A { private int a; int b; public int c; // 전용 // 디폴트 // 공용 public class Test { public static void main(string args[]) { A obj = new

More information

PowerPoint Presentation

PowerPoint Presentation Package Class 2 Heeseung Jo 목차 section 1 패키지개요와패키지의사용 section 2 java.lang 패키지의개요 section 3 Object 클래스 section 4 포장 (Wrapper) 클래스 section 5 문자열의개요 section 6 String 클래스 section 7 StringBuffer 클래스 section

More information

PowerPoint Presentation

PowerPoint Presentation 객체지향프로그래밍 오류처리 손시운 ssw5176@kangwon.ac.kr 오류메시지를분석한다. 오류메시지에서많은내용을알수있다. 2 디버깅 디버거를사용하면프로그램에서쉽게오류를감지하고진단할수있다. 디버거는중단점을설정하여서프로그램의실행을제어할수있으며문장 단위로실행하거나변수의값을살펴볼수있다. 3 이클립스에서디버깅 4 이클립스에서디버깅 5 이클립스의디버깅명령어 6 예외처리

More information

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍 제 5 장생성자와접근제어 1. 객체지향기법을이해한다. 2. 클래스를작성할수있다. 3. 클래스에서객체를생성할수있다. 4. 생성자를이용하여객체를초기화할수 있다. 5. 접근자와설정자를사용할수있다. 이번장에서만들어볼프로그램 생성자 생성자 (constructor) 는초기화를담당하는함수 생성자가필요한이유 #include using namespace

More information

슬라이드 1

슬라이드 1 UNIT 07 조건문과반복문 로봇 SW 교육원 3 기 학습목표 2 조건문을사용핛수있다. 반복문을사용핛수있다. 조건문 3 조건식의연산결과에따라프로그램의실행흐름을변경 조건문의구성 조건식 실행될문장 조건문의종류 if switch? : ( 삼항연산자 ) if 조건문 4 if 문의구성 조건식 true 또는 false(boolean 형 ) 의결과값을갖는수식 실행될문장

More information

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx #include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의

More information

Microsoft Word - java19-1-midterm-answer.doc

Microsoft Word - java19-1-midterm-answer.doc 중간고사 담당교수 : 단국대학교응용컴퓨터공학박경신 답은반드시답안지에기술할것. 공간이부족할경우반드시답안지몇쪽의뒤에있다고명기한후기술할것. 그외의경우의답안지뒤쪽이나연습지에기술한내용은답안으로인정안함. 답에는반드시네모를쳐서확실히표시할것. 답안지에학과, 학번, 이름외에본인의암호 (4자리숫자 ) 를기입하면성적공고시학번대신암호를 사용할것임. 1. 다음질문에답을하라. (55

More information

제11장 프로세스와 쓰레드

제11장 프로세스와 쓰레드 제9장자바쓰레드 9.1 Thread 기초 (1/5) 프로그램 명령어들의연속 (a sequence of instruction) 프로세스 / Thread 실행중인프로그램 (program in execution) 프로세스생성과실행을위한함수들 자바 Thread 2 9.1 Thread 기초 (2/5) 프로세스단위작업의문제점 프로세스생성시오버헤드 컨텍스트스위치오버헤드

More information

슬라이드 1

슬라이드 1 -Part3- 제 4 장동적메모리할당과가변인 자 학습목차 4.1 동적메모리할당 4.1 동적메모리할당 4.1 동적메모리할당 배울내용 1 프로세스의메모리공간 2 동적메모리할당의필요성 4.1 동적메모리할당 (1/6) 프로세스의메모리구조 코드영역 : 프로그램실행코드, 함수들이저장되는영역 스택영역 : 매개변수, 지역변수, 중괄호 ( 블록 ) 내부에정의된변수들이저장되는영역

More information

Microsoft PowerPoint - 04-UDP Programming.ppt

Microsoft PowerPoint - 04-UDP Programming.ppt Chapter 4. UDP Dongwon Jeong djeong@kunsan.ac.kr http://ist.kunsan.ac.kr/ Dept. of Informatics & Statistics 목차 UDP 1 1 UDP 개념 자바 UDP 프로그램작성 클라이언트와서버모두 DatagramSocket 클래스로생성 상호간통신은 DatagramPacket 클래스를이용하여

More information

12-file.key

12-file.key 11 (String).. java.lang.stringbuffer. s String s = "abcd"; s = s + "e"; a b c d e a b c d e ,., "910359,, " "910359" " " " " (token) (token),, (delimiter). java.util.stringtokenizer String s = "910359,,

More information

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

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public Chapter 9 Lab 문제정답 1. public class Circle private double radius; static final double PI=3.141592; // PI 이름으로 3.141592 로초기화된정적상수 (1) public Circle(double r) radius = r; (2) public double getradius() return

More information

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍 Power Java 제 11 장상속 이번장에서학습할내용 상속이란? 상속의사용 메소드재정의 접근지정자 상속과생성자 Object 클래스 종단클래스 상속을코드를재사용하기위한중요한기법입니다. 상속이란? 상속의개념은현실세계에도존재한다. 상속의장점 상속의장점 상속을통하여기존클래스의필드와메소드를재사용 기존클래스의일부변경도가능 상속을이용하게되면복잡한 GUI 프로그램을순식간에작성

More information

JVM 메모리구조

JVM 메모리구조 조명이정도면괜찮조! 주제 JVM 메모리구조 설미라자료조사, 자료작성, PPT 작성, 보고서작성. 발표. 조장. 최지성자료조사, 자료작성, PPT 작성, 보고서작성. 발표. 조원 이용열자료조사, 자료작성, PPT 작성, 보고서작성. 이윤경 자료조사, 자료작성, PPT작성, 보고서작성. 이수은 자료조사, 자료작성, PPT작성, 보고서작성. 발표일 2013. 05.

More information

JAVA PROGRAMMING 실습 02. 표준 입출력

JAVA PROGRAMMING 실습 02. 표준 입출력 # 왜생겼나요..? : 절차지향언어가가진단점을보완하고다음의목적을달성하기위해..! 1. 소프트웨어생산성향상 객체지향소프트웨어를새로만드는경우이미만든개체지향소프트웨어를상속받거나객체를 가져다재사용할수있어부분수정을통해소프트웨어를다시만드는부담줄임. 2. 실세계에대한쉬운모델링 실세계의일은절차나과정보다는일과관련된많은물체들의상호작용으로묘사. 캡슐화 메소드와데이터를클래스내에선언하고구현

More information

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - ch07 - 포인터 pm0415 2015-1 프로그래밍언어 7. 포인터 (Pointer), 동적메모리할당 2015 년 4 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) Outline 포인터 (pointer) 란? 간접참조연산자

More information

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770> 연습문제해답 5 4 3 2 1 0 함수의반환값 =15 5 4 3 2 1 0 함수의반환값 =95 10 7 4 1-2 함수의반환값 =3 1 2 3 4 5 연습문제해답 1. C 언어에서의배열에대하여다음중맞는것은? (1) 3차원이상의배열은불가능하다. (2) 배열의이름은포인터와같은역할을한다. (3) 배열의인덱스는 1에서부터시작한다. (4) 선언한다음, 실행도중에배열의크기를변경하는것이가능하다.

More information

PowerPoint Presentation

PowerPoint Presentation Class : Method Jo, Heeseung 목차 section 1 생성자 (Constructor) section 2 생성자오버로딩 (Overloading) section 3 예약어 this section 4 메소드 4-1 접근한정자 4-2 클래스메소드 4-3 final, abstract, synchronized 메소드 4-4 메소드반환값 (return

More information

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx 2018 학년도 1 학기 JAVA 프로그래밍 II 514760-1 2018 년봄학기 5/10/2018 박경신 Lab#1 (ImageTest) Lab#1 은영상파일 (Image) 을읽어서정보를출력 Java Tutorials Lesson: Working with Images https://docs.oracle.com/javase/tutorial/2d/images/index.html

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 자료구조자바세미나 Week1 00 Contents 목차 01 Introduction 02 JAVA? 03 Basic Grammar 04 Array 05 String 06 Class & Method 07 Practice 01 Introduction 자료구조자바세미나기본소개 일시장소 IDE 대상 매주수요일저녁 6 시 (2019.03.20 ~ 2019.04.10)

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Lecture 02 프로그램구조및문법 Kwang-Man Ko kkmam@sangji.ac.kr, compiler.sangji.ac.kr Department of Computer Engineering Sang Ji University 2018 자바프로그램기본구조 Hello 프로그램구조 sec01/hello.java 2/40 자바프로그램기본구조 Hello 프로그램구조

More information

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - chap06-2pointer.ppt 2010-1 학기프로그래밍입문 (1) chapter 06-2 참고자료 포인터 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 포인터의정의와사용 변수를선언하는것은메모리에기억공간을할당하는것이며할당된이후에는변수명으로그기억공간을사용한다. 할당된기억공간을사용하는방법에는변수명외에메모리의실제주소값을사용하는것이다.

More information

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음 프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음 CHAPTER 9 둘중하나선택하기 관계연산자 두개의피연산자를비교하는연산자 결과값은참 (1) 아니면거짓 (0) x == y x 와 y 의값이같은지비교한다. 관계연산자 연산자 의미 x == y x와 y가같은가? x!= y

More information

PowerPoint Presentation

PowerPoint Presentation 객체지향프로그래밍 인터페이스, 람다식, 패키지 ( 실습 ) 손시운 ssw5176@kangwon.ac.kr 예제 1. 홈네트워킹 public interface RemoteControl { public void turnon(); // 가전제품을켠다. public void turnoff(); // 가전제품을끈다. 인터페이스를구현 public class Television

More information

09-interface.key

09-interface.key 9 Database insert(record r): boolean find(key k): Record 1 Record getkey(): Key * Record Key Database.? Key equals(key y): boolean Database insert(record r): boolean find(key k): Record * Database OK 1

More information

Microsoft PowerPoint - additional01.ppt [호환 모드]

Microsoft PowerPoint - additional01.ppt [호환 모드] 1.C 기반의 C++ part 1 함수 오버로딩 (overloading) 디폴트매개변수 (default parameter) 인-라인함수 (in-line function) 이름공간 (namespace) Jong Hyuk Park 함수 Jong Hyuk Park 함수오버로딩 (overloading) 함수오버로딩 (function overloading) C++ 언어에서는같은이름을가진여러개의함수를정의가능

More information

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

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2 비트연산자 1 1 비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2 진수법! 2, 10, 16, 8! 2 : 0~1 ( )! 10 : 0~9 ( )! 16 : 0~9, 9 a, b,

More information

Microsoft PowerPoint - Lect04.pptx

Microsoft PowerPoint - Lect04.pptx OBJECT ORIENTED PROGRAMMING Object Oriented Programming 이강의록은 Power Java 저자의강의록을사용했거나재편집된것입니다. Class 와 object Class 와객체 클래스의일생 메소드 필드 String Object Class 와객체 3 클래스 클래스의구성 클래스 (l (class): 객체를만드는설계도 클래스로부터만들어지는각각의객체를특별히그클래스의인스턴스

More information

10.0pt1height.7depth.3width±â10.0pt1height.7depth.3widthÃÊ10.0pt1height.7depth.3widthÅë10.0pt1height.7depth.3width°è10.0pt1height.7depth.3widthÇÁ10.0pt1height.7depth.3width·Î10.0pt1height.7depth.3width±×10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width¹Ö pt1height.7depth.3widthŬ10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width½º, 10.0pt1height.7depth.3width°´10.0pt1height.7depth.3widthü, 10.0pt1height.7depth.3widthº¯10.0pt1height.7depth.3width¼ö, 10.0pt1height.7depth.3width¸Þ10.0pt1height.7depth.3width¼Ò10.0pt1height.7depth.3widthµå

10.0pt1height.7depth.3width±â10.0pt1height.7depth.3widthÃÊ10.0pt1height.7depth.3widthÅë10.0pt1height.7depth.3width°è10.0pt1height.7depth.3widthÇÁ10.0pt1height.7depth.3width·Î10.0pt1height.7depth.3width±×10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width¹Ö pt1height.7depth.3widthŬ10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width½º, 10.0pt1height.7depth.3width°´10.0pt1height.7depth.3widthü, 10.0pt1height.7depth.3widthº¯10.0pt1height.7depth.3width¼ö, 10.0pt1height.7depth.3width¸Þ10.0pt1height.7depth.3width¼Ò10.0pt1height.7depth.3widthµå 기초통계프로그래밍 클래스, 객체, 변수, 메소드 hmkang@hallym.ac.kr 금융정보통계학과 강희모 ( 금융정보통계학과 ) 기초통계프로그래밍 1 / 26 자바구성파일 소스파일 소스파일 : 사용자가직접에디터에입력하는파일로자바프로그램언어가제공하는형식으로제작 소스파일의확장자는.java 임 컴파일 : javac 명령어를이용하여프로그래머가만든소스파일을컴파일하여실행파일.class

More information

4장.문장

4장.문장 문장 1 배정문 혼합문 제어문 조건문반복문분기문 표준입출력 입출력 형식화된출력 [2/33] ANSI C 언어와유사 문장의종류 [3/33] 값을변수에저장하는데사용 형태 : < 변수 > = < 식 > ; remainder = dividend % divisor; i = j = k = 0; x *= y; 형변환 광역화 (widening) 형변환 : 컴파일러에의해자동적으로변환

More information

KNK_C_05_Pointers_Arrays_structures_summary_v02

KNK_C_05_Pointers_Arrays_structures_summary_v02 Pointers and Arrays Structures adopted from KNK C Programming : A Modern Approach 요약 2 Pointers and Arrays 3 배열의주소 #include int main(){ int c[] = {1, 2, 3, 4}; printf("c\t%p\n", c); printf("&c\t%p\n",

More information

JAVA PROGRAMMING 실습 05. 객체의 활용

JAVA PROGRAMMING 실습 05. 객체의 활용 public class Person{ public String name; public int age; } public Person(){ } public Person(String s, int a){ name = s; age = a; } public String getname(){ return name; } @ 객체의선언 public static void main(string

More information

PowerPoint Presentation

PowerPoint Presentation 객체지향프로그래밍 오류처리 손시운 ssw5176@kangwon.ac.kr 오류메시지를분석한다. 오류메시지에서많은내용을알수있다. 2 디버깅 디버거를사용하면프로그램에서쉽게오류를감지하고진단할수있다. 디버거는중단점을설정하여서프로그램의실행을제어할수있으며문장 단위로실행하거나변수의값을살펴볼수있다. 3 이클립스에서디버깅 4 이클립스에서디버깅 5 이클립스의디버깅명령어 6 예외처리

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Chapter 06 반복문 01 반복문의필요성 02 for문 03 while문 04 do~while문 05 기타제어문 반복문의의미와필요성을이해한다. 대표적인반복문인 for 문, while 문, do~while 문의작성법을 알아본다. 1.1 반복문의필요성 반복문 동일한내용을반복하거나일정한규칙으로반복하는일을수행할때사용 프로그램을좀더간결하고실제적으로작성할수있음.

More information

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍 Power Java 제 7 장클래스와객체 이번장에서학습할내용 객체지향이란? 객체 메시지 클래스 객체지향의장점 String 클래스 객체지향개념을완벽하게이해해야만객체지향설계의이점을활용할수있다. 실제세계는객체로이루어진다. 객체지향이란? 실제세계를모델링하여소프트웨어를개발하는방법 절차지향과객체지향 절차지향프로그래밍 (procedural programming): 문제를해결하는절차를중요하게생각하는방법

More information

Microsoft PowerPoint - Chapter 6.ppt

Microsoft PowerPoint - Chapter 6.ppt 6.Static 멤버와 const 멤버 클래스와 const 클래스와 static 연결리스트프로그램예 Jong Hyuk Park 클래스와 const Jong Hyuk Park C 의 const (1) const double PI=3.14; PI=3.1415; // 컴파일오류 const int val; val=20; // 컴파일오류 3 C 의 const (1)

More information

PowerPoint Presentation

PowerPoint Presentation public class SumTest { public static void main(string a1[]) { int a, b, sum; a = Integer.parseInt(a1[0]); b = Integer.parseInt(a1[1]); sum = a + b ; // 두수를더하는부분입니다 System.out.println(" 두수의합은 " + sum +

More information

쉽게 풀어쓴 C 프로그래밍

쉽게 풀어쓴 C 프로그래밍 제 3 장함수와문자열 1. 함수의기본적인개념을이해한다. 2. 인수와매개변수의개념을이해한다. 3. 함수의인수전달방법 2가지를이해한다 4. 중복함수를이해한다. 5. 디폴트매개변수를이해한다. 6. 문자열의구성을이해한다. 7. string 클래스의사용법을익힌다. 이번장에서만들어볼프로그램 함수란? 함수선언 함수호출 예제 #include using

More information

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드] Chapter 03 변수와자료형 2009 한국항공대학교항공우주기계공학부 (http://mercury.kau.ac.kr/sjkwon) 1 변수와자료유형 변수 프로그램에서자료값을임시로기억할수있는저장공간을변수 (variables) 변수 (Variables) 는컴퓨터의메모리인 RAM(Random Access Memory) 에저장 물건을담는박스라고생각한다면박스의크기에따라담을물건이제한됨

More information

01-OOPConcepts(2).PDF

01-OOPConcepts(2).PDF Object-Oriented Programming Concepts Tel: 02-824-5768 E-mail: hhcho@selabsoongsilackr? OOP (Object) (Encapsulation) (Message) (Class) (Inheritance) (Polymorphism) (Abstract Class) (Interface) 2 1 + = (Dependency)

More information

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

파일로입출력하기II - 파일출력클래스중에는데이터를일정한형태로출력하는기능을가지고있다. - PrintWriter와 PrintStream을사용해서원하는형태로출력할수있다. - PrintStream은구버전으로가능하면 PrintWriter 클래스를사용한다. PrintWriter 파일로입출력하기II - 파일출력클래스중에는데이터를일정한형태로출력하는기능을가지고있다. - PrintWriter와 PrintStream을사용해서원하는형태로출력할수있다. - PrintStream은구버전으로가능하면 PrintWriter 클래스를사용한다. PrintWriter 클래스의사용법은다음과같다. PrintWriter writer = new PrintWriter("output.txt");

More information

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

C 언어 프로그래밊 과제 풀이 과제풀이 (1) 홀수 / 짝수판정 (1) /* 20094123 홍길동 20100324 */ /* even_or_odd.c */ /* 정수를입력받아홀수인지짝수인지판정하는프로그램 */ int number; printf(" 정수를입력하시오 => "); scanf("%d", &number); 확인 주석문 가필요한이유 printf 와 scanf 쌍

More information

PowerPoint Template

PowerPoint Template 10. 예외처리 대구가톨릭대학교 IT 공학부 소프트웨어공학연구실 목차 2 10.1 개요 10.2 C++ 의예외처리 10.3 Java 의예외처리 10.4 Ada 의예외처리 10.1 예외처리의개요 (1) 3 예외 (exception) 오버플로나언더플로, 0 으로나누기, 배열첨자범위이탈오류와같이프로그램실행중에비정상적으로발생하는사건 예외처리 (exception handling)

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Lab 4 ADT Design 클래스로정의됨. 모든객체들은힙영역에할당됨. 캡슐화 (Encapsulation) : Data representation + Operation 정보은닉 (Information Hiding) : Opertion부분은가려져있고, 사용자가 operation으로만사용가능해야함. 클래스정의의형태 public class Person { private

More information

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2 제 8 장. 포인터 목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2 포인터의개요 포인터란? 주소를변수로다루기위한주소변수 메모리의기억공간을변수로써사용하는것 포인터변수란데이터변수가저장되는주소의값을 변수로취급하기위한변수 C 3 포인터의개요 포인터변수및초기화 * 변수데이터의데이터형과같은데이터형을포인터 변수의데이터형으로선언 일반변수와포인터변수를구별하기위해

More information

chap 5: Trees

chap 5: Trees 5. Threaded Binary Tree 기본개념 n 개의노드를갖는이진트리에는 2n 개의링크가존재 2n 개의링크중에 n + 1 개의링크값은 null Null 링크를다른노드에대한포인터로대체 Threads Thread 의이용 ptr left_child = NULL 일경우, ptr left_child 를 ptr 의 inorder predecessor 를가리키도록변경

More information

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조 - Part2- 제 2 장다차원배열이란무엇인가 학습목차 2.1 다차원배열이란 2. 2 2 차원배열의주소와값의참조 2.1 다차원배열이란 2.1 다차원배열이란 (1/14) 다차원배열 : 2 차원이상의배열을의미 1 차원배열과다차원배열의비교 1 차원배열 int array [12] 행 2 차원배열 int array [4][3] 행 열 3 차원배열 int array [2][2][3]

More information

설계란 무엇인가?

설계란 무엇인가? 금오공과대학교 C++ 프로그래밍 jhhwang@kumoh.ac.kr 컴퓨터공학과 황준하 6 강. 함수와배열, 포인터, 참조목차 함수와포인터 주소값의매개변수전달 주소의반환 함수와배열 배열의매개변수전달 함수와참조 참조에의한매개변수전달 참조의반환 프로그래밍연습 1 /15 6 강. 함수와배열, 포인터, 참조함수와포인터 C++ 매개변수전달방법 값에의한전달 : 변수값,

More information

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1); void method() 2); void method1() public class Test 3); args) A 제 10 장상속 예제 1) ConstructorTest.java class Parent public Parent() super - default"); public Parent(int i) this("hello"); super(int) constructor" + i); public Parent(char c) this(); super(char) constructor

More information

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher( 실행할페이지.jsp); 다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp"); dispatcher.forward(request, response); - 위의예에서와같이 RequestDispatcher

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 인터페이스 배효철 th1g@nate.com 1 목차 인터페이스의역할 인터페이스선언 인터페이스구현 인터페이스사용 타입변환과다형성 인터페이스상속 디폴트메소드와인터페이스확장 2 인터페이스의역할 인터페이스란? 개발코드와객체가서로통신하는접점 개발코드는인터페이스의메소드만알고있으면 OK 인터페이스의역할 개발코드가객체에종속되지않게 -> 객체교체할수있도록하는역할 개발코드변경없이리턴값또는실행내용이다양해질수있음

More information

자바 프로그래밍

자바 프로그래밍 5 (kkman@mail.sangji.ac.kr) (Class), (template) (Object) public, final, abstract [modifier] class ClassName { // // (, ) Class Circle { int radius, color ; int x, y ; float getarea() { return 3.14159

More information