배열 파라미터를 받는 read 메서드.


배열 파라미터를 받는 read 메서드를 이용하여 [ 예제 10-3 ] 과 똑같은 기능을 하는 프로그램을 작성하십시오.





1. 다음은 똑같은 기능을 하는 프로그램이지만 성능면에서 차이가 있습니다. 어떠한 프로그램의 성능이 더 우수할까요?






첫 번째 코드는 4 개의 String 개체를 생성한다. 하지만 두 번째 코드는 5 개의 String 개체를 생성하므로 첫 번째가 성능이 더 우수하다.




2. 다음은 명령행에서 받은 파라미터를 길게 연결한 하나의 문자열로 만들어서 출력하는 프로그램입니다. StringBuilder 클래스를 이용해어 빈칸을 채워 완성하십시오.



예를 들어서 이 프로그램은 다음과 같이 작동해야 합니다.







3. 다음의 빈칸을 채워서 오늘로부터 100 일 후의 날짜를 계산하여 출력하는 프로그램으로 만드십시오.








4. 다음은 1 부터 5 까지의 수 중 하나를 임의로 선택해서 출력하는 프로그램입니다. 빈칸을 채우십시오.






Random 클래스


Random 클래스를 이용해서 동전을 100 번 던지는 시뮬레이션을 한 후, 앞면이 나온 수와 뒷면의 수를 출력하는 프로그램을 작성하십시오.





앞편 : 38 회, 뒷면 : 62 회


세계 시간 프로그램


뉴욕, 홍콩, 파리의 현재 시간을 다음과 같은 포맷으로 한꺼번에 출력하는 프로그램을 작성하십시오.


뉴욕 2005/11/13    (일)    오후 7:32

홍콩 2005/11/14    (월)    오전 8:32

파리 2005/11/14    (월)    오전 1:32




일단 식별자를 알아야 한다.



위의 코드로 다음과 같은 결과를 획득했다.


Etc/GMT+12

Etc/GMT+11

Pacific/Midway

Pacific/Niue

Pacific/Pago_Pago

Pacific/Samoa

US/Samoa

America/Adak

America/Atka

Etc/GMT+10

HST

Pacific/Honolulu

Pacific/Johnston

Pacific/Rarotonga

Pacific/Tahiti

SystemV/HST10

US/Aleutian

US/Hawaii

Pacific/Marquesas

AST

America/Anchorage

America/Juneau

America/Nome

America/Sitka

America/Yakutat

Etc/GMT+9

Pacific/Gambier

SystemV/YST9

SystemV/YST9YDT

US/Alaska

America/Dawson

America/Ensenada

America/Los_Angeles

America/Metlakatla

America/Santa_Isabel

America/Tijuana

America/Vancouver

America/Whitehorse

Canada/Pacific

Canada/Yukon

Etc/GMT+8

Mexico/BajaNorte

PST

PST8PDT

Pacific/Pitcairn

SystemV/PST8

SystemV/PST8PDT

US/Pacific

US/Pacific-New

America/Boise

America/Cambridge_Bay

America/Chihuahua

America/Creston

America/Dawson_Creek

America/Denver

America/Edmonton

America/Hermosillo

America/Inuvik

America/Mazatlan

America/Ojinaga

America/Phoenix

America/Shiprock

America/Yellowknife

Canada/Mountain

Etc/GMT+7

MST

MST7MDT

Mexico/BajaSur

Navajo

PNT

SystemV/MST7

SystemV/MST7MDT

US/Arizona

US/Mountain

America/Bahia_Banderas

America/Belize

America/Cancun

America/Chicago

America/Costa_Rica

America/El_Salvador

America/Guatemala

America/Indiana/Knox

America/Indiana/Tell_City

America/Knox_IN

America/Managua

America/Matamoros

America/Menominee

America/Merida

America/Mexico_City

America/Monterrey

America/North_Dakota/Beulah

America/North_Dakota/Center

America/North_Dakota/New_Salem

America/Rainy_River

America/Rankin_Inlet

America/Regina

America/Resolute

America/Swift_Current

America/Tegucigalpa

America/Winnipeg

CST

CST6CDT

Canada/Central

Canada/East-Saskatchewan

Canada/Saskatchewan

Chile/EasterIsland

Etc/GMT+6

Mexico/General

Pacific/Easter

Pacific/Galapagos

SystemV/CST6

SystemV/CST6CDT

US/Central

US/Indiana-Starke

America/Atikokan

America/Bogota

America/Cayman

America/Coral_Harbour

America/Detroit

America/Fort_Wayne

America/Grand_Turk

America/Guayaquil

America/Havana

America/Indiana/Indianapolis

America/Indiana/Marengo

America/Indiana/Petersburg

America/Indiana/Vevay

America/Indiana/Vincennes

America/Indiana/Winamac

America/Indianapolis

America/Iqaluit

America/Jamaica

America/Kentucky/Louisville

America/Kentucky/Monticello

America/Lima

America/Louisville

America/Montreal

America/Nassau

America/New_York

America/Nipigon

America/Panama

America/Pangnirtung

America/Port-au-Prince

America/Thunder_Bay

America/Toronto

Canada/Eastern

Cuba

EST

EST5EDT

Etc/GMT+5

IET

Jamaica

SystemV/EST5

SystemV/EST5EDT

US/East-Indiana

US/Eastern

US/Michigan

America/Caracas

America/Anguilla

America/Antigua

America/Argentina/San_Luis

America/Aruba

America/Asuncion

America/Barbados

America/Blanc-Sablon

America/Boa_Vista

America/Campo_Grande

America/Cuiaba

America/Curacao

America/Dominica

America/Eirunepe

America/Glace_Bay

America/Goose_Bay

America/Grenada

America/Guadeloupe

America/Guyana

America/Halifax

America/Kralendijk

America/La_Paz

America/Lower_Princes

America/Manaus

America/Marigot

America/Martinique

America/Moncton

America/Montserrat

America/Port_of_Spain

America/Porto_Acre

America/Porto_Velho

America/Puerto_Rico

America/Rio_Branco

America/Santiago

America/Santo_Domingo

America/St_Barthelemy

America/St_Kitts

America/St_Lucia

America/St_Thomas

America/St_Vincent

America/Thule

America/Tortola

America/Virgin

Antarctica/Palmer

Atlantic/Bermuda

Brazil/Acre

Brazil/West

Canada/Atlantic

Chile/Continental

Etc/GMT+4

PRT

SystemV/AST4

SystemV/AST4ADT

America/St_Johns

CNT

Canada/Newfoundland

AGT

America/Araguaina

America/Argentina/Buenos_Aires

America/Argentina/Catamarca

America/Argentina/ComodRivadavia

America/Argentina/Cordoba

America/Argentina/Jujuy

America/Argentina/La_Rioja

America/Argentina/Mendoza

America/Argentina/Rio_Gallegos

America/Argentina/Salta

America/Argentina/San_Juan

America/Argentina/Tucuman

America/Argentina/Ushuaia

America/Bahia

America/Belem

America/Buenos_Aires

America/Catamarca

America/Cayenne

America/Cordoba

America/Fortaleza

America/Godthab

America/Jujuy

America/Maceio

America/Mendoza

America/Miquelon

America/Montevideo

America/Paramaribo

America/Recife

America/Rosario

America/Santarem

America/Sao_Paulo

Antarctica/Rothera

Atlantic/Stanley

BET

Brazil/East

Etc/GMT+3

America/Noronha

Atlantic/South_Georgia

Brazil/DeNoronha

Etc/GMT+2

America/Scoresbysund

Atlantic/Azores

Atlantic/Cape_Verde

Etc/GMT+1

Africa/Abidjan

Africa/Accra

Africa/Bamako

Africa/Banjul

Africa/Bissau

Africa/Casablanca

Africa/Conakry

Africa/Dakar

Africa/El_Aaiun

Africa/Freetown

Africa/Lome

Africa/Monrovia

Africa/Nouakchott

Africa/Ouagadougou

Africa/Sao_Tome

Africa/Timbuktu

America/Danmarkshavn

Atlantic/Canary

Atlantic/Faeroe

Atlantic/Faroe

Atlantic/Madeira

Atlantic/Reykjavik

Atlantic/St_Helena

Eire

Etc/GMT

Etc/GMT+0

Etc/GMT-0

Etc/GMT0

Etc/Greenwich

Etc/UCT

Etc/UTC

Etc/Universal

Etc/Zulu

Europe/Belfast

Europe/Dublin

Europe/Guernsey

Europe/Isle_of_Man

Europe/Jersey

Europe/Lisbon

Europe/London

GB

GB-Eire

GMT

GMT0

Greenwich

Iceland

Portugal

UCT

UTC

Universal

WET

Zulu

Africa/Algiers

Africa/Bangui

Africa/Brazzaville

Africa/Ceuta

Africa/Douala

Africa/Kinshasa

Africa/Lagos

Africa/Libreville

Africa/Luanda

Africa/Malabo

Africa/Ndjamena

Africa/Niamey

Africa/Porto-Novo

Africa/Tunis

Africa/Windhoek

Arctic/Longyearbyen

Atlantic/Jan_Mayen

CET

ECT

Etc/GMT-1

Europe/Amsterdam

Europe/Andorra

Europe/Belgrade

Europe/Berlin

Europe/Bratislava

Europe/Brussels

Europe/Budapest

Europe/Copenhagen

Europe/Gibraltar

Europe/Ljubljana

Europe/Luxembourg

Europe/Madrid

Europe/Malta

Europe/Monaco

Europe/Oslo

Europe/Paris

Europe/Podgorica

Europe/Prague

Europe/Rome

Europe/San_Marino

Europe/Sarajevo

Europe/Skopje

Europe/Stockholm

Europe/Tirane

Europe/Vaduz

Europe/Vatican

Europe/Vienna

Europe/Warsaw

Europe/Zagreb

Europe/Zurich

MET

Poland

ART

Africa/Blantyre

Africa/Bujumbura

Africa/Cairo

Africa/Gaborone

Africa/Harare

Africa/Johannesburg

Africa/Kigali

Africa/Lubumbashi

Africa/Lusaka

Africa/Maputo

Africa/Maseru

Africa/Mbabane

Africa/Tripoli

Asia/Amman

Asia/Beirut

Asia/Damascus

Asia/Gaza

Asia/Hebron

Asia/Istanbul

Asia/Jerusalem

Asia/Nicosia

Asia/Tel_Aviv

CAT

EET

Egypt

Etc/GMT-2

Europe/Athens

Europe/Bucharest

Europe/Chisinau

Europe/Helsinki

Europe/Istanbul

Europe/Kiev

Europe/Mariehamn

Europe/Nicosia

Europe/Riga

Europe/Simferopol

Europe/Sofia

Europe/Tallinn

Europe/Tiraspol

Europe/Uzhgorod

Europe/Vilnius

Europe/Zaporozhye

Israel

Libya

Turkey

Africa/Addis_Ababa

Africa/Asmara

Africa/Asmera

Africa/Dar_es_Salaam

Africa/Djibouti

Africa/Juba

Africa/Kampala

Africa/Khartoum

Africa/Mogadishu

Africa/Nairobi

Antarctica/Syowa

Asia/Aden

Asia/Baghdad

Asia/Bahrain

Asia/Kuwait

Asia/Qatar

Asia/Riyadh

EAT

Etc/GMT-3

Europe/Kaliningrad

Europe/Minsk

Indian/Antananarivo

Indian/Comoro

Indian/Mayotte

Asia/Riyadh87

Asia/Riyadh88

Asia/Riyadh89

Mideast/Riyadh87

Mideast/Riyadh88

Mideast/Riyadh89

Asia/Tehran

Iran

Asia/Baku

Asia/Dubai

Asia/Muscat

Asia/Tbilisi

Asia/Yerevan

Etc/GMT-4

Europe/Moscow

Europe/Samara

Europe/Volgograd

Indian/Mahe

Indian/Mauritius

Indian/Reunion

NET

W-SU

Asia/Kabul

Antarctica/Mawson

Asia/Aqtau

Asia/Aqtobe

Asia/Ashgabat

Asia/Ashkhabad

Asia/Dushanbe

Asia/Karachi

Asia/Oral

Asia/Samarkand

Asia/Tashkent

Etc/GMT-5

Indian/Kerguelen

Indian/Maldives

PLT

Asia/Calcutta

Asia/Colombo

Asia/Kolkata

IST

Asia/Kathmandu

Asia/Katmandu

Antarctica/Vostok

Asia/Almaty

Asia/Bishkek

Asia/Dacca

Asia/Dhaka

Asia/Qyzylorda

Asia/Thimbu

Asia/Thimphu

Asia/Yekaterinburg

BST

Etc/GMT-6

Indian/Chagos

Asia/Rangoon

Indian/Cocos

Antarctica/Davis

Asia/Bangkok

Asia/Ho_Chi_Minh

Asia/Hovd

Asia/Jakarta

Asia/Novokuznetsk

Asia/Novosibirsk

Asia/Omsk

Asia/Phnom_Penh

Asia/Pontianak

Asia/Saigon

Asia/Vientiane

Etc/GMT-7

Indian/Christmas

VST

Antarctica/Casey

Asia/Brunei

Asia/Choibalsan

Asia/Chongqing

Asia/Chungking

Asia/Harbin

Asia/Hong_Kong

Asia/Kashgar

Asia/Krasnoyarsk

Asia/Kuala_Lumpur

Asia/Kuching

Asia/Macao

Asia/Macau

Asia/Makassar

Asia/Manila

Asia/Shanghai

Asia/Singapore

Asia/Taipei

Asia/Ujung_Pandang

Asia/Ulaanbaatar

Asia/Ulan_Bator

Asia/Urumqi

Australia/Perth

Australia/West

CTT

Etc/GMT-8

Hongkong

PRC

Singapore

Australia/Eucla

Asia/Dili

Asia/Irkutsk

Asia/Jayapura

Asia/Pyongyang

Asia/Seoul

Asia/Tokyo

Etc/GMT-9

JST

Japan

Pacific/Palau

ROK

ACT

Australia/Adelaide

Australia/Broken_Hill

Australia/Darwin

Australia/North

Australia/South

Australia/Yancowinna

AET

Antarctica/DumontDUrville

Asia/Yakutsk

Australia/ACT

Australia/Brisbane

Australia/Canberra

Australia/Currie

Australia/Hobart

Australia/Lindeman

Australia/Melbourne

Australia/NSW

Australia/Queensland

Australia/Sydney

Australia/Tasmania

Australia/Victoria

Etc/GMT-10

Pacific/Chuuk

Pacific/Guam

Pacific/Port_Moresby

Pacific/Saipan

Pacific/Truk

Pacific/Yap

Australia/LHI

Australia/Lord_Howe

Antarctica/Macquarie

Asia/Sakhalin

Asia/Vladivostok

Etc/GMT-11

Pacific/Efate

Pacific/Guadalcanal

Pacific/Kosrae

Pacific/Noumea

Pacific/Pohnpei

Pacific/Ponape

SST

Pacific/Norfolk

Antarctica/McMurdo

Antarctica/South_Pole

Asia/Anadyr

Asia/Kamchatka

Asia/Magadan

Etc/GMT-12

Kwajalein

NST

NZ

Pacific/Auckland

Pacific/Fiji

Pacific/Funafuti

Pacific/Kwajalein

Pacific/Majuro

Pacific/Nauru

Pacific/Tarawa

Pacific/Wake

Pacific/Wallis

NZ-CHAT

Pacific/Chatham

Etc/GMT-13

MIT

Pacific/Apia

Pacific/Enderbury

Pacific/Fakaofo

Pacific/Tongatapu

Etc/GMT-14

Pacific/Kiritimati


다음과 같은 코드로 시간을 획득해서 출력한다.



결과는 다음과 같다.


뉴욕 2013/04/21 (일) 오전 11:14

홍콩 2013/04/21 (일) 오후 11:14

파리 2013/04/21 (일) 오후 05:14


토큰 추출 프로그램


"고슴도치, 앵무새 | 토끼" 라는 문자열에 있는 "고슴도치", "앵무새", "토끼" 를 토큰으로 추출하는 프로그램을 작성하십시오.




StringTokenizer 를 사용하되, 좌우 공백을 없애기 위해서 trim() 메서드를 호출한다.



StringBuilder 의 메서드


StringBuilder 의 클래스에는 문자열 조작에 사용되는 replace, setCharAt, reverse 라는 메서드도 있습니다. 다음은 그 메서드들을 사용하는 프로그램입니다. 이 프로그램을 컴파일하여 실행해 보십시오.





어떤 돌이 내 얼굴을 물끄러미 쳐다보는 것만

어떤 꽃이 내 얼굴을 물끄러미 치어다보는 것만

만것 는보다어치 미러끄물 을굴얼 내 이꽃 떤어


String 개체의 내용이 변경 가능하다면?


String 클래스의 개체는 일단 생성되고 나면 문자열 내용이 바뀌는 일이 절대 없습니다. 만약 String 개체의 문자열 내용이 바뀔 수 있다면 어떤 문제가 발생할까요?




1. 전역으로 정의된 리터럴의 내용이 바뀌어 버릴 수 있다.


2. 문자열 조작할 때마다 조작하기 전의 내용을 복사해 두어야 한다.

문자열에서 문자/부분 문자열 검색하기


String 클래스에는 문자열 안에 있는 문자나 부분 문자열의 위치를 찾는 indexOf, lastIndexOf 라는 메서드도 있습니다. 다음은 그 메서드들을 사용하는 프로그램입니다. String 클래스의 API 규격서를 찾아 보고 이 프로그램이 어떤 결과를 낼지 예측해 보십시오. 그리고 이 프로그램을 컴파일해서 실행해 보고, 예측했던 결과와 일치하는 지 비교해 보십시오.





다음과 같은 결과를 예상했다.


0

13

0

13

37

13

13

13


결과는 그대로 나왔다.


String 클래스의 특성 확인하기.


다음의 프로그램을 컴파일해서 실행해 보십시오. 어떤 결과가 나옵니까? 결과로부터 무엇을 알 수 있습니까?





뇌를 자극하는 C

뇌를 자극하는 하드웨어

뇌를 자극하는 하드웨어입문


원본 문자열은 변경되지 않고, 새로운 String 개체가 생성된다.

1. 다음은 오늘의  날짜를 출력하는 프로그램인데, 이 프로그램에서는 JDK 라이브러리에 있는 java.util 패키지의 GregorianCalendar 클래스와 Calendar 클래스를 사용하고 있습니다. import 문을 사용하여 이 프로그램을 좀 더 같단하게 고쳐 보십시오.








2. 인터넷 쇼핑몰의 재고 관리에 사용하려고 다음과 같은 클래스를 만들었습니다.



그런데 이 클래스를 상속하는 또 다른 클래스를 다음과 같이 만들려고 합니다. 이 서브클래스 안에서는 GoodsStock 클래스의 어떤 구성요소들을 사용할 수 있을까요?





이 서브 클래스에서는 GoodsStock 클래스에서 public 이나 protected 로 선언된 것들만 접근할 수 있다. 그러므로 GoodsStock.goodsCode 와 GoodsStock.stockNum 을 모두 사용할 수 있다.




3. JDK 에 포함되어 있는 javap 라는 명령은 클래스 파일로부터 그 안에 들어 있는 클래스와 인터페이스의 정보를 읽어서 출력하는 명령입니다. 예를 들어 이 장에서 작성했던 Square 클래스( [ 예제 8-14 ] ) 를 컴팡리한 디렉토리에서 이 명령을 입력하면 다음과 같이 Square 클래스와 구성요소에 대한 정보를 볼 수 있습니다.



이 명령을 사용해서 이 장에서 작성했던 Movable 인터페이스( [ 예제 8-17 ] )의 내용을 확인해 보십시오. 결과를 통해 어떤 사실을 확인할 수 있습니까?





interface 의 메서드는 자동적으로 public 추상 메서드로 선언된다는 것을 알 수 있다.


좁은 접근 범위로의 메서드 오버라이딩.


만약 자바에서 좁은 접근 범위로의 메서드 오버라이딩을 허용한다면 어떤 문제가 발생할 수 있을까요?




클래스에서 일반 메서드를 선언하는 의도야 자기 맘이니 어쩔 수 없다고 해도, 인터페이스의 메서드의 같은 경우에는 문제가 발생할 수 있다.


인터페이스의 메서드는 기본적으로 public 권한을 갖는다. 즉 이를 구현한 클래스에 접근해 해당 메서드를 호출할 수 있다는 가정을 깔고 있는 것이다. 만약 이를 protected 나 private 권한으로 바꿔 버린다면, 인터페이스가 가지고 있던 약속을 어겨 버리는 것이 된다. 


컴파일은 어찌 어찌 된다고 하더라도, 런타임에 제대로된 동작을 할 수 없을 것이다.

접근 제어 연습문제


[ 예제 8-14 ] 의 클래스를 가지고 ( 100, 200 ) 위치에 변의 길이 15 인 정사각형을 만는 후, 각 꼭지점의 좌표를 출력하는 프로그램을 작성하십시오.





1. 다음은 [ 예제 7-8 ] 에 있는 Account 클래스와 CheckingAccount 클래스를 사용하는 프로그램입니다. 표시된 부분에 if 문을 추가하여 checkingAccount 개체일 때만 카드 번호를 출력하도록 만들어 보십시오.








2. 다음과 같이 정의된 열거 타입을 자바 문법으로 선언하십시오.


 [ 열거 값 ]

 노랑

 빨강

 파랑







3. 다음은 6장에서 작성했던 대출가능 인터페이스와 그 인터페이스를 구현하는 단행본 클래스입니다. 대출가능 인터페이스에 선언되어 있는 상수를 열거 타입으로 바꾸고, 단행본 클래스의 관련 부분도 수정하십시오.






열거 타입 연습


앞에서 작성했던 요일을 표현하는 열거 타입 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


+ Recent posts