머리말 - 품... · pdf file13.2 자바의멀티스레딩 648 13.3 스레드만들기...
TRANSCRIPT
3
독자들의 사랑에 힘입어 이번에 개정판이 나오게 되었습니다. 독자 여러분께
진심으로감사드립니다.
개정판에는초판에서아쉬웠던부분을수정하 습니다. 실무에서사용하지않
는 일부 내용을 삭제하고, 실무에 필요한 for-each 문, Calendar 클래스,
MouseWheelEvent 등의 내용을 추가하 습니다. 연습문제도 추가로 수록하
습니다. 2004년 JDK 1.5 버전 이후에 세상에 나온 제네릭(generics, 일반화)은
그 사용이 점점 늘고, 현재 제네릭 프로그래밍이라는 새로운 패러다임이 정착되
고있어서, 기존에8장에있던‘제네릭과컬렉션’을7장으로옮기고, 군더더기를
없애고, 정성스럽게 수정하 습니다. 책에서 다루는 이클립스와 JDK를 최신 버
전으로 바꾸었습니다. 또한 본문과 소스의 이해력을 높이기 위해 변화를 주었습
니다.
자바(Java)는 그 이전 시 에 있었던 프로그래밍 언어에서 한 차원 진화된 개
념으로 개발된 가히 혁명적 언어이며 플랫폼입니다. 한 번 작성된 자바 프로그램
은 어느 컴퓨터, 어떤 운 체제에서도 실행될 수 있습니다. Write Once Run
Anywhere의세상이만들어지는것입니다. 데스크톱, 웹서버및웹클라이언트,
셋톱 등의 임베디드 장치, 스마트폰을 중심으로 하는 모바일 단말기, 스마트 TV
등의가전제품등생활과산업의전분야에사용되고있습니다. 자바는현재소프
트웨어시장에서가장큰지배력을뽐내고있으며, 미래창조시 를지배할프로
그래밍전문가들이알아야할필수언어입니다.
최초로인터넷웹브라우저를만들고넷스케이프를공동창업한마크앤드리슨
은월스트리트저널에실은 에서‘소프트웨어기업이세상을지배’하는전쟁이
시작되었음을강하게말하 습니다. 그는앞으로의10년이기존업계의강자와새
PREFACE머리말
PREFACE
4
로운소프트웨어로무장한반란군의엄청난 결이예상된다고힘주어말합니다.
“Over the next 10 years, the battles between incumbents and
software-powered insurgents will be epic.”
소프트웨어가 주목받는 세상이 이미 왔고, 소프트웨어는 이 시 의 IT 세계를
지배할것입니다. 자바(Java)가바로스마트모바일등미래IT 세계를지배할강
력한언어가될것입니다.
이책은다양한독자들이자바를배우기쉽도록노력한여러가지특징을가지
고있습니다. 첫째, 책의내용을충실히정리하고적절한예제를수록하 습니다.
둘째, 어려운개념을쉽게이해하도록많은그림과삽화를삽입하 습니다. 셋째,
각 절마다 Check Time 문제를 두어 배운 내용을 확인할 수 있도록 하 습니다.
넷째, 연습문제는이론문제와실습문제로나누고, 홀수번과짝수번을유사한문
제로 꾸며, 홀수문제에 한 반복으로 짝수문제를 연습할 수 있도록 구성하 습
니다. 다섯째, 각장마다Open Challenge 문제를두어학생스스로도전하는과
정을두었습니다.
좋은 책을 만들고자 저자와 출판사는 최선의 노력을 다하 습니다. 생능출판
사 관계자와 함께 수고한 김효수 교수님께 감사드립니다. 수연, 연수, 수희, 그리
고항상곁에있는아내와부모님께감사합니다. 하나님께감사합니다.
2013년1월
함박눈이쏟아지는날에, 황기태
5
자바 프로그래밍 책을 집필함에 있어서 많은 주저함과 고민이 있었습니다. 저
의명예를걸고서점의가판 위에세울수있는책을만들어낼수있을까? 이책
을선택한자바독자들을실망시키지않고, 이해하기쉽고가슴에와닿는자바프
로그래밍 책을 과연 쓸 수 있을까? 참으로 많은 고민을 하 습니다. 그러나 현재
모바일 업계에서 일하고 있는 제가 미약하나마 실무적인 측면에서 도움을 줄 수
있는부분이있지않을까생각하고책을쓰기로결심하 습니다.
제가 현재 일하고 있는 모바일 업계에서 자바를 모르고는 취업이 힘들 정도로
자바는 매우 중요한 언어이며 플랫폼입니다. 특히 자바를 기반으로 한 안드로이
드는스마트폰시장에서가장점유율이높은플랫폼으로서자바는모바일업계에
서매우중요합니다. 이책을쓰면서독자에게바라는것은단순히프로그래밍언
어를 공부하는 것에 그치지 않고 자바 언어를 사용하여 주어진 과제를 어떻게 더
잘해결할것인가, 어떻게더좋은프로그램을만들것인가를같이고민하는것입
니다. 이 책이 독자 여러분이 고민할 때 옆에 놓고 찾아볼 수 있는 안내서가 되었
으면좋겠습니다.
함께책을만드느라고고생한황기태교수님께감사를드리고원고를깔끔하게
정리하여좋은책을만들어주신생능출판사여러분께도감사를드립니다.
마지막으로 부모님과 아내, 그리고 책을 기다리고 있는 아들 동환에게 감사를
전합니다.
2013년1월
판교에서김효수
PREFACE머리말
Objectives
학습 목표로 그 장에서 무엇을 배우는지
를제시하 다.
CHECK TIME
이미 배운 내용을 점검하기 위해 단답형
식의문제를제시하 다.
Tip
학습한 내용의 보충 설명이나 참고 사항
등을정리하 다.
잠깐!
지나치기 쉬운 내용들을 환기시키기 위
해주의사항등을설명하 다.
이 � 책 � 의 � 특 � 징
6
요약SUMMARY
배운 내용을 정리하기 쉽도록 주요 용어
를중심으로주요내용을요약하 다.
Open Challenge
프로젝트 문제로 그 장에서 학습한 내용
을 응용하여 프로그램을 작성할 수 있도
록하 다.
본문을쉽게이해하도록돕는그림과삽화
내용을 쉽게 이해하고 지루하지 않도록
그림과삽화를다양하게사용하 다.
연습문제EXERCISE
배운 내용을 정확히 이해하고 있는지 스
스로 검토하도록 하기 위한‘이론문제’
와 이론을 바탕으로 실전 응용프로그램
을 작성해보도록 하는 다양한‘실습문
제’를수록하 다.
7
CONTENTS
8
머리말 3
이책의특징 6
자바 시작
1.1 컴퓨터와프로그래밍 18
1.2 자바의출현과WORA 20
1.3 자바의진화 28
1.4 자바개발환경구축 31
1.5 자바프로그램개발 36
1.6 이클립스를이용한자바프로그램개발 39
1.7 자바응용프로그램의종류 45
1.8 자바의특징 49
●요약 52
●Open Challenge 53
●연습문제 54
자바 기본 프로그래밍
2.1 자바프로그램의구조 58
2.2 식별자 63
2.3 자바의데이터타입 66
2.4 자바에서키입력 76
2.5 연산자 81
2.6 조건문 93
●요약 105
02CHAPTER
01CHAPTER
차례
9
●Open Challenge 106
●연습문제 107
반복문과 배열 그리고 예외 처리
3.1 반복문 114
3.2 continue 문과break 문 124
3.3 배열 128
3.4 다차원배열 138
3.5 main() 메소드의인자 145
3.6 자바의예외처리 150
●요약 157
●Open Challenge 158
●연습문제 160
클래스와 객체
4.1 객체지향과자바 168
4.2 클래스선언과활용 174
4.3 메소드활용 185
4.4 생성자(constructor) 195
4.5 가비지와가비지컬렉션 204
4.6 접근지정자 208
4.7 static 멤버 215
4.8 final 225
●요약 227
●Open Challenge 228
●연습문제 229
CONTENTS
03CHAPTER
04CHAPTER
CONTENTS
10
상속
5.1 상속의개념 240
5.2 클래스상속과객체 243
5.3 상속과접근지정자 248
5.4 상속과생성자 252
5.5 객체의타입변환 : 업캐스팅과다운캐스팅 259
5.6 메소드오버라이딩 266
5.7 추상클래스 278
5.8 인터페이스 284
●요약 292
●Open Challenge 293
●연습문제 294
패키지 개념과 자바 기본 패키지
6.1 패키지(Package) 308
6.2 import와클래스경로 311
6.3 패키지만들기 315
6.4 자바 JDK에서제공하는패키지 324
6.5 Object 클래스 327
6.6 Wrapper 클래스 335
6.7 String 클래스 340
6.8 StringBuffer 클래스 347
6.9 StringTokenizer 클래스 350
6.10 Math 클래스 353
6.11 Calendar 클래스 356
●요약 359
●Open Challenge 360
●연습문제 361
05CHAPTER
06CHAPTER
11
제네릭과 컬렉션
7.1 컬렉션과제네릭 368
7.2 제네릭컬렉션활용 373
7.3 제네릭만들기 399
●요약 406
●Open Challenge 407
●연습문제 408
입출력 스트림과 파일 입출력
8.1 자바의입출력스트림 416
8.2 바이트스트림과파일입출력 421
8.3 문자스트림과파일입출력 427
8.4 버퍼입출력과파일입출력 436
8.5 File 클래스 440
8.6 파일복사응용프로그램작성 444
●요약 448
●Open Challenge 449
●연습문제 450
자바 GUI 기초, AWT와 스윙(Swing)
9.1 자바의GUI 454
9.2 자바GUI 패키지 459
9.3 스윙GUI 프로그램만들기 462
9.4 컨테이너(Container)와배치(Layout) 470
9.5 FlowLayout 배치관리자 474
9.6 BorderLayout 배치관리자 477
CONTENTS07CHAPTER
08CHAPTER
09CHAPTER
CONTENTS
12
9.7 GridLayout 배치관리자 481
9.8 배치관리자없는컨테이너 483
●요약 487
●Open Challenge 488
●연습문제 489
자바의 이벤트 처리
10.1 이벤트기반프로그래밍(Event Driven Programming) 496
10.2 이벤트객체 500
10.3 이벤트리스너 503
10.4 어댑터(Adapter) 클래스 515
10.5 KeyEvent와 KeyListener 518
10.6 MouseEvent와MouseListener, MouseMotionListener 529
●요약 536
●Open Challenge 538
●연습문제 539
기본적인 스윙 컴포넌트와 활용
11.1 스윙컴포넌트소개 548
11.2 JLabel, 레이블컴포넌트 553
11.3 JButton, 버튼컴포넌트 556
11.4 JCheckBox, 체크박스컴포넌트 561
11.5 JRadioButton, 라디오버튼컴포넌트 567
11.6 JTextField, 텍스트필드컴포넌트 573
11.7 JTextArea, 텍스트 역컴포넌트 575
11.8 JList, 리스트컴포넌트 578
10CHAPTER
1 1CHAPTER
13
11.9 JComboBox, 콤보박스컴포넌트 582
11.10 JSlider, 슬라이더컴포넌트 587
●요약 593
●Open Challenge 594
●연습문제 595
그래픽
12.1 스윙컴포넌트그리기 602
12.2 Graphics 606
12.3 도형그리기와칠하기 612
12.4 이미지그리기 617
12.5 클리핑(Clipping) 625
12.6 스윙의페인팅메커니즘 628
●요약 634
●Open Challenge 635
●연습문제 636
스레드와 멀티태스킹
13.1 멀티태스킹 644
13.2 자바의멀티스레딩 648
13.3 스레드만들기 650
13.4 스레드생명주기와스케줄링 663
13.5 스레드종료 668
13.6 스레드동기화(Thread Synchronization) 674
13.7 wait(), notify(), notifyAll()을이용한스레드동기화 682
●요약 687
CONTENTS
13CHAPTER
12CHAPTER
CONTENTS
14
●Open Challenge 688
●연습문제 689
고급 스윙 컴포넌트
14.1 메뉴만들기 700
14.2 툴바 706
14.3 툴팁 710
14.4 다이얼로그만들기 714
14.5 팝업다이얼로그 725
14.6 파일다이얼로그 730
14.7 컬러다이얼로그 737
14.8 탭팬 740
●요약 744
●Open Challenge 745
●연습문제 746
애플릿과 멀티미디어
15.1 애플릿의특징 752
15.2 HTML 파일의 <applet> 태그 757
15.3 Applet으로AWT 애플릿만들기 759
15.4 JApplet으로스윙애플릿만들기 763
15.5 애플릿에파라미터전달하기 765
15.6 애플릿의보안에따른제약 770
15.7 애플릿에서오디오다루기 771
15.8 데스크톱응용프로그램에서오디오다루기 774
●요약 776
15CHAPTER
14CHAPTER
15
CONTENTS●Open Challenge 777
●연습문제 779
●Check Time 정답 784
●찾아보기 800
네트워크
16.1 TCP/IP
16.2 URL을이용한웹프로그래밍
16.3 소켓프로그래밍
16.4 서버-클라이언트채팅예제
●요약
●Open Challenge
●연습문제
JDBC 프로그래밍
17.1 데이터베이스
17.2 MySQL
17.3 콘솔에서MySQL 데이터베이스활용
17.4 JDBC 프로그래밍
●요약
●Open Challenge
●연습문제
CD 수록
16CHAPTER
17CHAPTER
1자바 시작
● 컴퓨터 프로그래밍과 프로그래밍 언어가 왜 필요한지를 이해
한다.
● 자바의출현배경을안다.
● 자바의종류를알고발전과정을이해한다.
● 자바개발환경— JDK, 이클립스—을이해한다.
● 자바프로그램의기초를안다.
● 자바응용프로그램의종류를안다.
● 자바의특징을이해한다.
O b j e c t i v e s
컴퓨터와 소프트웨어
컴퓨터의형태는 [그림 1-1]과같이방하나를차지하는메인프레임, 가장친숙한 PC,
최근에손안의컴퓨터라고불리는태블릿(tablet)이나스마트폰(smartphone), 더작게
는장난감에들어있는원칩컴퓨터(one-chip com) 등과같이다양해졌다. 흔히, 이컴
퓨터하드웨어(hardware)를작동시켜쇼핑을하고신문을보고음악을듣고게임을할
수 있게 하는 것을 소프트웨어(software)라고 하며, 프로그램(program)이라고 부르기
도 한다. 소프트웨어는 컴퓨터의 중앙처리장치(CPU)가 이해할 수 있는 일련의 명령들
(instructions)과데이터로구성되며, CPU는이명령들을순차적으로해석하여실행함
으로써요구된기능을수행한다.
소프트웨어는 보통 CD나 DVD 같은 저장 매체로 제공되지만, 최근에는 인터넷에서
직접 다운로드받을 수 있는 형태로 제공되기도 한다. 특히 태블릿이나 스마트폰에서
작동하는소프트웨어를앱(APP)이라고부르며이들은인터넷앱스토어에서사용자가
바로구입하기도한다.
[그림 1-1] 컴퓨터와 소프트웨어
메인�프레임 PC태블릿 스마트폰
소프트웨어�혹은�앱
장난감 게임기
앱 앱
자바 시작
CH
AP
TE
R JAVA PROGRAMMING
1.1 컴퓨터와프로그래밍
컴퓨터
하드웨어
소프트웨어
프로그램
앱
애플 사의 아이폰에서 볼 수 있듯이 사용자들이 열광하는 사용자 인터페이스, 앱
스토어, 시리등과같은것들은모두소프트웨어를통해이뤄진혁신들로서, 소프트웨
어가제품경쟁력을좌우하는가장중요한요소가되었다. 하드웨어경쟁력에치중하
던 국내 전자업계에서도 최근에는 소프트웨어 경쟁력 강화를 목표로 세우고 있으며
이를위해엄청난소프트웨어인력들을필요로하고있는상황이다.
프로그래밍 언어
프로그래밍 언어란 프로그램을 작성하기 위한 언어이다. 컴퓨터의 CPU는 이진수
(binary code)로 된 0과 1밖에 이해하지 못하며, 이런 언어를 기계어(machine
language)라고한다. 사람이직접기계어로컴퓨터프로그램을만들기는매우어렵다.
따라서 0과 1로구성되는기계어의각명령을 ADD, SUB, MOVE 등과같이가급적표현하
기 쉬운 상징적인 단어들인 니모닉 기호(mnemonic symbol)로 일 일 응시킨 언어인
어셈블리어(assembly language)가 만들어졌다. 그러나 어셈블리어 역시 사람이 다루
기힘든 저급언어로서 다양한 프로그램의 구조나자료 구조를 표현하기에는 너무복
잡하 다. 이에사람이이해하고표현하기쉬우며, 복잡한알고리즘이나프로그램구
조, 자료 구조를 효율적으로 표현할 수 있는 Pascal, Basic, C/C++, C#, 자바 등의 고급
언어가 생겨나게 되었다. 고급 언어는 크게 절차 지향 언어와 객체 지향 언어로 나눌
수있는데, 자바는객체지향언어이다. 객체지향언어의특징에 해서는 4장에서자
세히알아보기로한다.
컴파일
프로그래밍은 고급 언어를 이용하여 전용 개발 도구나 텍스트 편집기로 프로그램 소
스(source) 파일(혹은 소스 프로그램)을 작성하는 것을 의미한다. 소스 프로그램은 텍
스트 파일이어서 어떤 텍스트 편집기에서도 작성이 가능하다. 기계어는 컴퓨터가 바
로 이해할 수 있는 언어이지만 C나 자바와 같은 고급 언어로 작성된 소스 프로그램은
컴퓨터가이해할수없으므로, [그림 1-2]와같이소스프로그램을기계어로변환하는
과정이 필요하다. 이를 컴파일(compile)이라고 한다. 기계어로 변환해주는 소프트웨
어를 컴파일러(compiler)라고 하며 각 언어마다 고유한 컴파일러가 있다. 그러므로 C
컴파일러로자바소스프로그램을컴파일할수는없다. 또한컴파일러를개발하는회
사는보다효율적인자사만의컴파일러를개발하여판매한다.
소스파일의확장자로프로그램이어떤언어로작성되었는지구분할수있다. 어셈
블리어의 경우 소스 파일의 확장자는 .asm이며, C 언어의 경우 .c이고, C++ 언어의 경
우 .cpp이며, 비주얼베이직의 경우 .vb이고, 자바의 경우 .java이다. 확장자와 소스
프로그램의 언어가 일치하지 않으면 해당 언어의 컴파일러는 제 로 컴파일하지 못
제1장 자바 시작 191 C H A P T E R
소프트웨어경쟁력강화
소프트웨어인력
프로그래밍언어
기계어
어셈블리어
고급언어
절차지향언어
객체지향언어
컴파일
컴파일러
한다. 자바프로그램의경우컴파일된파일의확장자는 .class이다.
[그림 1-2] 소스 프로그램의 편집과 컴파일 및 실행 과정
자바의 태동
자바는애초 지금과같이 일반컴퓨터나 인터넷 환경에서사용될 목적으로 설계된 것
이 아니었다. 1991년에 선마이크로시스템스(SUN Microsystems)는 제임스 고슬링
(James Gosling)이란 걸출한 엔지니어를 중심으로 그린 프로젝트(green project)라는
이름으로 가전제품에 사용할 소프트웨어를 개발하기 시작했다. 기존의 프로그래밍
소스�프로그램편집�및�개발
소스�프로그램 기계어
프로그램�실행
컴파일
컴파일러
if(i>0) { i=i*10;}i=i-j;System.out.println(i);
0101000001000101010011110101101010100101110101010101000010001110000000
자바 프로그래밍JAVA JAVA PROGRAMMING20
1.2 자바의출현과WORA
� 어셈블리어는주로어디에사용될까?
� 고급프로그램언어를기계어로변환하는과정을무엇이라고하는가?
� 자바컴파일러로 C++ 소스프로그램을컴파일할수있는가?
CHECKTIME
언어로 작성된 프로그램은 플랫폼(platform) 간에 호환성이 없어 사용자 컴퓨터의 플
랫폼에 따라 다시 소스를 컴파일하거나 아예 프로그램을 재작성해야 하는 단점이 있
었다. 특히매우다양한플랫폼을갖는가전제품을위해플랫폼에독립적인언어의필
요성이 두되었다. 또한가전제품에들어가는제어장치는매우적은양의메모리를
사용해야 하므로 새로운 언어는 이러한 내장형 시스템(embedded system)의 메모리 요
구사항을충족해야만했다.
이에 선마이크로시스템스는 플랫폼 독립적(platform independent)이며 메모리 사
용량이적은새로운언어와실행체계를개발하 고, 처음에는이언어의이름을오크
(oak)라고 지었다. 이 새로운 언어는 초기에는 별로 알려지지 않았다. 그러나 인터넷
과 웹이 엄청난 속도로 발전하면서 이 언어 역시 급속도로 퍼지게 되었다. 웹의 특징
이 웹 콘텐츠가 클라이언트의 다양한 플랫폼상의 웹 브라우저에서 실행되도록 하는
것인데, 이 언어의 플랫폼 독립성이 딱 들어맞았기 때문이다. 선마이크로시스템스는
오크를 인터넷 환경에 적합하도록 발전시켰으며, 마침내 1995년 SunWorld 95에서 자
바(Java)라는이름으로새로운기술을발표하 다. 당시가장많이사용되는브라우저
인넷스케이프(Netscape)에자바기술을적용하면서자바는급격히퍼졌고, 오늘날인
터넷시 의프로그래밍언어로자리매김을하게되었다. 데이터베이스로유명한오
라클 사에서 2009년에 선마이크로시스템스를 인수함으로써 현재는 오라클에서 자바
를제공하고있다.
제1장 자바 시작 211 C H A P T E R
플랫폼독립적
메모리사용량이적은
오크
자바
선마이크로시스템스
오라클
오크란이름은선마이크로시스템스사무실앞의참나무(oak)에서따온것이라고한다. 자바로바뀐
이유는 이미 오크란 상표가 등록되어 있어 이름을 자바로 바꾸었다고 한다. 자바 이름의 유래에는
여러가지설이있는데, 유력한것으로는개발자들이너무커피를많이마셨다는설과개발팀의핵
심멤버인 James Gosling, Arthur Van Hoff, Andy Bechtolsheim의이니셜을따왔다는설이있다.
잠깐!
WORA(Write Once Run Anywhere)
C나 C++ 등자바이전의프로그래밍언어들의컴파일러는기계어코드로변환할때프
로그램이 실행될 상 컴퓨터의 CPU와 운 체제에 종속적인 코드로 변환한다. 예를
들어, 소스프로그램을 Intel 펜티엄 CPU가탑재된 PC에윈도우운 체제가설치된환
경에서 실행되도록 컴파일된 기계어 코드는 동일한 Intel CPU를 가지지만 리눅스가
설치된 PC에서는 실행되지 않는다. 혹은 다른 CPU가 설치된 윈도우 운 체제에서도
실행되지 않는다. 이러한 특징을 플랫폼 종속성(platform dependence)이라고 한다.
[그림 1-3]은플랫폼종속성을보여준다.
자바는 개발 단계에서부터 플랫폼에 독립적으로 설계되었다. 따라서 기존 프로그
래밍 언어가 가진 플랫폼 종속성을 극복하여, 운 체제나 하드웨어에 상관없이 자바
가상 기계(JVM)가 있으면 어디서나 자바로 작성된 프로그램에 동일한 실행 환경을 제
공하며동일한실행결과를기 할수있다. 또자바는웹브라우저, 분산환경의지원
등으로네트워크에연결된어느클라이언트에서도실행이가능하다. 즉, 한번프로그
램을작성하면어느하드웨어에서나어느운 체제에서나자바프로그램을실행시킬
수있다. 이를 WORA(Write Once Run Anywhere)라고한다.
[그림 1-4]는 자바의 플랫폼 독립적인 WORA의 특징을 보여준다. 개발자가 한 번 자
자바 프로그래밍JAVA JAVA PROGRAMMING22
Intel CPU를�가진리눅스�환경에서�개발
Intel CPU�+�리눅스
Apple사의�MAC PC
Intel CPU�+�윈도우�노트북
실행
실행되지�않음
실행되지�않음
C/C++응용�프로그램
플랫폼은�하드웨어�플랫폼과�운 체제플랫폼으로�되어�있어요.�프로그램의�플랫폼이호환성이�없는�이유는�다음과�같답니다.
�기계어가�CPU마다�상이하기�때문�운 체제마다�API가�서로�다르기�때문�운 체제마다�실행파일�형식이�서로�다르기�때문
[그림 1-3] 플랫폼 종속성
자바가상기계
WORA
바응용프로그램을 작성하면 수정없이 서로다른플랫폼을 가진 컴퓨터에서 바로실
행가능하다. 즉, Intel CPU를가진리눅스가설치된 PC, Apple사에서만들고 MAC운
체제가실행되는 PC, Intel CPU를가진윈도우가설치된노트북등플랫폼에무관하게
바로실행가능하다.
[그림 1-4] 자바의 플랫폼 독립성, WORA(Write Once Run Anywhere)
자바의 실행 환경
자바가 WORA의특징을가질수있는것은바이트코드와자바가상기계때문이다.
●바이트 코드(byte code)
바이트 코드는 자바 컴파일러가 자바 소스 프로그램을 컴파일한 기계어로서, 플랫폼
에 한 종속성 없이 자바 가상 기계에서 실행되는 바이너리 코드(binary code)이다.
바이트 코드는 컴퓨터상의 CPU에 의해 직접 실행되지 않으며, 신 자바 가상 기계가
인터프리터 방식으로 이 바이트 코드를 해석하여 해당 플랫폼에서 실행시킨다. 바이
트코드는자바가상기계에서실행되는기계어라고생각하면된다. 자바개발환경인
JDK(Java Development Kit)는 개발자가 바이트 코드를 직접 볼 수 있도록 컴파일된 자
바 클래스 파일을 디어셈블(disassemble)하는 도구를 제공한다. [그림 1-6]은 [그림 1-
5]의 자바 소스 프로그램을 컴파일하여 생성된 클래스 파일(혹은 클래스)을 디어셈블
한바이트코드의예이다. 바이트코드는이진수로되어있어읽어도알기어렵다.
Write Once!!
Run Anywhere!!
Intel CPU�+�리눅스
Apple사의�MAC PC
Intel CPU�+�윈도우�노트북
실행실행
실행
자바응용�프로그램
자바�가상�기계
자바�가상�기계
자바�가상�기계
제1장 자바 시작 231 C H A P T E R
바이트코드
인터프리터방식
[그림 1-5] Hello.java를 컴파일하고 클래스 파일을 다시 디어셈블하여 Hello.bc 파일 생성
Hello.java를�컴파일하는�명령으로�컴파일되면�Hello.class�파일이�생성된다.
Hello.class�파일을�디어셈블하는�명령으로�디어셈블된�결과�Hello.bc�파일이�생성된다.
public class Hello {
public static int sum(int i, int j) {
return i + j; // i와 j의 합을 리턴
}
public static void main(String[] args) {
int i;
int j;
char a;
String b;
final int TEN = 10;
i = 1;
j = sum(i, TEN);
a = '?';
b = "Hello";
java.lang.System.out.println(a); // ‘?’ 출력
System.out.println(b); // “Hello” 출력
System.out.println(TEN); // 10 출력
System.out.println(j); // 11 출력
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
자바 프로그래밍JAVA JAVA PROGRAMMING24
Hello.java�파일에�저장
[그림 1-6] 클래스 파일을 디어셈블한 자바 바이트 코드
●자바 가상 기계
자바가상기계는서로다른플랫폼에서동일한자바실행환경을제공한다. 그러나자
바가상기계자체는각플랫폼에맞게포팅되어야하므로플랫폼종속적이다. 자바가
상기계는자바개발사인선마이크로시스템스(현재는오라클)는물론이고 IBM, 마이크
로소프트사등다양한회사에서제작공급하고있다. 한번작성된자바응용프로그램
은어떤회사의자바가상기계가설치되어있든지상관없이정상적으로실행된다.
[그림 1-7]은자바소스프로그램을컴파일하고실행하는과정을보여준다. 자바컴
파일러는 자바 소스 프로그램을 바이트 코드로 컴파일하여 클래스 파일(class file)
을 생성한다. 자바 가상 기계는 클래스 파일에 들어 있는 바이트 코드를 하나씩 실행
한다. 자바가상기계는사용자가작성한자바프로그램을실행하는도중, JDK 라이브
러리에 들어있는 다른클래스 파일이나 사용자가작성한 다른 클래스파일이 필요하
sum()�메소드를�컴파일한�바이트�코드를�디어셈블한�결과(자바의�어셈블리�코드로�출력)
제1장 자바 시작 251 C H A P T E R
자바가상기계
플랫폼종속적
클래스파일
면, 그때필요한클래스 파일을 로딩하고실행한다. 부분의자바가상기계는실행
중에 JDK 라이브러리 로딩으로 인한 시간 지연을 줄이기 위해 자바 프로그램 실행 시
작 전, 자바 가상 기계가 시작할 때 JDK 라이브러리를 미리 로딩하여 둔다. 그림에서
볼수있듯이자바에서는링크(link) 과정이없다.
자바 응용프로그램 개발 과정과 타 언어(C/C++)에서의 개발 과정 차이
�자바에서의 개발 :컴파일혹은컴파일+ jar압축
�다른 언어에서의 개발 :컴파일+ 링크
●자바와 타 언어(C/C++)의 실행 환경 차이
자바와 C/C++의가장큰차이점은실행환경에있다. 프로그램을작성할때전문개발
도구나텍스트편집기를사용하여프로그램소스를작성하는것에는큰차이가없다.
자바소스를컴파일하면 자바가상기계에서실행가능한바이트코드형태의클래스
파일이 생성된다. 반면 C/C++ 소스를 컴파일하고 나면 플랫폼상에서 바로 실행될 수
있는 실행 파일이 생성된다. C/C++ 소스를 컴파일해서 생성된 실행 파일에는 플랫폼
에종속적인코드가있으며, 플랫폼이바뀌면다시소스를컴파일하고링크해야한다.
그러나 자바의 클래스 파일은 자바 가상 기계상에서 실행되어 플랫폼에 종속적인 코
드를 갖지 않으므로 플랫폼이 달라져도 다시 컴파일할 필요가 없다. [그림 1-8]은 이
들의실행환경차이를보여준다.
자바 프로그래밍JAVA JAVA PROGRAMMING26
자바�프로그래밍
Draw.java
소스�코드 바이트�코드
클래스�로딩
실행에�필요한�자바�클래스�라이브러리(JDK APls)
자바�컴파일러Hello.java
Shape.java
Draw.class
Hello.class
Shape.class
....
자바�가상�기계
윈도우�운 체제
Intel PC H/W
자바�가상�기계
Apple�맥�운 체제
Apple H/W
자바�가상�기계
휴 폰�운 체제
휴 폰�H/W
Object.class
String.class
[그림 1-7] 자바 가상 기계와 자바 응용프로그램의 실행 과정
클래스파일
실행파일
클래스파일을로딩
링크(link) 과정이없다
[그림 1-8] 자바와 C/C++의 실행 환경 차이
자바�소스�파일(Test.java)
(a)�자바의�경우
바이트�코드(Test.class)
자바컴파일러
자바�프로그램(Test.class)
if(i>0) { i=i*10;}i=i-j;System.out.println(i);
0101000001000101010011110101101010100101110101010101000010001110000000
자바�가상�기계
운 체제
하드웨어
소스�파일(Test.cpp)
(b)�C++의�경우
바이너리�실행�파일(Test.exe)
C++�컴파일러/링커
C++�프로그램(Test.exe)
if(i>0) { i=i*10;}i=i-j;cout<<i;
0101000001000101011011110101101010100101111101010101001010101110001100
운 체제
하드웨어
제1장 자바 시작 271 C H A P T E R
Tip 자바와 C/C++ 실행환경및실행과정
자바와 C/C++의실행환경과실행과정의차이점을정리하면다음과같다.
◆ 자바
�자바는링크과정이없이컴파일러가바로바이트코드를생성한다.
�바이트코드는자바가상기계에서만실행가능하다.
�자바는 런타임에 필요한 클래스들이 자바 가상 기계에 의해 링크되며 클래스 로더가 동적
으로필요한클래스를로딩한다.
�ClassLoader 객체를이용하여프로그래머가직접클래스를로딩할수도있다.
◆ C/C++�C/C++에서는 컴파일러가 중간 단계인 오브젝트 코드를 생성한 후 링커가 필요한 라이브러
리들을링크하여최종실행가능한실행파일을생성한다.
�정적 라이브러리의 경우 라이브러리를 실행 파일에 포함시키므로 실행 파일 크기가 커
진다.
�동적라이브러리의경우런타임에링크가일어난다.
�오브젝트 코드및실행파일은 플랫폼에따라다르므로 플랫폼이 바뀌면컴파일 및링크를
새로해야한다.
자바는 1995년 발표 이래 인터넷의 보급 확 , 휴 전화와 같은 네트워크 연결 기능
을갖는휴 용기기의발전등으로폭발적으로성장하고있다. 다음은자바가얼마나
성장하 는지단적으로보여주는예이다.
�매년천억달러이상의비즈니스창출
�30억달러이상의자바모바일게임시장
�현재개발중인무선응용프로그램 10개중에 7개는자바실행환경이용
�약 450만명의소프트웨어개발자가자바관련직업에종사
�엔터프라이즈에서는 약 22억 달러의 자바 응용 서버와 천백억 달러 정도의 관련
IT투자
�약 5억 8천 의자바지원단말기와 100여개의사업자가자바플랫폼배치
�약 7억 5천만 의자바카드보급
(출처: “The 10-yr Story: Java and the Networked World”, Financial Express, 2005. 4.)
자바 프로그래밍JAVA JAVA PROGRAMMING28
� 자바의태동원인이아닌것은?
①가전제품에사용할소프트웨어를만들고자하 다.
②플랫폼독립적인언어와실행환경을만들고자하 다.
③내장형시스템에적합한언어와실행환경을만들고자하 다.
④효율적인절차적언어를만들고자하 다.
� 자바의초기이름은무엇인가?
� WORA는무엇의약자이며그뜻은무엇인가?
� 자바 가상 기계는 플랫폼 독립적인가, 의존적인가? 자바 응용프로그램은 플랫폼 독립적인가, 의존
적인가?
� 자바의 WORA를가능하게만드는요인 2가지는무엇인가?
CHECKTIME
1.3 자바의진화
자바와 오픈 소스
2006년 11월에 선마이크로시스템스(현재는 오라클)는 부분의 자바 소스를 GPL(GNU
General Public License)로오픈하여누구나자바소스를열람하고참조할수있게하
다. 오픈 소스(open source)란 소프트웨어 제공자의 권리를 보존하며 소스 코드를
누구나열람할수있도록무상공개한소프트웨어를말한다. 오픈소스소프트웨어의
장점은다음과같다.
�공개된소스코드를참조함으로써개발시간및비용을단축시킨다.
�공개된소프트웨어를다양하고많은수의인원이참여하여개량함으로써우수한
품질의소프트웨어를개발할수있다.
GPL 오픈 소스를 이용하여 만든 새로운 소프트웨어도 GPL의 규칙에 의해 다시 오픈
소스로 공개해야 한다. 이처럼 오픈 소스는 누구나 자유롭게 소스를 공유하고 발전시
킬 수 있는 권리를 보장하고 있어 많은 소프트웨어 개발자 및 회사가 동참하고 있다.
그러나오픈소스가무조건다좋은것은아니다. 다음과같은단점도내포하고있다.
�무단으로상용화할경우저작권침해가발생할수있다.
�다양한개량버전의소프트웨어로인한호환성문제가생길수있다.
오픈소스중가장유명한리눅스와자바외에도많은오픈소스가있다. 표적인소프
트웨어로는Open Office, Open Solaris, Mozilla, Apache, GNU, WebKit, Android등이있다.
다음은오픈소스를모아놓은유명한사이트의주소이다. 많은개발자들이이곳에
서오픈소스를다운받고수정하여제품을만들거나참고하고있다.
자바의 배포판 종류
오라클 사는 용도에 따라 10여 가지의 서로 다른 자바 배포판을 제공하고 있다. 자바
배포판은 자바 응용프로그램을 개발하고 실행하는데 필요한 총체적 환경을 말하며
JDK(Java Development Kit)라고도 부른다. JDK는 [그림 1-9]와 같이 자바 컴파일러 등
자바 응용프로그램을 개발하는데 필요한 도구와 자바 응용프로그램이 실행될 때 필
요한 자바 가상 기계와 표준 클래스 파일들을 포함하는 JRE(Java Run-time
Environment)로구성된다. 다음은 표적인 3가지자바배포판을설명한다.
● Java SE(Standard Edition)
자바 표준 배포판으로서, 데스크톱 응용프로그램과 서버 응용프로그램의 개발 플랫
폼이다. 이책에서설명되는모든내용은 [그림 1-9]의배포판을기준으로한다.
http://sourceforge.net
제1장 자바 시작 291 C H A P T E R
GPL
오픈소스
배포판
JDK
자바컴파일러
JRE
자바표준배포판
● Java ME(Micro Edition)
모바일용배포판으로주로휴 전화나 PDA, 셋톱박스와같은제한된리소스를갖는하
드웨어에서응용프로그램개발을위한플랫폼이다. 자바응용프로그램이실행되는동
안사용되는메모리의양을가늠하는메모리풋프린트(foot print)가가장작다는특징
이있다. Java SE의축소판이며임베디드및가전제품을위한 API가정의되어있다.
● Java EE(Enterprise Edition)
기업용 배포판으로 자바를 이용한 다중 사용자, 기업용 규모 응용프로그램 개발을
위한 플랫폼이다. Java SE를 기본으로 인터넷 기반의 서버사이드(Server-side) 컴퓨
팅관련 API가추가되어있다.
자바 프로그래밍JAVA JAVA PROGRAMMING30
Java Language
java javac javadoc jar javap JPDA
Java VisualVMJConsole
IDL Deploy Monitoring
Java Web Start Applet/Java Plug-in
Troubleshoot Scripting JVM TI Web Services
Java DB Security
JavaFX
Swing
IDL JDBC JNDI RMI
Beans
JNI
Security Serialization Extension Mechanism XML JAXP
JARCollectionslang and util
Logging Management Preferences API Ref Objects
InstrumentationZipVersioningReflection
Java HotSpot Client and Server VM
Regular Expressions
Concurrency Utilities
Math Networking Override Mechanism
Int'l Support Input/Output JMX
RMI-IIOP Scripting
Java 2D AWT
Drag and Drop Input Methods Image I/O Print Service Sound
Accessibility
Int'l RMI
Java SEAPI
Java Language
Deployment
User InterfaceToolkits
IntegrationLibraries
Other BaseLibraries
Java Virtual Machine
lang and utilBase Libraries
Tools &ToolAPIs
JDK
JRE
[그림 1-9] Java SE 구조 (출처: http://download.oracle.com/javase/7/docs/)
모바일용배포판
기업용배포판
� 휴 폰에실행될자바응용프로그램을개발하고자할때이용하여야할자바배포판은무엇인가?
� 오라클의자바플랫폼의모든소스는공개되어있는가?
CHECKTIME
JDK와 JRE
JDK는 Java Development Kit의약자로서, 자바응용프로그램개발에필요한자바컴파
일러 및 기타 도구, JRE(Java Runtime Environment), 클래스 라이브러리의 소스 및 자
바응용프로그램샘플소스등을포함한다. 그구성은 [그림 1-10]과같다.
프로그램을개발하지않는보통사용자의경우자바가상기계등을포함하는자바
실행 환경만 필요하기 때문에 JRE만 있으면 된다. JRE는 부분의 컴퓨터에 설치되어
있기때문에보통사용자는잘모르고사용하는경우가 부분이다. 자바프로그램이
실행되지않는다는시스템메시지가출력되면 JRE만따로다운받을수있다.
[그림 1-10]에서볼수있듯이, JRE는 bin 디렉터리밑에자바클래스파일을해석하
고 실행하는데 필요한 소프트웨어를 두고, lib 밑에는 호출하여 실행할 수 있도록 미
리 컴파일 한 자바 API 라이브러리를 두고 있다. JDK는 다음 오라클의 자바 사이트에
서무료로다운로드받을수있다.
JDK를 다운로드받고 설치하는 방법은 CD를 참조하기 바란다. JDK를 설치하면 [그림
1-10]과같은디렉터리구조가생성된다.
[그림 1-10] Java SE 7(JDK 7) 설치 후 디렉터리 구조
다음은 JDK의 bin디렉터리에포함되어있는주요한개발도구들이다.
자바�개발,�실행하는데�필요한�도구와�유틸리티
자바로�DB�응용프로그램을�개발하는데�필요한�도구
자바�프로그래밍�데모�예제와�소스�코드
네이티브�코드�프로그래밍에�필요한�헤더�파일
자바�프로그램�샘플�소스�코드
자바�API�클래스들에� 한�자바�소스
자바�런타임�환경.�JVM,�클래스�라이브러리�등�실행에�필요한�파일
JDK의�기본�라이브러리�외�추가�클래스�라이브러리와�개발�도구에서�필요로하는�여러�파일
http://www.oracle.com/technetwork/java/index.html
제1장 자바 시작 311 C H A P T E R
1.4 자바개발환경구축
JDK
JRE
자바 프로그래밍JAVA JAVA PROGRAMMING32
�javac :자바소스를바이트코드로변환하는컴파일러
�java : jre의 bin 디렉터리에도 동시에 설치되어 있는 자바 응용프로그램 실행기
로서, 이도구를통해자바가상기계가작동하며자바프로그램실행
�javadoc :자바소스프로그램으로부터 HTML형식의 API도큐먼트생성
�jar : 자바 클래스 파일을 압축한 자바 아카이브 파일(JAR)을 생성하고 관리하는
유틸리티
�jdb :자바응용프로그램의실행중오류를찾는데사용하는디버거
�javap : 클래스 파일에 담긴 바이트 코드를 자바 소스와 함께 보여주는 디어셈블
러(disassembler). [그림 1-6]은 이도구를이용하여생성하 음
�appletviewer : 웹 브라우저 없이 애플릿 응용프로그램을 실행하고 디버깅하는
유틸리티
자바 API
자바에서서로관련된클래스들을분류하여묶어놓은것을패키지(package)라부른다.
자바 API란오라클사에서제공하는것으로주요한기능들을미리구현한클래스라이
브러리로묶어놓은패키지들이다. 개발자는이 API를이용하여쉽고빠르게자바프로
그램을개발할수있다. 예를들어, 모니터화면에문자를출력하거나키보드에서입력
을받는것과같은매우빈번히사용되는기능들은자바에서미리구현하여 API로제공
한다. 이 API를이용하면개발자는일일이모니터나키보드를제어하는프로그램을작
성하는 노고를 덜게 된다. 이를 위해 개발자는 자바 API로부터 필요한 클래스가 속한
패키지만 import하여사용하면된다. 패키지에 한자세한내용은 6장에서다룬다.
자바 API에 한문서는온라인으로다음사이트에서제공된다.
[그림 1-11]은온라인자바 API 문서를참조하는사례이다. 저자는자바프로그램을
개발하는동안에이사이트를열어놓고참조한다. 독자들도이사이트를꼼꼼히읽어
가면서자바프로그램을개발하기바란다.
http://docs.oracle.com/javase/7/docs/api/
자바응용프로그램실행기
패키지
자바 API
온라인자바 API 문서
제임스고슬링(James A. Gosling, 1955. 5. 19. ~ )은캐나다에서태
어난 소프트웨어 개발자이다. 1995년에 자바 프로그래밍 언어를 최
초로 개발하 으며, 자바 이외에도 Multi-Processor용 UNIX와
Complier, Mail System, 데이터 인식 시스템 등을 개발하 다. 제임
스고슬링은많은가전제품들이하나의거 한네트워크에연동될것
으로 예측하 다. 즉, 가전제품의 기능이 향상되어 프로그램이 바뀔
때마다 가전제품을 공장에 보내어 내장된 프로그램을 교체하는 신(사진출처: 위키백과)
[그림 1-11] 온라인 자바 API 문서
자바 IDE
IDE란 Integrated Development Environment의 약자로서, 어 단어가 뜻하는 그 로
소스코드편집, 컴파일, 디버깅을한꺼번에할수있는통합개발환경이다. IDE 하면
가장 먼저 떠오르는 것이 마이크로소프트(MS) 사의 비주얼스튜디오일 것이다. 자바
응용프로그램개발에사용되는유사한통합개발환경이있는데, 현재가장널리쓰이
는 것은 이클립스(eclipse)이다. 이클립스는 IBM에 의해 자바로 만들어진 오픈 소스
소프트웨어로서 http://www.eclipse.org/downloads에서 무료로 다운로드받아 사용
할수있다. 이책의모든소스는이클립스로개발되었으며, 이책의 CD에이들소스를
이클립스환경에서설치하는법이들어있다.
제1장 자바 시작 331 C H A P T E R
에 네트워크를 통하여 새로운 프로그램을 다운로드받아 가전제품의 기능을 향상시킬 수 있다고 보았다.
그의 예측은 10년도 되지 않아 현실로 이루어져 지금은 휴 폰은 물론이고 TV셋톱박스, 로봇 등에 자바
로 만든 프로그램이 탑재되어 폭넓게 쓰이고 있다. ‘자바의 아버지’라 불리며, 가장 향력 있는 프로그
래머 중 한 사람이 된 그는 인도네시아의 자바 섬에서 나온 커피를 하루에 10여 잔씩 마시는 Java 예찬
론자이기도하다. 그래서‘Java’라는명칭을커피재배지인자바섬에서따왔다고한다.
IDE
통합개발환경
이클립스
자바 프로그래밍JAVA JAVA PROGRAMMING34
Tip javadoc을이용한자신만의 API 도큐먼트생성
JDK에 포함된 javadoc을 이용하면 소스의 선언문과 특별한 형식의 주석문을 파싱하여 온라
인 자바 API 문서 [그림 1-11]과 유사하게 HTML 형식의 API 도큐먼트를 생성할 수 있다. 이
문서에는클래스, 인터페이스, 생성자, 메소드, 필드등을기술한다.
API 도큐먼트를 생성하기 위해 개발자는 자바 소스 파일에 다음과 같이 /**와 */ 사이에 정
보를주어야한다.
다음 소스는 Hello.java에 API 도큐먼트 생성을 위한 주석문을 삽입하여 HelloDoc.java 파
일을만든것이다. [그림 1-12]는 javadoc을이용하여자바소스에서 API 도큐먼트를생성하
는과정이며 [그림 1-13]은생성된 API 도큐먼트를브라우저로확인하는그림이다.
/*** javadoc 사용 예제를 위한 클래스
*/public class HelloDoc {
/*** 두 정수의 합을 구하는 메소드
** @param i 합을 구할 첫번째 정수형 인자
* @param j 합을 구할 두번째 정수형 인자
* @return 두 정수의 합을 리턴
*/
public static int sum(int i, int j) {return i + j;
}
public static void main(String[] args) {int i;int j;char a;String b;final int TEN = 10;
i = 1;j = sum(i, TEN);a = '?';b = "Hello";
java.lang.System.out.println(a); // ‘?’ 출력
System.out.println(b); // “Hello” 출력
123456789101112131415161718192021222324252627282930
/**이곳에 기술되는 내용은 javadoc이 API 도큐먼트로 인식함
*/
주목
주목
제1장 자바 시작 351 C H A P T E R
[그림 1-12] javadoc을 이용하여 HelloDoc.java의 API 도큐먼트인 HelloDoc.html 생성
[그림 1-13] HelloDoc 클래스의 API HTML 문서, HelloDoc.html
System.out.println(TEN); // 10 출력
System.out.println(j); // 11 출력
}}
31323334
HelloDoc.html�파일�생성
주목
주목
자바프로그램을 개발하는 전체과정을 설명하기 위해다음과 같이간단한 자바프로
그램을준비하 다.
// Hello2030.java 파일에 작성
public class Hello2030 {
public static void main(String[] args) {
int n = 2030;
System.out.println("헬로"+n);
}
}
자바 프로그래밍JAVA JAVA PROGRAMMING36
이클립스(Eclipse)는 다양한 프로그래밍 언어의 통합 개발을 지원하기 위해 IBM이 VisualAge 라
는소프트웨어를만드는과정에서자바언어로개발하게되었다. 2004년에 Eclipse 3.0의배포판
을공급하기시작하여, UI와기능을개선한배포판을매년내놓고있다. 배포판은처음에 4개의목
성 위성 이름으로 붙이기로 결정하여 Calisto(2006년), Europa(2007년), Ganymede(2008년),
Galileo(2009년)로 붙이다가, 2010년에는 태양을 의미하는 Helios, 2011년에는 남색 쪽빛을 의미
하는 Indigo, 2012년에는 로마 신화에 나오는 주피터의 아내 이름인 Juno로 이름을 붙 다. 현재
이클립스는 Ada, C, C++, Perl, PHP, Python, Ruby, Java, Android 등다양한프로그래밍 언어의 통
합개발환경에사용되고있다.
잠깐!
1.5 자바프로그램개발
� 자바응용프로그램을개발하는사람이아닌경우자바응용프로그램을실행할수있는환경을갖추
고싶을때설치하여야하는것은 JDK인가, JRE인가?
� JDK를설치하면 src.zip 파일이있다. 이 zip 파일에는무엇이압축되어들어있는가?
� 자바컴파일러는어느디렉터리에설치되어있으며그이름은무엇인가?
� 자바 명령 실행기로서 자바 가상 기계를 가동시키는 프로그램의 이름은 무엇인가? 또 어디에 설치
되어있는가?
CHECKTIME
앞의자바프로그램은 "헬로2030" 문자열을화면에출력하는프로그램으로서간단
히설명하면다음과같다.
● public class Hello2030
클래스를정의한다. 클래스의이름은 Hello2030이며여러개의클래스를정의할수도
있다. 모든클래스의정의는‘{’으로시작하여‘}’으로끝난다.
● public static void main(String[] args)
자바클래스는여러개의함수를포함할수있다. 자바에서는함수를멤버메소드라고
부른다. 프로그램 실행은 main() 메소드부터 시작한다. 모든 메소드의 정의도‘{’으
로시작하여‘}’으로끝난다.
● int n = 2030;
지역 변수를 선언한다. 변수 선언과 함께 초깃값을 지정할 수도 있다. 변수 선언문은
‘;’으로끝난다.
● System.out.println(“헬로“ + n);
"헬로"+n의 결과는 "헬로2030" 문자열이며 "헬로2030"을 출력하는 실행문이다.
System.out.println()은JDK에의해개발자에게제공되는자바API이며, 개발자는이를
이용하여화면에숫자와문자, 문자열들을출력한다. 모든실행문은‘;’으로끝난다.
자바 소스 편집
앞의자바프로그램을직접편집하여실행해보자. 먼저윈도우의보조프로그램에있
는 메모장을 실행시켜 아래 [그림 1-14]와 똑같이 입력한다. 그리고 C:\Temp에
Hello2030.java로 저장한다. 나중에 설명하겠지만, 자바에서는 클래스 이름과 자바
소스 파일 이름이 일치하여야 한다. 클래스 이름이 Hello2030이므로 파일 이름은
Hello2030.java이다. 자바 소스 파일의 확장자는 .java이다. 소문자를 구분하므로
주의하기바란다.
[그림 1-14] 메모장으로 Hello2030.java 소스 작성
제1장 자바 시작 371 C H A P T E R
클래스
멤버메소드
main()
지역변수
Hello2030.java
.java
주목
주목
자바 소스 컴파일
명령창을실행시켜 Hello2030.java 파일이저장된디렉터리로이동한다. 그러고나서
[그림 1-15]와 같이 Hello2030.java 소스 파일을 확인한 후에 JDK의 자바 컴파일러인
javac를 실행하여 Hello2030.java 소스를 컴파일한다. 그 결과 Hello2030.class 파일
이생성된다. 컴파일된바이트코드가들어있는파일은확장자가 .class이다.
[그림 1-15] Hello2030.java 프로그램 컴파일, Hello2030.class 클래스 파일 생성
자바 응용프로그램 실행
이제 JDK에서제공되는 java 명령으로 Hello2030.class를실행시켜보자. 이때확장자
.class는빼고클래스이름 Hello2030만입력하는것에주의한다. Hello2030 응용프로
그램의실행과결과는 [그림 1-16]과같다.
[그림 1-16] Hello2030 응용프로그램 실행
자바 프로그래밍JAVA JAVA PROGRAMMING38
javac
Hello2030.java
Hello2030.class
.class
java
컴파일
클래스�파일�생성
.class�확장자를�붙이지�않는다.
C:\Temp�디렉터리로�이동
실행�결과
이 책에서는 특별한 경우를 제외하고는 모든 예제의 작성과 실행은 이클립스를 이용
한다. 앞서 만든 Hello2030.java 프로그램을 이클립스를 이용하여 작성하고 실행해
보자.
이클립스 실행
이클립스를실행하면 [그림 1-17] (a)의첫화면이보이고바로 workspace를묻는다이
얼로그가 출력된다. 이클립스에서 workspace란 개발자가 자바 프로그램을 개발하는
작업공간으로서일종의폴더이다. 독자들은미리‘C:\자바학습’폴더를만들어두고,
[그림 1-17] (b)의윈도우에서‘Browse’버튼을눌러‘C:\자바학습’폴더를지정한다.
처음으로이클립스를사용하면 Welcome 페이지가출력될것이다. 이페이지를닫으
면 [그림 1-18]과같이이클립스의사용자인터페이스가보인다.
제1장 자바 시작 391 C H A P T E R
1.6 이클립스를이용한자바프로그램개발
� 자바프로그램의실행이시작되는메소드이름은?
� JDK는자바프로그램개발에필요한많은명령들을제공한다. 다음명령이의미하는바를설명하라.
(1) javac prog.java
(2) java binarycopy
� 다음자바프로그램에서 빈칸에적절한것은무엇인가? 그리고이소스파일을어떤이름으로저장
해야하는가?
public JavaApp {public static void main(String[] args) {
int x = 2080;System.out.println("헬로" + x);
}}
CHECKTIME
이클립스
workspace
(a) 초기 화면
(b) 작업 공간(workspace)을 지정하는 윈도우
[그림 1-17] 이클립스 실행
[그림 1-18] 이클립스의 사용자 인터페이스
자바 프로그래밍JAVA JAVA PROGRAMMING40
이클립스�Juno�배포판
작업�공간�폴더�지정
프로젝트 생성
프로그램을작성하기에앞서우선프로젝트(project)를생성한다. 이클립스에서프로
젝트를 생성하려면 메뉴에서 [그림 1-19]와 같이 File→ New→ Project를 선택한다.
[그림 1-20]과 같이 프로젝트의 종류를 선택하는 윈도우가 나타나고 여기서 Java
Project를 선택한다. 이제 [그림 1-21]의 프로젝트 생성 윈도우가 나타난다. Project
name 칸에프로젝트 이름을입력한다. 이예에서는 프로젝트의이름을 SampleProject
로 입력하 다. 이 컴퓨터에 JDK 7이 설치되어 있기 때문에 프로젝트 생성 윈도우의
JRE 환경이 JavaSE-1.7로설정되어있는것을볼수있다. Finish 버튼을누르면프로
젝트의생성이완료된다.
[그림 1-19] 이클립스의 사용자 인터페이스. Project 메뉴 선택
제1장 자바 시작 411 C H A P T E R
Project�메뉴�선택
이클립스에서 프로젝트는 하나의 자바 응용프로그램에 속하는 여러 개의 자바 소스 파일과 이미
지, 동 상 같은 리소스, 컴파일 된 클래스 파일들을 일괄적으로 관리하기 위한 개념이다. 프로젝
트가 생성되면 프로젝트 이름의 폴더가 생기고 그 안에 개발자가 만든 소스와 컴파일 된 클래스
파일들이생겨나게된다.
잠깐!
프로젝트
Java Project
Project name 칸
프로젝트생성윈도우
[그림 1-20] 프로젝트의 종류, Java Project 선택
[그림 1-21] 프로젝트 생성 윈도우. 프로젝트 이름을 SampleProject로 입력
자바 프로그래밍JAVA JAVA PROGRAMMING42
Java Project�선택
프로젝트�이름�지정
이�컴퓨터에�JDK 7이�설치되어�있음.�자동
Finish 선택
클래스 생성
프로젝트를 생성하고 나면, 자바 응용프로그램을 작성하기 위해 클래스를 생성해야
한다. 메뉴에서 File→ New→ Class를 선택하면 [그림 1-22]와 같이 클래스 생성 윈
도우가 나타난다. Name 칸에 클래스 이름 Hello2030을 입력한다. 나머지 옵션은 수정
할필요가없으므로 Finish 버튼을눌러클래스생성을마치면, [그림 1-23]과같이소
스편집윈도우에 Hello2030 클래스의선언을포함하는소스가자동생성된다.
[그림 1-22] 클래스 생성 윈도우. 클래스 이름을 Hello2030으로 입력
제1장 자바 시작 431 C H A P T E R
클래스생성윈도우
Name 칸
소스가자동생성
주목
클래스�이름�입력
Finish 선택
자바 프로그래밍JAVA JAVA PROGRAMMING44
[그림 1-23] 생성된 Hello2030 클래스 소스. Hello2030.java 파일에 저장
소스 편집과 컴파일 및 실행
[그림 1-23]의소스편집윈도우에, 앞서메모장에작성한것과동일한소스를입력한
다. 이클립스는소스입력과동시에자동으로컴파일하기때문에컴파일과정이따로
없이 바로 실행할 수 있다. 작성된 자바 프로그램의 실행은 Run→ Run 메뉴를 선택하
거나툴바에서아이콘( )을클릭하면된다. 작성된프로그램을실행하면 [그림 1-
24]와같이실행결과가콘솔윈도우에출력된다.
[그림 1-24] 이클립스에서 자바 응용프로그램 실행. ‘헬로2030’출력
소스편집윈도우
자바프로그램의실행
콘솔윈도우
주목
주목
주목
실행�결과
콘솔�윈도우
실행�버튼 Run → Run 실행�메뉴
자바 언어는 현재 IT 현장에서 가장 많이 사용되는 언어로서 다양한 분야에서 사용된
다. 자바 언어로 개발되는 응용프로그램의 종류에는 어떤 것들이 있을까? 자바 언어
로개발되는응용분야를살펴보자.
데스크톱 응용프로그램
자바 언어로 개발하는 가장 일반적인 응용프로그램으로서 PC 등의 데스크톱 컴퓨터
에 설치되어 실행되는 응용프로그램이다. 자바 개발 환경으로 사용하는 이클립스도
이유형에속한다. 자바실행환경(JRE)이설치된어떤컴퓨터에서도실행되며다른응
용프로그램의도움없이단독으로실행된다. 이책에서설명하는 부분의내용이데
스크톱 응용프로그램의 개발에 관한 것이다. [그림 1-25]는 자바로 개발된 스네이크
게임의예를보여준다.
[그림 1-25] 자바 언어로 작성된 자바 데스크톱 프로그램 예
애플릿 응용프로그램
웹페이지에내장되어 실행되는자바응용프로그램을 애플릿(applet)이라고 한다. 애
플릿은단독으로실행될수없고익스플로러와같은웹 브라우저에 의해 구동되고 실
행이 제어된다. 애플릿은 웹 서버에서 사용자 컴퓨터에 다운로드되어 사용자 컴퓨터
제1장 자바 시작 451 C H A P T E R
1.7 자바응용프로그램의종류
단독으로실행
데스크톱응용프로그램
애플릿
웹 브라우저에 의해 구동되
고실행이제어
에설치된웹브라우저에의해실행된다. 웹브라우저가애플릿을실행하기위해서는
자바가상기계를가지고있어야한다. 데스크톱응용프로그램은내컴퓨터에설치되
어 있어야 실행할 수 있는 반면, 애플릿은 어디서든지 웹 서버에 접속하여 실행할 수
있는 장점이 있다. 애플릿은 서버에서 다운로드 되어 사용자 컴퓨터에서 실행되므로
보안의이유로접근할수있는자원(리소스)에제약이있다. 예를들면, 애플릿은실행
중에 사용자 컴퓨터의 파일을 접근할 수 없다. 자세한 내용은 15.6절에서 다룬다. [그
림 1-26]은 웹에서 엑셀 스프레드시트와 같은 기능을 수행하는 애플릿 응용프로그램
의예이다.
[그림 1-26] 애플릿 응용프로그램 예
자바 서블릿(servlet) 응용프로그램
자바 서블릿(java servlet)은 애플릿과 반 로 서버에서 실행되는 서버용 자바 프로
그램이다. 서블릿은 [그림 1-27]과 같이 서버-클라이언트 모델로 구성되는 시스템에
서서버의역할을하며, 웹브라우저상에서실행되는애플릿이나자바스크립트코드
등과 통신한다. 애플릿은 웹 사용자에게 GUI 환경을 제공하는 간단한 기능을 구현하
는반면, 서블릿은 Java EE의일부분으로서웹서버에연동되는데이터베이스나다른
서버와 연동하여 쇼핑몰이나 온라인 뱅킹 등의 규모의 복잡한 응용프로그램을 구
현할 때 쓰인다. 자바 서블릿은 사용자 인터페이스를 필요로 하지 않으며 웹 서버에
의해 실행이 제어된다. [그림 1-27]은 서블릿과 애플릿이 서로 통신하며 작동하는 예
를보여준다.
자바 프로그래밍JAVA JAVA PROGRAMMING46
[그림 1-27] 서블릿 응용프로그램 예
모바일 응용프로그램
자바는 설계 당시부터 플랫폼 독립적이고 메모리 사용량이 적으며 통신 환경을 지원
하도록개발되었다. 그러므로다양한하드웨어, 소프트웨어플랫폼을갖는모바일기
기에적합하여다양한모바일응용프로그램개발에사용되고있다.
● Java ME
Java ME는 모바일 기기를 위한 자바 배포판으로서, 많은 이동 통신사와 단말기 제조
웹�브라우저
인터넷
서버
서버…
웹�서버
JVM
servlet
제1장 자바 시작 471 C H A P T E R
[그림 1-28] Java ME 실행 화면
Java ME
사에 채택되어 게임, 멀티미디어 응용프로그램 등에 사용되고 있다. 유럽이나 미국
에서출시되는 부분의단말기에는자바기술이탑재되어있으며, 노키아, 삼성, LG,
소니 에릭슨, 모토롤러 등과 같은 세계 유수의 단말기 제조사들은 자바 기술이 탑재
된단말기를출시하고있다. [그림 1-28]은 Java ME를사용한사례를보여준다.
●안드로이드(Android)
검색 엔진으로 유명한 구 (Google)의 주도로 여러 모바일 회사가 모여 구성한
OHA(Open Handset Alliance)에서 개발한 무료 모바일 플랫폼을 안드로이드라고 한다.
개발언어는 자바를사용하나 오라클 사의자바 라이선스를 피하기위해 별도의개발
도구를 개발하 으며, Dalvik이라는 새로운 자바 가상 기계를 개발하 다. 안드로이
드는자바바이트코드의효율을개선한새로운바이트코드체계를개발하 으며, 기
존바이트코드는호환성이없어변환이필요하다. 현재 다수의모바일단말기제조
사에서 안드로이드를 채택하고 있다. 안드로이드는 스마트폰뿐만 아니라 모바일 학
습기기, 태블릿 PC, PMP 등 다양한 종류의 모바일 기기의 플랫폼으로 사용될 것으로
예측된다. [그림 1-29]는안드로이드에뮬레이터에서실행되는안드로이드앱의사례
를보여준다.
[그림 1-29] 안드로이드 앱의 실행 화면
자바 프로그래밍JAVA JAVA PROGRAMMING48
구
안드로이드
제1장 자바 시작 491 C H A P T E R
자바언어와자바시스템은다음과같은독특한특성을가진다.
●객체 지향
자바는 객체 지향 언어로서 클래스 계층 구조, 상속성, 다형성, 캡슐화 등을 지원한
다. 객체 지향 프로그램은 해결할 과제를 실제 세상의 객체와 객체 간의 상호 관계로
모델링하여인간의사고에가깝게표현한다. 객체지향특징은 4장과 5장을참조하기
바란다.
●멀티스레드
자바는 하나의 프로그램에서 다수의 스레드가 동시에 실행할 수 있는 환경을 지원한
다. 멀티스레드 프로그램을 작성하기 위해서는, 운 체제가 멀티스레드를 지원하고
멀티스레드와 관련된 API나 라이브러리를 제공해야만 한다. C, C++ 등 많은 언어들은
자체적으로 멀티스레드를 지원하지 않아 운 체제의 도움을 받는다. 그러나 자바는
운 체제의 도움 없이 멀티스레드 프로그래밍이 가능하다. 멀티스레드를 지원하지
않는 운 체제에서도 자바를 이용하면 멀티스레드 프로그램을 개발할 수 있다. 멀티
스레드프로그래밍은 13장을참조하기바란다.
●플랫폼 독립성
자바는하드웨어, 운 체제등플랫폼에종속되지않는독립적인바이트코드로컴파
� 애플릿응용프로그램의약점은무엇인가?
� 웹서버에서실행되는자바응용프로그램을무엇이라고부르는가?
� 구 의주도로만든자바기반의모바일플랫폼은?
� 다음중사용자인터페이스를만들필요가없는자바응용프로그램의종류는?
①데스크톱응용프로그램 ②애플릿 ③서블릿 ④모바일응용프로그램
CHECKTIME
1.8 자바의특징
클래스계층구조
상속성
다형성
캡슐화
다수의스레드
동시에실행
일 되며 자바 가상 기계만 있으면 하드웨어나 운 체제를 막론하고 자바 프로그램의
실행이가능하다.
●소스와 클래스 파일
하나의 자바 소스 파일에는 여러 개의 클래스를 작성할 수 있지만, 하나의 클래스 파
일(.class)에는반드시하나의컴파일된자바클래스만이포함된다. 하나의자바소스
파일에여러개의클래스를작성한경우, 컴파일후클래스마다별도의클래스파일이
생성된다. [그림 1-30]은 A.java에 4개의클래스가작성된예이다. A.java를컴파일하
면 4개의 클래스 파일이 생성된다. 클래스 D는 클래스 C 내에 작성된 내부 클래스
(innner class)로서 C$D.class 이름으로 생성된다. 하나의 자바 소스 파일에 작성된
클래스 중 오직 한 클래스만 public으로 선언할 수 있다. 소스 파일 내에 public으로
선언된클래스의이름과소스파일의이름이동일하게작성되어야한다.
[그림 1-30] 소스 파일과 클래스, 클래스 파일의 관계
●실행 모듈
자바응용프로그램은한개의클래스파일또는다수의클래스파일로구성된다. 다수
의클래스파일을 jar 파일형태로압축하여배포및실행이가능하다. 자바의실행은
main() 메소드에서 시작되며, 하나의 클래스 파일에 하나 이상의 main() 메소드가 있
을수없지만다수의클래스파일이각각 main()메소드를가지는것은상관없다.
●클래스로 캡슐화
자바는객체지향언어의캡슐화(encapsulation)의원칙을철저히지켜변수나메소드
자바 프로그래밍JAVA JAVA PROGRAMMING50
자바가상기계
내부클래스
C$D.class
main() 메소드
캡슐화
는 반드시 클래스 내에 구현한다. 클래스에 속하지 않은 변수나 메소드는 있을 수 없
다. 클래스안에새로운클래스, 즉내부클래스를만들수있다.
●패키지
패키지는 자바의 독특한 개념이다. 서로 관련 있는 클래스는 패키지로 묶어 관리한
다. 패키지는 파일 시스템의 폴더 개념과 같다. 예를 들어, java.lang.System 클래스
는 java\lang 폴더의 System.class 파일을 나타내며, 여기서 java.lang을 패키지라고
부른다.
제1장 자바 시작 511 C H A P T E R
패키지
파일시스템의폴더개념
� 하나의자바소스파일에서정의할수있는클래스의개수는?
� 10개의클래스파일이있을때 main() 메소드는최 몇개가있을수있는가?
� 클래스에속하지않은변수와메소드가있을수있는가? 이것은어떤객체지향속성과관련되는가?
CHECKTIME
자바 프로그래밍JAVA JAVA PROGRAMMING52
SUM
MARY
요약 ●프로그램또는소프트웨어는컴퓨터가이해하고처리할수있는일련의명령들이다.
●프로그래밍언어는컴퓨터를구동시키는프로그램을작성하기위한언어이다.
●소스파일을컴퓨터가이해할수있는기계어로변환하는것을컴파일이라한다.
●자바는 1991년 선마이크로시스템스(현재 오라클)의 제임스 고슬링에 의해 개발되기 시작하여
1995년에발표되었다.
●자바의 개발 목적은 매우 다양한 플랫폼을 갖는 가전제품을 위해 플랫폼에 독립적인 언어를
개발할 필요성에 있었다. 또한 가전제품에 들어가는 제어 장치는 매우 적은 양의 메모리를 사
용하므로, 이러한 내장형 시스템(embedded system)의 메모리 요구 사항을 충족할 수 있는 새
로운언어의개발필요성에있었다.
●자바는 GPL(GNU General Public License)로소스를오픈한오픈소스소프트웨어이다.
●자바의 배포판은 개발 응용의 실행 환경에 따라 데스크톱이나 서버 응용을 위한 Java SE, 모
바일장치를위한 Java ME, 규모기업용응용을위한 Java EE로나누어진다.
●자바 프로그램을 개발하고 실행하기 위한 환경은 JDK에서 제공하며, IDE 환경을 제공하는 도
구에는이클립스가있다.
●자바에서 제공하는 API는 http://docs.oracle.com/javase/7/docs/api/에서 온라인으로
참조할수있다.
●자바 프로그램은 클래스 정의로 시작하며, 클래스 내에서 모든 변수나 메소드를 정의한다. 실
행은 main() 메소드부터시작한다.
●하드웨어독립적인바이트코드와이를실행하는자바가상기계에의해한번프로그램을작
성하면 어느 플랫폼에서도 자바 프로그램을 실행시킬 수 있는데, 이를 WORA(Write Once Run
Anywhere)라고한다.
●자바 소스 파일의 확장자는 .java이며 자바 컴파일러에 의해 컴파일된 파일은 클래스 파일로
서확장자는 .class이다.
●자바 컴파일러에 의해 컴파일된 코드를 바이트 코드(byte code)라고 부른다. 이 코드는 자바
가상기계상에서실행되는코드로서특정 CPU에의존적이지않기때문에 WORA를실현하는데
기여한다.
●하나의클래스파일에는반드시하나의자바클래스가포함되어있다.
●자바 응용프로그램은 웹 클라이언트, 서버, 웹 스타트, 데스크톱, 모바일 등과 같이 광범위한
분야에서사용되고있다.
●자바언어는객체지향, 멀티스레드, 캡슐화, 플랫폼독립성, 패키지등을지원한다.
●다수의클래스파일로자바응용프로그램이구성된경우에 jar 파일형태로압축하여배포및
실행이가능하다.
화면에 자신의 이름, 나이, 학과 등의 정보를 출력하는 자바 응용프로그램을 작성해보자. 이클립스를 실
행하고프로젝트를만들어라. 클래스이름을 MyInfoApp로하면 MyInfoApp.java 파일로자동저장된다.
이프로그램을실행하면다음과같이출력된다.
제1장 자바 시작 531 C H A P T E R
Open Challenge 가위바위보게임
1. C언어소스파일의확장자는 .c이고컴파일하면 .obj파일이된다. 그러면자바소스
파일의확장자와컴파일된파일의확장자는무엇인가?
2. 자바언어를처음개발한목적은무엇이었는가?
3. 자바의특징은 WORA라고말할수있다. WORA의목적은무엇인가?
4. 다음중에서틀린것은무엇인가?
①자바의클래스파일은바이트코드이다.
②자바의클래스파일은자바가상기계가설치된어떤곳에서도실행된다.
③자바는링크과정없이컴파일러가바로바이트코드를생성한다.
④자바가상기계는오직선마이크로시스템사에서만들어배포한다.
5. JDK와 JRE는 어떤 차이가 있는가? 만일 자바 응용프로그램을 개발하고자 한다면 이
둘중어떤것이필요한가?
6. 자바 언어로 만들 수 있는 응용프로그램의 종류를 나열하라. 그리고 각각의 특징을
설명하라.
7. 다음중자바의특징이잘못설명된것을모두골라라.
①객체지향언어이다.
②하나의소스파일에여러개의클래스를작성할수있다.
③하나의클래스파일에다수의클래스를포함할수있다.
④멀티스레드를지원한다.
⑤플랫폼에독립적이다.
⑥클래스는캡슐화를위한것이다.
⑦패지키의목적은자바응용프로그램을판매하기쉽게하기위해서이다.
이론문제
자바 프로그래밍JAVA JAVA PROGRAMMING54
연습문제E X E R C I S E
8. 다음코드는하나의소스파일에저장된다.
(1) 이소스파일의이름은무엇인가?
(2) 이소스파일이컴파일되면어떤클래스파일이생성되는가?
9. 다음자바소스프로그램을저장할때적절한파일이름은?
public class Add {
public static void main(String [] args) {
System.out.println(“Add“);
}
}
public class A {
............
class B {
............
}
}
class C {
............
class D {
............
}
}
제1장 자바 시작 551 C H A P T E R
1. 화면에“Welcome!!”을 출력하는 자바 프로그램을 작성하라. 이클립스를 이용하고,
작업 공간(workspace)은 C:\Temp로 하고, 프로젝트 이름은 1-1로 한다. 클래스 이름
은 Welcome으로한다.
2. 화면에“Sorry~~”을 출력하는 자바 프로그램을 작성하라. 이클립스를 이용하고, 작
업 공간(workspace)은 C:\Temp로 하고, 프로젝트 이름은 1-2로 한다. 클래스 이름은
Sorry로한다.
실습문제
자바 프로그래밍JAVA JAVA PROGRAMMING56
가비지 194, 203, 204
가비지 컬렉션 스레드 206, 662
가비지 컬렉터 203, 206
가상 키 521, 522
가지비 컬렉션 206
값 369, 389, 823
강제 타입 변환 73, 74, 259
객체 174
객체 배열 181
객체 소멸 202
객체 지향 49
객체 지향 데이터베이스 823, 824
객체 지향 언어 19, 49, 168
객체 지향 프로그래밍 170
객체 치환 193
경량 컴포넌트 455
고급 언어 19
관계 823
관계형 데이터베이스 823, 824, 834
구 48
구분 문자 350
구체화 370, 399
기계어 19
기본 생성자 198, 254
기본 타입 66
기업용 배포판 30
나열 135, 136
날짜 356
내부 클래스 50, 511
내장형 시스템 21
논리 연산자 87
논리 타입 리터럴 71
다운캐스팅 259, 260
다이얼로그 714
다중 if 문 96
다중 상속 244, 287
다차원 배열 138
다형성 173
입 연산자 89
데몬 스레드 662
데스크톱 응용프로그램 45, 752
데이터 타입 66
데이터베이스 822
도메인 이름 787
도형 그리기 612
도형 칠하기 615
동기화 객체 665
동적 바인딩 266, 268, 274, 277
드라이버 클래스 파일 840
드래깅 706
디어셈블 23
디폴트 185
디폴트 생성자 198
디폴트 패키지 322
라디오버튼 567
라디오버튼 컴포넌트 567
라운드 로빈 665
런타임 오류 150
레이블 컴포넌트 553
레코드 823, 832
레코드 추가 836
레퍼런스 66, 177
레퍼런스 배열 생성 181
레퍼런스 변수 129, 130, 178
레퍼런스 타입 66
로컬 문자 집합 427
리스너 인터페이스 503
리스트 컴포넌트 578
리터럴 68
리턴 타입 185
링크 26, 27
마이크로소프트 823
멀티스레드 49, 674
멀티스레딩 646
멀티태스킹 644
멀티프로세싱 646
메뉴 467, 700
메뉴 아이템 467, 700
메뉴바 463, 467, 700
메소드 60, 171, 177, 185
메소드 오버라이딩 266, 270, 277
메소드 오버로딩 189, 277
메소드 이름 185
메소드 중복 189
메소드 코드 185
메소드 호출 60
메시지 다이얼로그 727
메인 스레드 666
명령행 인자 146
모달 720, 725
모달리스 720
모바일 응용프로그램 47
모바일용 배포판 30
무한 반복 116, 121, 122
문자 버퍼 스트림 437
문자 스트림 417, 427, 809
문자 집합 428, 430
문자 타입 리터럴 70
문자열 67
문자열 레이블 554
문자열 리터럴 71
문자열 체크박스 562
문장 62
찾아보기
JAVA PROGRAMMING
바이너리 데이터 421
바이너리 코드 23
바이너리 파일 복사 446
바이트 버퍼 스트림 437
바이트 스트림 417, 421, 809
바이트 코드 23, 49
박싱 338
반복문 114
배열 128
배열 리턴 143
배열 생성 129, 130
배열 선언 129, 130
배열 참조 131
배열에 한 레퍼런스 선언 181
배치관리자 470
배치관리자 제거 484
배포판 29
버튼 그룹 567, 568
버튼 컴포넌트 556
버퍼 436
버퍼 스트림 436, 809
버퍼 입출력 436
변수 선언 60, 67
보안 754, 770
부모 클래스 172
블록 62
비교 연산자 87
비정방형 배열 138, 140
비트 연산자 84
산술 연산자 82
삼항 연산자 91
상속 172, 240
상수 72, 225
생명 주기 168, 753
생성자 176, 195, 196, 252
서버 801
서버 소켓 801, 804, 809
서브 클래스 172, 241
서블릿 46
서비스 관리자 832
소멸자 202
소스 파일의 확장자 19
소켓 800
소프트웨어 18
소프트웨어의 재사용 168
손잡이 587
수직 슬라이더 587
수직 정렬 559
수평 슬라이더 587
수평 정렬 559
슈퍼 클래스 172, 241
스레드 644, 645
스레드 객체 생성 652
스레드 동기화 674, 676
스레드 스케줄링 649
스레드 시작 652
스레드 종료 668
스레드 코드 652, 662
스윙 애플릿 754, 763
스윙 컨테이너 461
스케쥴링 646
스크롤바 575
스키마 824
스트림 416
스트림 연결 419
스트링 리터럴 341
슬라이더 587
슬라이더 컴포넌트 587
시간 356
시프트 연산자 85
식별자 63
실수 타입 리터럴 69
실행 파일 26
안드로이드 48
애플릿 45, 752, 754
애플릿 응용프로그램 45
애플릿뷰어 761
애플릿의 생명 주기 755
앱 18
어댑터 클래스 515
어셈블리어 19
언박싱 338
업캐스팅 259, 260, 261
연산자 81
연산자 우선순위 81
열 138, 823, 834
예약어 64
예외 150
예외 처리 151
오디오 클립 771
오라클 21, 823
오류 메시지 255
오버라이딩 276
오버로딩 276
오브젝트 데이터베이스 824
오크 21
오픈 소스 29
우선순위 81, 665
웹 브라우저 45
윈도우 서비스 829
유니코드 66, 427, 520, 844
유니코드 키 519
이미지 그리기 617
이미지 레이블 554
이미지 아이콘 557
이미지 체크박스 562
이벤트 496, 498
이벤트 객체 499, 500
이벤트 기반 프로그래밍 496
이벤트 리스너 496, 499
이벤트 분배 스레드 498, 499
이벤트 소스 498, 499, 506
이벤트 처리 스레드 470
이스케이프 시퀀스 70
이클립스 33, 39, 147, 315
익명 클래스 512, 513
인덱스 128, 132, 133
인스턴스 174, 279
인스턴스 멤버 216
인자 전달 방식 186
인터페이스 284, 291
인터페이스 구현 287
인터페이스 상속 286
일차 키 823
임계 역 676, 678
입력 다이얼로그 725
입력 스트림 416
자동 박싱 339, 370, 379
자동 언박싱 339, 377, 379
자동 타입 변환 73
자바 API 324
자바 가상 기계 22, 25, 48, 50, 648
찾아보기 801
자바 서블릿 46
자바 스레드 648, 649
자바 인터페이스 285
자바 컴파일러 29
자바 키워드 64
자바 표준 배포판 29
자식 클래스 172
자원 이름 789, 791
작업 공간 39
잘 알려진 포트 788
전역 변수 217, 221
전역 함수 221
절차 지향 언어 19, 168
절차 지향 프로그래밍 169
접근 지정자 59, 185, 208, 248
정방형 배열 140
정수 타입 리터럴 69
정적 바인딩 277
제네릭 368, 369
제네릭 메소드 403
제네릭 클래스 399
제네릭 타입 370
제어판 832
제임스 고슬링 20
조건 연산자 91
조건문 93
조건식 93, 115, 119, 121
주석문 61
중량 컴포넌트 454
중첩 반복 123
증감 연산자 89
지역 변수 117
체크박스 컴포넌트 561, 564
초기 툴팁 출력 지연 시간 712
최상위 컨테이너 461
추상 메소드 278, 503
추상 클래스 279, 291
출력 스트림 416
캐스팅 259
캡슐화 50, 170, 221
컨테이너 369, 460, 461
컨텐트팬 463, 467
컬러 다이얼로그 737
컬렉션 368
컴파일 19
컴파일 오류 150, 280
컴파일러 19
컴포넌트 461, 602
코드의 재사용 172
콤보박스 583
콤보박스 컴포넌트 582
클라이언트 801
클라이언트 소켓 801, 802, 809
클래스 37, 59, 171, 174
클래스 멤버 216
클래스 파일 25, 26, 50
클리핑 625
클리핑 역 625
클리핑 역 설정 626
키 369, 389, 823
타이틀 466
타이틀 달기 466
타입 매개 변수 369, 370, 399, 400
타입 변환 73
탭 740
탭팬 740
테이블 823, 832, 834
텍스트 역 컴포넌트 575
텍스트 파일 421
텍스트 파일 복사 444
템플리트 370
토큰 350
툴바 706
툴팁 710, 712
툴팁 시간 제어 712
툴팁 활성화 712
특수문자 리터럴 70
파라미터 766
파일 다이얼로그 730
파일 열기 다이얼로그 730
파일 저장 다이얼로그 730, 734
파일 필터 731
파일의 끝 422
팝업 다이얼로그 725
패키지 32, 51, 308, 309
포커스 518
포트 787, 788
포트 번호 791
표준 설정 829
표준 패키지 325
프레임 464
프로그래밍 언어 19
프로그램 18
프로젝트 41
프로토콜 식별자 789, 790
플랫폼 21
플랫폼 독립성 49
플랫폼 독립적 21
플랫폼 종속성 22
피연산자 81
필드 171
하드웨어 18
해시맵 389
핸들 706
행 138, 823, 834
호스트 이름 791
확인 다이얼로그 726
흐름도 169
Abs(double a) 354
abstract 278, 279
abstract class 279
abstract method 278
accept() 801, 804, 807
Action 이벤트 556, 576, 585, 704
ActionListener 503, 704
actionPerformed() 506
Activity 754
Adapter 515
add() 375, 383, 467, 474, 476, 701
add(E element) 374, 382
add(int index, E element) 374, 382
addActionListener 506, 507
addFocusListener() 507
addItem() 583
addKeyListener() 520
addMouseListener() 507
addTab() 741
AdjustmentEvent 502
AIFF 771
JAVA PROGRAMMING802 찾아보기
alt 속성 758
Android 48
anonymous class 512
append(String str) 348
append(StringBuffer sb) 348
applet 45, 754
appletviewer 32
appletviewer.exe 761
ArithmeticException 153
ArithmeticException 예외 151
array 128
ArrayIndexOutOfBoundsException 153
ArrayList<E> 369, 381
assembly language 19
AU 771
audio clip 771, 774
auto boxing 339, 370, 379
auto unboxing 339, 379
AWT 454
AWT 애플릿 754, 759
AWT 컨테이너 460
AWT 컴포넌트 454
BinarySearch() 396
bitCount(int i) 336
BLOCK 664
Boolean 335
BorderLayout 472, 473, 477, 707
boxing 338
break 124
break 문 100, 124, 125
Buffered I/O 436
Buffered Stream 436
BufferedInputStream 437
BufferedOutputStream 437
BufferedReader 437
BufferedWriter 437
ButtonGroup 568
Byte 335
byte code 23
Calendar 356
Calendar 클래스 356
call-by-value 186
capacity() 348, 374, 377
CardLayout 472, 485
case 문 99, 102
casting 259
catch 152
ceil(double a) 354
ChangeEvent 590
ChangeListener 590
Character 335
charAt() 344
charAt(int index) 342
class 171, 176, 328, 840
class file 25
ClassCastException 153
ClassNotFoundException 840
CLASSPATH 313
classpath 314
classpath 옵션 314
CLASSPATH 환경 변수 313
clear() 374, 382, 384, 390
Clet 754
clipRect 626
clone() 327, 422, 423, 425, 434, 803
CLOSED_OPTION 726
code 속성 757
codebase 속성 758
codePointAt(int index) 342
collection 368, 396
Color 609
column 823
command line argument 146
Comparable 398
compareTo() 343
compareTo(String anotherString) 342
compiler 19
Component 459, 461
ComponentAdapter 516
ComponentEvent 502
concat() 344
concat(String str) 342, 343
connect() 795, 798
Connection 객체 840
constructor 176
Container 460
ContainerAdapter 516
ContainerEvent 502
contains(CharSequence s) 342
contains(Object o) 374, 382
containsKey(Object key) 390
containsValue(Object value) 390
Content Pane 463
continue 124
continue 문 124
cos(double a) 354
countTokens() 352
create 명령 835
critical section 676
Daemon thread 662
Dalvik 48
data type 66
database 822
DataBase Management System 823
DataInputStream 421
DB2 823
DBMS 823, 831
default 212, 249
default constructor 198
default package 322
default 문 100
delete 명령 838, 839
delete 문 847
delete() 441
delete(int start, int end) 348
delimeter 350
destroy() 755, 756, 759, 763
destructor 202
disassemble 23
DNS 787
do-while 문 114, 120
doInput 796
Domain Name Server 787
doOutput 796
Double 335
downcasting 259, 260
drawArc 614
drawImage() 619, 620
drawLine() 612
drawOval() 612
drawPolygon 614
drawRect() 604, 612
찾아보기 803
drawRoundRect() 612
DriverManager 840
dynamic binding 268
Eclipse 33
elementAt() 376, 384
elementAt(int index) 374, 382
embedded system 21
Encapsulation 50, 170
enum 136
EOF 422
equals() 330, 331
equals(Object obj) 327
ERROR_MESSAGE 727
escape sequence 70
Event Dispatch Thread 470, 498, 499
event listener 496, 499
EventObject 500
Exception 150
executeQuery() 842
executeUpdate() 842, 847
exists() 441
exit 469
exp(double a) 354
extends 243, 287
False 71
field 171
File 440, 441
file filter 731
File 클래스 440, 441
FileInputStream 419, 421
FileNameExtensionFilter 731
FileOutputStream 419, 424
FileReader 419, 428
FileWriter 419, 433
fillArc() 615
fillRect() 615
final 72, 225, 226
final 메소드 225
final 클래스 225
final 필드 225
finally 152
Float 335
floatValue() 336
FlowLayout 471, 473, 474, 475
flush() 425, 439, 803, 805, 808, 810
FocusAdapter 516
FocusEvent 502
Font 609
for 문 114, 115
for-each 문 135, 136
forName() 840
FTP 788
Garbage 194, 203, 204
garbage collection 206
garbage collector 203, 206
gc() 206
generic type 370
generics 368, 369
GET 797
get() 356, 376, 384, 389, 390
get(int index) 374, 382
get(Object key) 390
getButton() 501, 531
getClass() 327, 328
getClickCount() 501, 530
getEncoding() 434
getInputStream() 796, 802, 804
getInstance() 356
getKeyChar() 521, 522
getKeyCode() 521, 522
getKeyText() 523
getName() 328, 441
getOutputStream() 802, 804
getParameter() 766
getPath() 441
getPoint() 501, 530
getSelectedIndex() 585
getSelectedItem() 585
getSource() 501, 506
getX() 501, 530
getY() 501, 530
Google 48
GPL 29
Graphics 603, 606, 607
GridLayout 472, 481
GUI 454
GUI 컴포넌트 454
HashCode() 327, 328
HashMap<K, V> 369, 389
HashSet<E> 369
hasMoreTokens() 352
hasNext() 387
heavy weight component 454
height 속성 758
HTTP 788, 790
IBM 823
IDE 33
identifier 63
if 문 93
if-else 문 95
IllegalArgumentException 153
Image 객체 619
ImageIcon 554, 617
implements 287
import 32, 311, 312, 325, 462, 471
index 128
indexOf(Object o) 374, 382
infinite loop 116
Inheritance 172
init() 753, 755, 756, 759, 763
innner class 50
InputStream 793
InputStreamReader 430
insert 명령 836
insert 문 847
instance 174
instanceof 261, 262
int parseInt(String s) 336
int parseInt(String s, int radix) 336
Integer 335
interface 284, 285
interrupt() 668
InterruptedException 669
intValue() 336
IOException 153
IP 786, 787
IP 버전 787
IP 주소 786
ipconfig 787
isDirectory() 441, 442
isEmpty() 374, 382, 390
JAVA PROGRAMMING804 찾아보기
isFile() 441, 442
ISO-8859-1 844, 847
Item 이벤트 564, 570, 585
ItemEvent 502
ItemListener 564
itemStateChanged 564
itemStateChanged() 564, 570
iterator() 387
Iterator<E> 387
JApplet 754, 763
jar 32
java 32, 38
Java Development Kit 324
Java EE 30
Java ME 30, 47
Java Run-time Environment 29
Java SE 29
java servlet 46
java.awt 326
java.io 326
java.lang 325, 327, 335
java.lang.Object 244, 245
java.net 791, 802
java.util 326
java.util.Random 354
javac 32, 38
javadoc 32
javap 32
JButton 556
JCheckBox 561
JColorChooser 737
JComboBox 578, 582
JComponent 459, 461, 548
jdb 32
JDBC 824, 831
JDBC 드라이버 825, 831, 840
JDBC 매니저 825
JDBC 프로그래밍 840
JDialog 714
JDK 23, 31, 324, 831
JDK 1.5 339, 370, 375, 468
JDK 7 102
JFileChooser 730
JFrame 463, 464
JLabel 553
Jlet 754
JList 578
JMenu 700, 701
JMenuBar 700, 701
JMenuItem 700, 701
JOptionPane 725
JPanel 604
JRadioButton 567, 570
JRE 29, 31, 325, 831
JScrollPane 575, 576, 578
JSlider 587
JTabbedPane 740
JTextArea 575
JTextField 573
JToolBar 706
JVM 22, 649
Key 823
Key 이벤트 518
KeyAdapter 516
KeyEvent 502
KeyEvent 객체 521
keyPressed() 519, 520
keyReleased() 519, 520
keySet() 390
keyTyped() 519, 520
KSC5601 431
LastModified() 441
Layout Manager 470
length 134
length 필드 134, 141, 148
length() 342, 441
life cycle 168
light weight component 455
link 26
LinkedList<E> 369, 396
list() 441, 442
listFiles() 441
localhost 787, 809
Long 335
longValue() 336
loop() 772
Machine language 19
main 스레드 469, 666
main() 145, 465, 645
main() 메소드 37, 59, 145, 146, 465
majorTickSpacing 588
MalformedURLException 792
Math 353
Math 클래스 353
max() 396
max(double a, double b) 354
method 171, 177
method overloading 189
method overriding 266
MIDI 771
Midlet 754
min() 396
min(double a, double b) 354
minorTickSpacing 588
mkdir() 441
modal 720
modeless 720
Mouse 이벤트 529
MouseAdapter 515, 516
mouseClicked() 529
mouseDragged() 529
MouseEvent 502
MouseListener 503, 529
MouseMotionAdapter 516
MouseMotionListener 529
mouseMoved(MouseEvent e) 529
mousePressed() 529
mouseReleased() 529
MouseWheelEvent 535
MouseWheelListener 535
MS949 430, 431
multi-processing 646
multiple inheritance 244
multitasking 644
MySQL 823, 826, 831, 832
MySQL Server 828
MySQL 명령행 829
MySQL 서버 829, 830, 832
mysql.exe 834
mysqladmin.exe 833
Name 속성 765
찾아보기 805
nested loop 123
new 130, 178, 196, 202, 204, 663
newAudioClip() 771, 774
next() 79, 387
nextByte() 79
nextDouble() 79
nextFloat() 79
nextInt() 79
nextLine() 79
nextLong() 79
nextShort() 79
nextToken() 352
non-deamon thread 662
non-static 215
notify() 327, 663, 682
notifyAll() 327, 663, 682
NO_OPTION 726
null 376, 383, 391
null 리터럴 71
NullPointerException 153
NumberFormatException 153
NumberFormatException 예외 768
Oak 21
object 174, 327
object database 824
object oriented database 823
Object 클래스 244
openConnection() 795
openStream() 792, 793
Oracle 823
orientation 587
OutOfMemoryException 153
OutputStream 424
overloading 276
overriding 276
Package 32, 309
package-private 212
paint() 755, 759
paint(Graphics g) 628
paintBorder(Graphics g) 628
paintChildren(Graphics g) 628
paintComponent() 602, 755, 763
paintComponent(Graphics g) 628
parseBoolean() 337
parseFloat() 337
parseInt() 337
platform 21
platform dependence 22
platform independent 21
play() 771
Polymorphism 173
port 788
POST 797, 798
primary key 823
private 185, 210, 249
project 41
protected 185, 211, 249
public 59, 176, 185, 210, 249
put() 389, 390
put(K key, V value) 390
Random() 354
read() 422, 423
Reader 419
record 823
relation 823
relational database 823
remove() 377, 384, 387, 391
remove(int index) 374, 382
remove(Object key) 390
remove(Object o) 374, 382
removeAllElements() 374, 377
removeAllItems() 583
removeItem(Object obj) 583
removeItemAt(int index) 583
renameTo(File dest) 441
repaint() 630
replace 342, 348
requestFocus() 519
reserved word 64
ResultSet 844
ResultSet 클래스 842
reverse() 348, 396
rint() 354
rint(double a) 354
RMF 771
round robin 665
round() 354
round(double a) 354
row 823
rt.jar 310, 325
run() 652, 653
Runnable 655
RUNNABLE 663
Runnable 인터페이스 655
Scanner 76, 311
Scanner 클래스 76, 78
select 명령 837
select 문 843
separator 707
ServerSocket 801, 804, 805
ServerSocket 클래스 804
Servlet 46, 754
set() 356, 357
setClip 626
setDefaultCloseOperation 469
setDismissDelay(int mills) 712
setDoOutput() 798
setEditable 575
setEnabled(boolean b) 712
setFileFilter() 732
setFocusable() 519
setFont 575
setHorizontalAlignment 559
setInitialDelay(int mills) 712
setJMenuBar() 701
setLayout() 473, 484
setLength(int newLength) 348
setMajorTickSpacing 589
setMaximum 589
setMinimum 589
setMinorTickSpacing 589
setOrientation 589
setPaintLabels 589
setPaintTicks 589
setPaintTrack 589
setSelected() 564, 570
setSize 464
setText 575
setTitle() 467
setToolTipText(String msg) 710
setValue 589
JAVA PROGRAMMING806 찾아보기
setVerticalAlignment 560
setVisible 464
Short 335
shortValue() 336
showConfirmDialog() 726
showDialog() 737, 738
showInputDialog() 725
showMessageDialog() 727
showOpenDialog() 732, 733
showSaveDialog() 734
sin(double a) 354
size() 374, 377, 382, 390, 391
sleep() 653
Socket 800, 801, 802, 803, 804
sort() 396
specialization 399
split() 350
split(String regex) 342
SQL 824
SQL Server 823
sqrt(double a) 354
Stack<E> 369
Standard Configuration 829
start() 652, 653, 753, 755, 759, 763
stateChanged 590
Statement 클래스 842
static 215
static 메소드 222
static 멤버 216
stop() 755, 756, 759, 763, 772
Stream 417
String 340
String toBinaryString(int i) 336
String toHexString(int i) 336
String toOctalString(int i) 336
String toString(int i) 336
String value = dic.get(key); 393
String 클래스 67, 71, 340
StringBuffer 347
StringBuffer 클래스 347
StringTokenizer 350
StringTokenizer 클래스 350
Structured Query Language 824
sub class 172, 241
subString(int beginIndex) 343
super 274
super class 172, 241
super() 256, 257
super.paintComponent() 604
Swing 454
Swing 컴포넌트 454
switch 문 99
synchronized 678
System.exit(0) 153
System.gc() 206
System.in 76
Tab 740
tan(double a) 354
TCP 786, 800
TCP 프로토콜 786
Telnet 788
template 370
TERMINATED 664
TextEvent 502
this 191, 192, 193, 222
this() 200, 202
thread 644, 645
Thread Control Block 662
Thread Synchronization 676
Thread 클래스 651
TIMED_WAITING 663
toArray() 374, 382
token 350
toLowerCase() 343
ToolTipManager 712
Top Level Container 461
toString() 327, 329
toUpperCase() 343
track 588
trim() 343, 344
true 71
try 152
try-catch-finally 문 151
Unboxing 338
Unicode 66, 520
upcasting 259
update 명령 838
update 문 847
URL 789, 791, 797, 800
URL 클래스 791
URLConnection 795, 796, 797, 800
URLConnection 클래스 795
US-ASCII 431
Value 823
value 속성 765
Vector<E> 369, 373
Virtual Key 521
Wait() 327, 663, 682
WAITING 663
WAV 771
where 절 843
while 문 114, 118
width 속성 758
WindowAdapter 516
WindowEvent 502
windows service 829
WORA 22
workspace 39
Wrapper 335
Wrapper 클래스 335, 370, 379
Write Once Run Anywhere 22
write(int b) 425
write(int c) 434
Writer 419
YES_NO_OPTION 726
YES_OPTION 726
yield() 665
<applet> 태그 757, 765
<Enter> 키 518, 573
<param> 태그 765, 766
<Tab> 키 519
2차원 배열 138
찾아보기 807
명품 JAVA Programming
황기태∙김효수 지음
초 판 발 행 : 2011. 7. 11.
개 정 판 : 2013. 2. 7.
발 행 인 : 김 승 기
발 행 처 : 생능출판사
신 고 번 호 : 제406-2005-000002호
신 고 일 자 : 2005. 1. 21
I S B N : 978-89-7050-764-4(93000)
� � � ─���
경기도 파주시 문발동 507-12 파주출판도시표전화 : (031)955-0761, FAX : (031)955-0768
홈페이지 : http://www.booksr.co.kr
�파본및잘못된책은바꾸어드립니다. 정가 29,000원�이책을불법복사할경우저작권법에의해
5년이하의징역이나5,000만원이하의벌금에처해질수있습니다.
황기태
현 한성 학교 컴퓨터공학과 교수
서울 학교 컴퓨터공학과 박사
서울 학교 컴퓨터공학과 석사
서울 학교 컴퓨터공학과 학사
비트교육센타 센타장
IBM Watson Research Center 방문 연구원
University of California, Irvine 방문 교수
University of Florida 방문 교수
김효수
현 터치타이프 모바일 지사장/한성 학교 컴퓨터공학과 겸임 교수
서울 학교 컴퓨터공학과 석사
서울 학교 컴퓨터공학과 학사
LG전자 선임 연구원
한국 Rational Software, 한국 Openwave Systems 근무
M-Systems 지사장
IKIVO 지사장
저 자 약 력
저자와의 협의에 의해인지를 생략합니다.
<개정판>