열거 타입 연습


앞에서 작성했던 요일을 표현하는 열거 타입 Day( [ 예제 7-17 ] )를 "월", "화", "수", "목", "금", "토", "일" 이라는 문자열과 연관짓도록 만들어 보십시오.





배열 변수와 null


배열 변수에도 null 을 대입할 수 있고, null 값을 갖고 있는 배열 변수를 잘못 사용하면 java.lang.NullPointerException 이 발생합니다. 다음의 프로그램을 컴팡리해서 실행하면 그런 현상을 관찰할 수 있습니다.



이 프로그램의 printArray 메서드가 익셉션을 발생하지 않도록 수정해 보십시오.





배열의 레퍼런스 타입 특성 테스트


배열도 레퍼런스 타입이기 때문에 변수에 참조값만 저장됩니다. 그리고 배열 변수를 다른 배열 변수에 대입하면 두 변수가 같은 배열을 가리키게 됩니다. 다음은 배열의 그런 특성을 테스트하는 프로그램입니다. 이 프로그램을 컴파일해서 테스트해 보십시오.





1

2

3

1

7

3


1. 다음의 왼쪽에 있는 클래스가 오른쪽과 같이 선언되어 있습니다.


 [ 이름 ] CD 클래스

 [ 데이터 ]

 관리번호

 타이틀


 


위의 클래스를 이용해서 다음의 클래스를 선언하십시오.


 [ 이름 ] 음악 CD 클래스

 [ 데이터 ]

 관리번호

 타이틀

 아티스트

 곡명[ ]


 
 




 [ 이름 ] 음악 CD 클래스

 [ 데이터 ]

 관리번호

 타이틀

 아티스트

 곡명 [ ]


 




2. 직사각형을 표현하는 다음과 같은 클래스가 있습니다.



다음은 위의 클래스를 상속해서 만든 정사각형을 표현하는 클래스입니다. 밑줄 친 부분을 적절하게 채우십시오.








3. 다음의 프로그램은 이 장에서 작성한 Lendable 인터페이스( [ 예제 6-24 ] )와 AppCDInfo( [ 예제 6-26 ] ), SeperateVolume 클래스( [ 예제 6-25 ] )를 사용하는 프로그램인데 잘못된 부분이 있습니다. 그 부분을 찾아 수정하십시오.





Lendable 인터페이스는 필드를 가지고 있지 않으므로 Lendable 타입의 오브젝트로 자식의 필드에 접근할 수가 없다. 그러므로 각각 형변환을 해서 필드를 가지고 와야 한다. 


아직 클래스의 인스턴스의 타입을 검사하는 방법이 언급되지 않았는데 이런 문제가 나온 것이 이상하다. 직접 타입을 알아 내는 방법을 찾아 보라는 의도일지도 모르겠다.


일단 인스턴스의 타입을 알아 내어 형변환을 하는 방식으로 문제를 해결한다.





4. 다음과 같은 인터페이스 선언은 문법적으로 잘못이기 때문에 컴파일 에러가 발생합니다. 어느 부분이 잘못되었는지 찾으십시오.





인스턴스를 생성하지 못하게 하고 싶지만 추상 메서드와 필드를 포함하게 하고 싶다면 추상 클래스로 만들 수 있다.



순수한 인터페이스로 만들고 싶다면, 필드와 생성자를 지워야 한다.



추상 메서드와 throws 절의 관계 테스트


throws 절을 갖는 [ 예제 6-34 ]의 Lendable 인터페이스를 throws 절을 갖지 않는 [ 예제 6-25 ]의 SeparateVolume 클래스와 함께 컴파일해 보십시오. 어떤 결과가 나옵니까?




다음과 같은 에러가 발생한다.


error: checkOut(String, String) in SeparateVolume cannot implement checkOut(String, String) in Lendable


추상 클래스의 생성자


추상 클래스는 인스턴스화할 수 없다고 했습니다. 그러면 추상 클래스에는 생성자를 선언할 필요가 없을까요?




생성자를 선언하지 않지 않아도 상관은 없다. 하지만 상속을 하는 클래스들마다 각자의 생성자에서 중복된 구현을 해야 하므로 좋지 않다. 


만약 각각의 생성자에서의 공통적인 초기화 부분이 달라질 경우, 다른 클래스들을 다 찾아서 고쳐야 하는 수고를 해야만 한다. 그러한 수고를 하는 것은 상관없지만, 실수로 몇 개를 빼먹게 되면 잘못된 결과가 산출되는 위험이 발생한다. 그러므로 공통적인 초기화는 추상 클래스의 생성자에서 구현해 주는 것이 좋다.

생성자가 있는 슈퍼클래스의 상속 테스트


Account 클래스( [ 예제 6-6 ] ), CheckingAccount 클래스( [ 예제 6-7 ] )를 가지고 [ 예제 6-5 ]의 프로그램을 실행해 보십시오.





결과는 다음과 같다.


지불액 : 47000

잔액 : 53000


1. 인터넷 쇼핑몰 프로그램에 사용하기 위해 다음과 같은 클래스를 정의했습니다. 이 클래스를 자바 클래스로 선언하십시오.


 [ 이름 ] 상품 정보 클래스 

 [ 데이터 ]

 상품코드

 상품명

 제조사

 표준단가

 할인율

 [ 기능 ]

 할인율을 변경한다

 판매가를 계산한다


단, 이 클래스를 선언할 때 다음과 같은 요구사항을 지켜야 합니다.

모든 필드값을 파라미터로 받는 생성자와 할인율을 뺀 나머지 필드값만 파라미터로 받는 생성자를 모두 만들어야 합니다.

판매가는 표준 단가에서 할인율만큼을 공제한 금액으로 계산해야 합니다.







2. 다음의 프로그램은 잘못된 프로그램입니다. 어떤 부분이 잘못되었는지 찾고, 잘못된 이유를 설명하십시오.





final 로 선언된 필드는 선언문이나 생성자에서 반드시 초기화해야만 한다.




3. 사각형을 표현하는 다음과 같은 클래스가 있습니다.



이 클래스의 width 와 height 필드값이 0 이하가 안 되도록 만들려면 어떻게 해야 할까요? 모든 경우를 다 감안하여 해결 방안을 구하십시오.




1) 예외 상황이 발생했을 때 조건문을 걸어서 값의 범위를 조정할 수 있다.



2) 예외 상황이 발생했을 때 예외를 던질 수 있다.





4. 다음은 인터넷 게시판의 게시글을 표현하는 클래스입니다.



일련번호에 해당하는 seqNo 필드의 값을 생성자 파라미터로 받는 것이 아니라, 새로운 개체가 생성될 때마다 자동으로 붙여지게 하려고 합니다. 처음으로 생성되는 BBSItem 개체에는 1, 두 번째로 생성되는 BBSItem 개체에는 2, 이런 식으로 일련번호가 붙여지도록 이 클래스를 수정하십시오.




static 변수를 사용해서 내부적으로 증가시킨 번호를 할당하고, 생성자에서 seqNo 을 파라미터로 받지 않는다.





5. 다음의 프로그램에는 잘못된 곳이 있습니다. 어떤 부분인지 찾고, 그 이유를 설명하십시오.





static 메서드 내부에서는 instance 메서드를 호출할 수 없다. 다음과 같이 static 키워드를 추가해야만 한다.



다음과 같은 결과가 나온다.


******************************

Hello, Java

------------------------------


개체를 만들지 못하게 하는 방법


[ 예제 5-9 ]와 같이 정적 구성 요소로만 구성된 클래스는 아예 개체를 만들지 못하게 만들어 두는 것이 좋습니다. 클래스의 개체를 만들지 못하게 만드는 방법으로는 어떤 방법이 있을까요?




클래스의 생성자에 private 한정자를 붙여서 외부에서 호출하지 못하도록 한다.



이렇게 하면 다음과 같은 컴파일 에러가 발생한다.


The constructor MyClass() is not visible



생성자가 발생하는 익셉션


생성자도 메서드처럼 익셉션을 밖으로 던질 수 있습니다. 그리고 그 익셉션이 checked exception 일 때는 다음과 같이 throws 절을 써 주어야 합니다.



위 클래스의 개체를 생성하는 프로그램을 작성해 보십시오.





private 필드의 장단점


앞에서 작성했던 GoodsStock  클래스( [ 예제 5-4 ] )의 stockNum 필드를 private 필드로 만들면 어떤 문제점이 있을까요? 문제점을 해결하기 위해서는 어떻게 해야 할까요?




private 필드를 만들면 외부에서 필드에 접근할 수가 없다. 그러므로 필드를 설정하고 획득하는 메서드를 만들어야 한다.



생성자 선언 연습


생성자 안에는 필드에 값을 대입하는 대입문뿐만 아니라 모든 종류의 명령문을 다 쓸 수 있습니다. [ 예제 5-4 ] 의 생성자 안에 if 문을 써서 num 파라미터의 값이 0 보다 작을 때 stockNum 필드에 무조건 0 을 대입하도록 수정하십시오. 그리고 나서 다음과 같은 방법으로 개체를 생성한 후 그 개체의 필드값을 출력하는 프로그램을 작성하십시오.






메서드 호출 연습( 2 )


[ 예제 5-3 ] 의 main 메서드 마지막에 재고수량을 1 만큼 빼는 subtractStock 메서드 호출문과 필드값을 출력하는 명령문을 추가한 다음에 프로그램을 다시 컴파일해서 실행해 보십시오.





메서드 호출 연습


StringBuffer 클래스에는 문자열의 일부를 다른 문자열로 치환하는 기능의 replace 라는 메서드가 있습니다. [예제 5-1]에서 사용한 deleteCharAt, insert 메서드 대신 이 메서드를 사용하여 똑같은 일을 하는 프로그램을 작성하십시오. replace 메서드의 정확한 사용 방법은 JDK API 규격서를 찾아서 참고하십시오.




이 메소드는 어떤 범위의 문자열을 다른 문자열로 치환하는 것이다. 이 것의 명세는 다음과 같다. 그런데 두 번째 인자가 마지막으로 대체할 문자의 offset 이 아니라 마지막으로 대체할 문자의 offset 다음의 offset 이라는 것에 주의해야 한다. 명세에는 아래와 같이 언급한다.


start - 시작 인덱스, 포함함.

end - 끝나는 인덱스, 배제함.

str - 이전 내용을 대체할 문자열.


다음과 같이 작성하면 된다.



1. 다음의 프로그램은 잘못된 프로그램입니다. 어떤 부분이 잘못되었는지 찾고, 잘못된 이유를 설명하십시오.





byte 에다가 int 를 할당하고 있어서 컴파일 에러가 난다. 강제로 형변환할 수 있지만, 상황에 따라서 값이 잘릴 수도 있는 위험이 있기 때문에, 처음부터 total 을 int 로 선언하는 것이 좋다.





2. 다음의 식이 각각 어떤 값을 산출할지 괄호 안에 쓰십시오.


a) 10 % 7 (   )

b) --100 (    )

c) "10*20=" + 10 * 20 (    )

d) 12e2 < 1234 (    )

e) true & false | true (    )

f) 100 == 100.0 (    )

g) true && false || true (    )

h) 3 & 4 (    )

i) 4 == ( 3 + 1 ) ? 0 : 1 (    )

j) 1 << 3 (    )




a) 10 % 7 (  3  )

b) --100 (  99  )

c) "10*20=" + 10 * 20 (  "10*20=200"  )

d) 12e2 < 1234 (  true  )

e) true & false | true (  true  )

f) 100 == 100.0 (  true  )

g) true && false || true (  true  )

h) 3 & 4 (  0  )

i) 4 == ( 3 + 1 ) ? 0 : 1 (  0  )

j) 1 << 3 (  8  )


프로그램으로 검증해 보았다. 그런데 같은 리터럴에 증감 연산자를 적용하거나 같은 리터럴을 비교하는 것은 컴파일 에러가 나서 따로 변수에 넣었다.



다음과 같은 결과를 얻을 수 있었다.


a) 3

b) 99

c) 10*20=200

d) true

e) true

f) true

g) true

h) 0

i) 0

j) 8




3. 다음 중 잘못된 식을 고르고 어디가 잘못되었는지 설명하십시오.


3 & 100L    ++num++    true + 3    "-_-" + true + 3

true > false    0xFF00 || 0x00FF    --100    120e3 << 2




++num++ : 증감 연산자는 하나만 붙일 수 있다.

true + 3 : boolean 은 정수로 변환될 수 없다.

true > false : boolean 은 대소비교를 할 수 없다.

0xFF00 || 0x00FF : 정수는 boolean 으로 변환될 수 없다.

--100 : 리터럴에는 증감 연산자를 붙일 수 없다.

120e3 << 2 : 실수에는 shift 연산자를 붙일 수 없다.


넓은 범위로의 캐스트 연산은 안전할까?


넓은 범위의 수치 타입을 좁은 범위의 수치 타입으로 캐스트 연산하면 본래 값이 손상될 수도 있다고 했습니다. 그러면 좁은 범위의 수치 타입을 넓은 범위의 수치 타입으로 바꿀 때는 그런 일이 전혀 안 생길까요? 있다면 어떤 타입으로 바꿀 때 그런 일이 생길 수 있는지 생각해 보십시오.




float 값에서 double 값으로 자동으로 변환될 때 값이 바뀔 수 있다.



다음과 같은 결과가 나온다.


3.4028235E38

3.4028234663852886E38


조건 연산자와 증가 연산자


다음 프로그램을 실행하면 max, a, b 의 값은 어떻게 출력될까요?





21

21

30


|| 과 | 의 연산자 차이


[ 예제 4-14 ] 의 || 연산자를 | 연산자로 바꾸어서 컴파일한 후 프로그램을 실행해 보십시오.





num1 이 0 보다 크거나 num2 가 0 보다 큽니다.

num1 = 1

num2 = 1


부호 연산자

[ 예제 4-3 ] 의 4 행에 있는 - 부호 연산자를 + 부호 연산자로 바꾸고 프로그램을 컴파일해 보십시오. 어떤 일이 일어납니까?





다음과 같은 컴파일 에러가 발생한다.


Type mismatch: cannot convert from int to short


1. 다음의 프로그램은 잘못된 프로그램입니다. 어떤 부분이 잘못되었는지 찾고, 잘못된 이유를 설명하십시오.





byte 는 1 바이트 짜리 타입이라 [ -128, 127 ] 의 범위를 표현한다. 그런데 for 문 안에서 cnt 가 127 이 넘어 가게 된다. byte 가 아니라 int 를 사용해야만 한다.





2. 다음의 리터럴들이 각각 어떤 타입인지 괄호 안에 쓰십시오.


a) "도" (    )

b) 100 (    )

c) 0x01ABf (    )

d) 12e2 (    )

e) false (    )

f) '\123' (    )



a) "도" ( string )

b) 100 ( int )

c) 0x01ABf ( float )

d) 12e2 ( int )

e) false ( boolean )

f) '\123' ( char )




3. 다음 중 잘못된 리터럴을 고르고 어디가 잘못되었는지 설명하십시오.


""   0.0    '\r\n'    .5e100f    0xABCDEFABCDEF    0x12.5e2    "단가:\10000"    TRUE    1e-100f




'\r\n' : 2 개의 문자가 들어 있는 문자열이므로 "\r\n" 이라고 해야 한다.

.5e100f : float 범위를 넘어 선다. f 를 빼야 한다.

0xABCDEFABCDEF : 4 바이트가 넘어가므로 int 에 넣을 수 없다. 만약 long 에 넣고자 한다면 0xABCDEFABCDEFL 이라고 해야 한다.

0x12.5e2 : 16 진수이므로 e 를 쓰면 안 된다. 0x12.5p2 라고 해야 한다.

"단가:\10000" : \ 를 문자열 안에 쓰면 escape sequence 가 된다. 그러므로 "단가:\\10000" 이라고 해야 한다.

TRUE : true 라고 해야 한다.

1e-100f : float 범위를 넘어 선다. f 를 빼야 한다.


Unicode 문자 출력하기


char 타입도 정수 타입이기 때문에 char 타입의 변수에 Unicode 코드갑승ㄹ 정수로 직접 대입할 수도 있고, char 타입의 변수를 for 문의 카운트 변수로 사용할 수도 있습니다. 이 성질을 잘 이용하면 다음과 같은 for 문을 만들어서 a 부터 z 까지의 영문 알파벳을 출력할 수 있습니다.



위의 for 문을 고쳐서 12593 ~ 12686 에 해당하는 코드값을 갖는 Unicode 문자들을 출력하는 프로그램을 작성해 보십시오. 어떤 문자들이 출력됩니까? 출력된 문자들이 Unicode 의 해당 문자들과 일치하는지 Unicode 홈페이지를 방문하여 확인해 보십시오.





http://www.unicode.org/charts/ 에 가면 "hangul compatibility jamo" 라는 pdf 를 찾을 수 있다. 그 pdf 에 보면 각 문자 아래에 숫자가 적혀 있는데 16진수 값이다. 즉 'ㄱ' 밑에 3131 은 0x3131 을 의미한다. 그리고 그것은 10 진값으로는 12593 이다. 아래 결과는 제대로 출력된 것이라 볼 수 있다.


12593 0x3131

12594 0x3132

12595 0x3133

12596 0x3134

12597 0x3135

12598 0x3136

12599 0x3137

12600 0x3138

12601 0x3139

12602 0x313a

12603 0x313b

12604 0x313c

12605 0x313d

12606 0x313e

12607 0x313f

12608 0x3140

12609 0x3141

12610 0x3142

12611 0x3143

12612 0x3144

12613 0x3145

12614 0x3146

12615 0x3147

12616 0x3148

12617 0x3149

12618 0x314a

12619 0x314b

12620 0x314c

12621 0x314d

12622 0x314e

12623 0x314f

12624 0x3150

12625 0x3151

12626 0x3152

12627 0x3153

12628 0x3154

12629 0x3155

12630 0x3156

12631 0x3157

12632 0x3158

12633 0x3159

12634 0x315a

12635 0x315b

12636 0x315c

12637 0x315d

12638 0x315e

12639 0x315f

12640 0x3160

12641 0x3161

12642 0x3162

12643 0x3163

12644 0x3164

12645 0x3165

12646 0x3166

12647 0x3167

12648 0x3168

12649 0x3169

12650 0x316a

12651 0x316b

12652 0x316c

12653 0x316d

12654 0x316e

12655 0x316f

12656 0x3170

12657 0x3171

12658 0x3172

12659 0x3173

12660 0x3174

12661 0x3175

12662 0x3176

12663 0x3177

12664 0x3178

12665 0x3179

12666 0x317a

12667 0x317b

12668 0x317c

12669 0x317d

12670 0x317e

12671 0x317f

12672 0x3180

12673 0x3181

12674 0x3182

12675 0x3183

12676 0x3184

12677 0x3185

12678 0x3186

12679 0x3187

12680 0x3188

12681 0x3189

12682 0x318a

12683 0x318b

12684 0x318c

12685 0x318d

12686 0x318e



부동소수점수 내부 표현의 확인


JDK 라이브러리에 있는 Double.doubleToRawLongBits 라는 메서드는 dobule 타입의 값을 그와 똑같은 비트 패턴을 갖는 long 타입의 값으로 만드는 메서드입니다. 이 메서드의 사용 방법은 다음과 같습니다.



그리고 JDK 라이브러리의 Long.toBinaryString 이라는 메서드는 long 타입의 정수 내부 표현을 문자열로 만들어서 리턴하는 메서드입니다. 이 메서드의 사용법은 다음과 같습니다.



이 두 메서드를 이용하여 12.735 와 -12.735 의 내부 표현을 문자열로 출력하는 프로그램을 작성하십시오. 그리고 그 결과를 [ 그림 3-17 ]의 비트 패턴과 비교해 보십시오.





다음과 같은 결과가 나왔다.


12.375 : 100000000101000110000000000000000000000000000000000000000000000

-12.375 : 1100000000101000110000000000000000000000000000000000000000000000


12.375 는 앞에 0 이 빠진 표현을 보여 주고 있기 때문에 사실은 다음과 같은 결과가 나왔다고 봐야 한다.


12.375 : 0100000000101000110000000000000000000000000000000000000000000000

-12.375 : 1100000000101000110000000000000000000000000000000000000000000000


결과를 보면 -128 의 경우 MSB( most significant bit, 부호 비트 )가 1 인 것을 알 수 있다. 그리고 정수 표현과는 다르게 소수 표현은 보수 표현을 사용하지 않고 있음을 알 수 있다.


2진 소수


3.14 를 위 그림에서와 같은 방법으로 2진 소수로 바꾸어 보십시오. 이 문제는 컴퓨터로 푸는 것이 아니라 종이에 직접 써서 풀어야 합니다.




다음과 같이 종이에 풀었다.



값은 다음과 같다.


11.00100011110 ...2




그런데 사실 프로그램으로도 이를 재현하는 것이 가능하다. 다음과 같이 코드를 작성해서 답을 검증해 보았다.



결과는 다음과 같이 나왔다. 위의 계산과 동일함을 알 수 있다.


11.0010001111010111


정수 내부 표현의 확인


JDK 라이브러리에 있는 Integer.toBinaryString 이라는 메서드는 int 타입의 내부 표현을 문자열로 만들어서 리턴하는 메서드인데, 다음과 같은 방법으로 사용할 수 있습니다.



이 메서드를 이용해서 -37 의 내부 표현을 출력하는 프로그램을 작성해 보십시오. 그리고 -5 의 내부 표현을 출력하는 프로그램도 작성해 보십시오. 37 과 5 의 2의 보수에 해당하는 비트 패턴이 출력되는 것을 확인할 수 있습니까?





결과는 다음과 같다.


37 : 100101

-37 : 11111111111111111111111111011011

5 : 101

-5 : 11111111111111111111111111111011


1. 다음의 프로그램에는 잘못된 부분이 있습니다. 어떤 부분이 잘못되었는지 찾고, 잘못된 이유를 설명하십시오.





이 프로그램에서는 max 라는 지역변수를 if 블락 바깥쪽에서 접근하고 있다. max 를 if 블락 바깥으로 빼든가 System.out.println 을 블락 안 쪽에서 호출해야만 한다.





2. 다음의 프로그램을 실행하면 어떤 결과가 출력될까요?



이 프로그램의 switch 문이 "키위"라고 출력하도록 만들려면 어떻게 해야 할까요?




프로그램은 'K' 를 출력한다. "키위"를 출력하게 하려면 'K' 를 비교하는 case 문을 추가해야 한다.





3. 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 순으로 정수를 출력하는 프로그램으로 만들려고 합니다. a, b, c 위치에 알맞은 식을 채워 넣으십시오.








4. JDK 5.0 의 향상된 for 문을 이용하여 arr 배열 항목들의 총합을 계산하여 출력하려고 합니다. a, b 의 위치에 뭐라고 써야 할까요?








5. "Hello, Java" 의 Java 대신에 명령형 파라미터로 입력받은 값을 출력하는 프로그램을 만들려고 합니다. 예를 들어 Tom 이라는 값을 입력하면 "Hello, Tom" 이라고 출력애야 합니다.


1) 다음 프로그램의 a 위치에 뭐라고 써야 할까요?



2) 이 프로그램이 "Hello, World" 라고 출력하게 하려면 명령행에 뭐라고 입력해야 할까요?




1)
 


2)


java HelloEverybody World


단 파라미터가 아무것도 없을 경우에 java.lang.ArrayIndexOutOfBoundsException 예외가 발생할 수 있다.


익셉션 처리 문제


Section05 의 Excercise 2-5 에서 작성했던 프로그램은 명령행 파라미터로 정수가 아닌 값을 넘겨주면 익셉션을 발생합니다. 그 익셉션을 잡아서 한글로 된 에러 메시지를 출력하는 프로그램을 작성하십시오.




다음과 같이 코드를 작성한다.



이를 컴파일하고 명령줄에서 다음과 같이 실행한다.


java Hello 1 2 3 four 5 six 7 8


그러면 아래와 같은 결과가 나온다.


1

2

3

four

four 는 정수가 아닙니다

5

six

six 는 정수가 아닙니다

7

8

26


여기에서 java.lang.NumberFormatException 을 사용한 이유는 Integer.parseInt 메서드가 그 예외를 발생시키기 때문이다. Eclipse 같은 도구에서 parseInt 메서드에 커서를 위치시킨 다음에 Javadoc 라는 탭을 보면 다음과 같이 설명이 되어 있는 것을 볼 수 있다.


Throws:

    NumberFormatException - if the string does not contain a parsable integer.


메서드 호출문의 연습


1장에서 설치한 JDK 안에는 JDK 라이브러리라는 자바 모듈이 포함되어 있는데, 그 안에는 여러 가지 유용한 기능의 클래스와 메서드들이 있습니다. 그 중에 있는 Integer.parseInt 라는 메서드는 문자열을 정수로 바꾸는 메서드입니다. 이 메서드의 사용법은 다음과 같습니다.



이렇게 메서드를 호출하면 이 메서드는 "12" 라는 문자열을 12 라는 정수로 만들어서 리턴합니다. 이 메서드를 이용해서 명령행 파라미터로 받은 정수를 모두 더하여 합을 출력하는 프로그램을 작성하십시오.




다음과 같이 코드를 작성한다.



이를 컴파일하고 명령줄에서 다음과 같이 실행한다.


java Hello 1 2 3 4 5 6 7 8


그러면 아래와 같은 결과가 나온다.


1

2

3

4

5

6

7

8

36


break 문의 연습


다음과 같은 배열이 있습니다.



이 배열에서 -1 이 나오기 전까지의 항목 값들을 순서대로 출력하십시오.





435

88

67

Done.


향상된 for 문


다음의 프로그램에 있는 두 개의 for 문을 모두 향상된 for 문으로 고칠 수 있을까요?



고칠 수 없는 for 문이 있다면 왜 그런지 이유를 설명해 보십시오.




두 번째 for 문만 향상된 for 문으로 고칠 수 있다. 왜냐하면 향상된 for 문에서의 변수는 배열 내의 "값"을 의미하고 있기 때문이다. 배열 요소의 값에 10 을 곱하고 싶으면 그것의 인덱스를 얻어 올 수 있어야 하는데, 그것의 인덱스를 받아 올 수 있는 방법이 없다.



결과는 다음과 같다.


100

200

300

400

500

Done.




만약 아래와 같이 코드를 작성해 버린다면, 컴파일에는 문제가 없지만 결과가 틀리게 나온다. 첫 번째 향상된 for 문에서의 value 는 단지 복사본이며 원본 배열의 내용에 영향을 미치지 못한다.



Ecplise 같은 데서 빌드하면 다음과 같은 warning 을 볼 수 있다.


The value of the local variable value is not used UpdateArrayExample.java /UpdateArrayExample/src line 7 Java Problem


결과는 다음과 같다.


10

20

30

40

50

Done.


for 문의 연습


다음과 같은 배열이 있습니다.



이 배열의 3 번째 항목부터 7 번째 항목까지의 값을 모두 더해서 출력하는 프로그램을 for 문을 이용해서 작성하십시오.





결과는 다음과 같다.


50


+ Recent posts