이미 소장하고 있다면 판매해 보세요.
|
1장. 껍질을 깨고
자바는 어떤 식으로 돌아갈까? 자바 코드의 구조 클래스를 해부합시다 main() 메소드 순환문 조건에 따른 분기문 '맥주 99병' 애플리케이션 코드 자동 구문 생성기 집중 토론: 컴파일러와 자바 가상 머신 연습문제와 퍼즐 2장. 객체 마을로의 여행 의자 전쟁(객체지향맨 브래드와 프로시저맨 래리) 상속(기초) 메소드를 오버라이드하는 방법(기초) 클래스 안에는 뭐가 있을까?(메소드, 인스턴스 변수) 첫번째 객체를 만들어봅시다 main()을 사용하는 방법 게임 코드 알아 맞추기 연습문제와 퍼즐 3장. 네 변수를 알라 변수 선언(자바에서는 유형을 까다롭게 따집니다) 원시 변수 유형 자바 키워드 레퍼런스 변수(객체에 대한 리모컨) 객체 선언과 대입 가비지 컬렉션 기능이 있는 힙에서의 객체 배열 연습문제와 퍼즐 4장. 객체의 행동 메소드와 객체의 상태 메소드 인자와 리턴 유형 값으로 전달 게터와 세터 캡슐화 배열에서 레퍼런스를 사용하는 방법 연습문제와 퍼즐 5장. 메소드를 더 강력하게 닷컴 가라앉히기 게임 만들기 간단한 닷컴 게임 준비 코드를 만들어봅시다(게임을 만들기 위한 유사코드) 간단한 닷컴 게임을 만들기 위한 테스트 코드 간단한 닷컴 게임 코드 작성 간단한 닷컴 게임 최종 코드 Math.random()으로 난수를 만들어내는 방법 명령행에서 사용자가 입력한 내용을 받아오기 위한 인스턴트 코드 for 순환문을 써서 순환시키는 방법 원시값을 더 큰 변수에서 작은 변수로 캐스팅하는 방법 Integer.parseInt()를 가지고 String을 int로 변환하는 방법 연습문제와 퍼즐 6장. 자바 라이브러리 간단한 닷컴 게임 버그 분석 ArrayList(자바 API를 활용하는 방법) 닷컴 클래스 코드 고치기 진짜 게임 만들기(닷컴 가라앉히기) 진짜 게임을 만들기 위한 준비 코드 진짜 게임을 만들기 위한 코드 부울 표현식 라이브러리(자바 API) 활용 패키지 사용 방법(import 선언문, 전체 이름) HTML API 문서와 레퍼런스 서적을 활용하는 방법 연습문제와 퍼즐 7장. 객체마을에서의 더 나은 삶 상속의 이해(수퍼클래스와 하위클래스 사이의 관계) 상속 트리 설계(Animal 시뮬레이션) 중복된 코드를 피하는 방법(상속 활용 방법) 메소드 오버라이딩 "A는 B다" 관계와 "A에는 B가 있다" 관계(욕조 안의 아가씨) 수퍼클래스로부터 상속받는 것 상속 활용의 장점 다형성(하위클래스 객체에 대해 수퍼유형 레퍼런스를 사용하는 방법) 오버라이딩 규칙(인자와 리턴 유형은 건드리지 맙시다) 메소드 오버로딩(메소드명을 재활용하는 것뿐입니다) 연습문제와 퍼즐 8장. 심각한 다형성 인스턴스를 만들 수 없는 클래스 추상 클래스(인스턴스를 만들 수 없습니다) 추상 메소드(반드시 구현해야 합니다) 다형성을 실제로 활용하는 방법 Object 클래스(모든 클래스의 수퍼클래스) ArrayList에서 객체를 꺼내는 방법(기본적으로 모두 Object 유형입니다) 컴파일러에서 레퍼런스 유형을 체크하는 방법 내부 객체 다형적 레퍼런스 객체 레퍼런스 캐스팅(상속 트리에서 아래로 내려가는 방법) 죽음의 다이아몬드(다중 상속에서 생길 수 있는 문제) 인터페이스 사용 방법 연습문제와 퍼즐 9장. 객체의 삶과 죽음 스택과 힙, 객체와 변수가 살아가는 곳 스택에 들어있는 메소드 지역 변수가 있는 위치 인스턴스 변수가 있는 위치 객체 생성 생성자(new를 실행하면 실행되는 코드) 새로운 Duck 객체의 상태를 초기화하는 방법 오버로드된 생성자 수퍼클래스 생성자 this()를 써서 오버로드된 생성자를 호출하는 방법 객체의 삶 가비지 컬렉션 연습문제와 퍼즐 10장. 숫자는 정말 중요합니다 Math 클래스 정적 메소드 정적 변수 상수(static final 변수) Math 메소드(random(), round(), abs() 등) 래퍼 클래스(Integer, Boolean, Character 등) 오토박싱 숫자 포매팅 날짜 포매팅 및 조작 import static 구문 연습문제와 퍼즐 11장. 위험한 행동 음악 프로그램 만들기(비트박스) 위험한 코드를 호출해야 한다면 어떻게 해야 할까요? 예외를 통해 "뭔가 안 좋은 일이 생겼음"을 알 수 있습니다 컴파일러에서 위험 요소를 파악하고 있는지 확인해줍니다 try/catch를 써서 예외를 잡아내는 방법 try/catch 블록에서의 흐름 제어 finally 블록 여러 가지 예외를 잡아내는 방법 예외 선언 처리 또는 선언 규칙 코드 키친(소리를 만드는 방법) 연습문제와 퍼즐 12장. 그래픽 이야기 첫번째 GUI 사용자 이벤트 리스너 인터페이스 구현 방법 버튼의 ActionEvent를 받는 방법 GUI에 그래픽을 출력하는 방법 paintComponent() Graphics2D 객체 화면에 버튼 두 개 이상을 집어넣는 방법 내부 클래스 애니메이션 코드 키친 연습문제와 퍼즐 13장. 스윙을 알아봅시다 스윙 구성요소 레이아웃 관리자 세 가지 레이아웃 관리자 BorderLayout FlowLayout BoxLayout JTextField JTextArea JCheckBox JList 코드 키친 연습문제와 퍼즐 14장. 객체 저장 객체의 상태를 저장하는 방법 직렬화된 객체를 파일로 저장하는 방법 자바의 입력과 출력 스트림 객체 직렬화 Serializable 인터페이스를 구현하는 방법 transient 변수를 사용하는 방법 객체를 역직렬화하는 방법 텍스트 파일에 쓰는 방법 java.io.File 텍스트 파일로부터 읽어오는 방법 split()을 써서 String을 토큰으로 나누는 방법 코드 키친 연습문제와 퍼즐 15장. 연결하는 방법 채팅 프로그램 개요 연결, 송신, 수신 네트워크 소켓 TCP 포트 Socket으로부터 데이터를 읽는 방법(BufferedReader 사용) Socket으로 데이터를 쓰는 방법(PrintWriter 사용) 오늘의 조언 클라이언트 프로그램 만들기 간단한 서버 만들기 오늘의 조언 서버 코드 채팅 클라이언트 만들기 다중 호출 스택 새로운 스레드를 시작하는 방법 Runnable 인터페이스 새로운 Thread 객체의 세 가지 상태 실행 가능한 상태와 실행 중인 상태 사이의 전환 스레드 스케줄러 스레드를 중지시키는 방법 스레드 두 개를 만들어서 시작하는 방법 병행성 문제 라이언과 모니카의 병행성 문제를 코드로... 락을 거는 방법 모든 객체에는 락이 있습니다 공포의 '갱신 내용 손실' 문제 동기화된 메소드 락을 해제할 수 없는 경우 멀티스레드를 사용한 ChatClient 코드 인스턴트 SimpleChatServer 연습문제와 퍼즐 16장. 자료구조 컬렉션 Collections.sort()를 이용한 ArrayList 정렬 제네릭과 형 안전성 Comparable 인터페이스를 구현하는 항목 정렬법 Comparator를 활용한 정렬법 컬렉션 API - 리스트, 집합, 맵 HashSet을 이용해서 중복을 피하는 법 hashCode() 및 equals() 오버라이딩 HashMap 다형성을 위한 와일드카드 활용 연습문제 및 퍼즐 17장. 코드를 배포합시다 배포 방법 소스 코드와 클래스 파일은 분리합시다 실행 가능한 JAR 파일을 만드는 방법 실행 가능한 JAR를 실행하는 방법 클래스를 패키지에 넣읍시다 패키지와 디렉토리 구조 패키지로 컴파일하고 실행하는 방법 -d 컴파일 옵션 실행가능한 JAR 파일을 만드는 방법(패키지) 웹을 통해 배포하기 위한 자바 웹 스타트(JWS) JWS 애플리케이션을 만들어서 배포하는 방법 연습문제와 퍼즐 18장. 분산 컴퓨팅 자바 원격 메소드 호출(RMI), 자세한 예제 서블릿 엔터프라이즈 자바 빈즈(EJB) 지니 정말 훌륭한 범용 서비스 브라우저를 만드는 방법 끝 부록 A 마지막 비트박스 코드(클라이언트 코드) 마지막 비트박스 코드(서버 코드) 부록 B Top 10 목록 찾아보기 |
|
1장. 껍질을 깨고
자바가 여러분을 새로운 장소로 인도합니다.1.02 버전이 처음 공개된 이후로 자바는 친숙한 문법, 객체지향적인 기능, 메모리 관리, 그리고 무엇보다도 이식성에 대한 약속을 통해서 많은 프로그래머를 유혹했습니다.1장에서는 자바에 대해 간단하게 알아보고 몇 가지 코드를 직접 만들어서 컴파일하고 실행해봅니다. 문법, 순환문, 분기문, 그리고 자바가 왜 훌륭한지에 대해 간략하게 살펴볼 예정입니다. 일단 한 번 뛰어들어보지요. 2장. 객체 마을로의 여행 객체가 있다는 얘기를 들었던 것 같지요? 1장에서는 코드를 전부 main() 메소드에 집어넣었지요. 그 방법은 정확하게 말하자면 객체지향적인 방법은 아닙니다. 이제 절차적인 프로그래밍의 세계는 완전히 제쳐두고 main()을 벗어나서 직접 객체를 만들어보기로 합시다. 자바에서 객체지향적인(OO, Object-Oriented) 개발이 얼마나 재미있는지를 확인할 수 있을 것입니다. 그리고 클래스와 객체의 차이점도 알아보고 객체가 어떻게 여러분의 삶의 질을 향상시켜줄 수 있는지도 배울 수 있습니다. 3장. 네 변수를 알라 변수는 크게 원시 변수와 레퍼런스, 이렇게 두 가지로 나눌 수 있습니다. 살아가는 데는 정수, 문자열, 배열외에도 다양한 것이 필요합니다. Dog라는 인스턴스 변수가 들어있는 PetOwner라는 객체가 필요하다면 어떻게 해야 할까요? 아니면 Engine이라는 인스턴스 변수가 들어있는 Car라는 객체가 필요하다면? 이 장에서는 자바에서의 유형(type)이라는 비밀을 벗겨보고 어떤 것을 변수로 선언(declare)할 수 있는지, 어떤 것을 변수에 넣을 수 있는지, 변수로 무엇을 할 수 있는지 알아볼 것입니다. 그리고 실제 인생과 가비지 컬렉션 기능이 있는 힙의 유사성에 대해서도 알아보겠습니다. 4장. 객체의 행동 상태는 행동에 영향을 끼치고 행동은 상태에 영향을 끼칩니다. 객체에는 각각 인스턴스 변수와 메소드로 표현되는 상태와 행동이 있습니다. 여기에서는 상태와 속성이 어떻게 연관되는지를 알아봅니다. 객체의 속성에서는 객체의 유일한 상태를 사용합니다. 바꿔 말하자면 메소드에서는 인스턴스 변수의 값을 사용합니다. '개의 체중이 7kg을 넘어가면 이상한 소리를 낸다. 그렇지 않으면...'과 같은 식으로 말이죠. 직접 어떤 상태를 바꿔봅시다. 5장. 메소드를 더 강력하게 메소드에 근육을 좀 붙여줍시다. 지금까지는 변수를 가지고 장난 좀 쳐보고 몇 가지 객체와 간단한 코드를 조금 만들어봤습니다. 하지만 연산자나 순환문 같은 더 강력한 도구가 필요합니다. 이런 도구는 난수를 만들 때도 유용합니다. 그리고 String을 int로 바꿀 수 있다면 참 좋겠지요? 그리고 뭔가 실질적인 것을 만들어보면서 프로그램을 밑바닥부터 만드는 방법, 그리고 테스트하는 방법을 알아봅시다. '닷컴 가라앉히기'라는 게임을 한번 직접 만들어보지요. 6장. 자바 라이브러리 자바에는 클래스 수백 개가 내장되어있습니다. 자바 API라고 부르는 자바 라이브러리에서 필요한 것을 찾는 방법만 안다면 굳이 모든 것을 새로 만들지 않아도 됩니다. 여러분은 다른 더 중요한 것을 만들어야 합니다. 코드를 작성할 때도 자신의 애플리케이션에서 사용할 부분만 새로 만들면 됩니다. 핵심 자바 라이브러리는 클래스를 잔뜩 쌓아놓은 것과 마찬가지입니다. 레고 블록을 쌓듯이 필요한 것을 골라서 적당히 조립해서 쓰면 됩니다. 7장. 객체마을에서의 더 나은 삶 프로그램을 계획할 때는 미래를 생각해보세요. 다른 누군가가 쉽게 확장할 수 있는 코드를 만들 수 있다면, 귀찮게 마감 직전에 스펙을 변경하는 짜증나는 상황에 대비해서 유연한 코드를 만들 수 있다면 좋지 않을까요? 다형성을 활용하기 시작하면 더 나은 클래스 설계를 위한 다섯 가지 단계, 다형성을 사용하는 데 도움이 되는 세 가지 트릭, 유연한 코드를 만들기 위한 여덟 가지 방법, 그리고 상속을 배울 수 있는 네 가지 추가 수업을 받을 수 있답니다. 8장. 심각한 다형성 상속은 시작에 불과합니다. 다형성을 제대로 활용하려면 인터페이스가 필요합니다. 이제 간단한 상속을 뛰어넘어 인터페이스 규격을 설계하고 코딩하는 것을 통해서만 얻을 수 있는 융통성과 확장성으로 건너가야 합니다. 인터페이스란 무엇일까요? 인터페이스는 100% 추상 클래스입니다. 추상 클래스란 무엇일까요? 인스턴스를 만들 수 없는 클래스를 추상 클래스라고 합니다. 근데 이런 추상 클래스를 어디에 써먹을 수 있을까요? 8장으로 건너가서 직접 읽어보면 궁금증이 해결될 것입니다. 9장. 객체의 삶과 죽음 객체는 태어나고, 객체는 죽습니다. 객체의 라이프사이클은 여러분이 책임져야 합니다. 언제, 어디서, 그리고 어떻게 객체를 생성할지는 여러분이 결정합니다. 버리는 시기도 여러분이 결정합니다. 가비지 컬렉터(gc, Garbage Collector)는 사용이 끝난 객체의 메모리를 다시 찾아갑니다. 여기서는 객체가 어떻게 만들어지는지, 그런 객체가 어디에서 사는지, 그리고 그런 객체를 효율적으로 보관하거나 버리는 방법을 알아봅니다. 즉 힙, 스택, 영역, 생성자, 수퍼클래스 생성자, 널 레퍼런스 등에 대해 알아볼 것입니다. 10장. 숫자는 정말 중요합니다 계산을 해 봅시다. 자바 API에는 절대값, 반올림한 값, 최대값, 최소값 등을 구하는 메소드가 들어있습니다. 포매팅은 어떻게 해야 할까요? 숫자를 출력할 때 소수점 이하 두 자리까지만 출력한다든가 큰 숫자를 출력할 때 읽기 좋게 중간중간에 쉼표를 추가한다든가 해야 할 수도 있습니다. 종종 날짜를 다양한 방식으로 출력하는 것과 같은 작업을 해야 할 수도 있습니다. String을 숫자로 파싱할 때는 어떻게 해야 할까요? 아니면 숫자를 String으로 바꾸려면 어떻게 해야 할까요? 우선 정적 변수와 정적 메소드에 대해 알아보고 자바에서의 상수인 static final 변수를 알아보는 것부터 시작해봅시다. 11장. 위험한 행동 종종 예상치 못한 일이 일어나곤 합니다. 있는 줄 알았던 파일이 없거나 서버가 다운되는 경우도 흔히 있습니다. 아무리 뛰어난 프로그래머라도 모든 것을 마음대로 제어할 수는 없습니다. 위험한 메소드를 사용할 때는 안 좋은 일이 일어났을 때 그 문제를 처리하기 위한 코드가 있어야 합니다. 하지만 메소드가 위험한지 어떻게 알 수 있을까요? 예외적인 상황을 처리하기 위한 코드는 어디에 넣어야 할까요? 이 장에서는 위험 요소가 있는 JavaSound API를 사용하는 MIDI 음악 재생용 프로그램을 만들어야 하므로 이런 예외적인 상황을 처리하는 방법을 알아보기로 합시다. 12장. 그래픽 이야기 현실을 직시합시다. 평생 서버에서 돌리는 프로그램만 만들고 살 작정이라고 하더라도 언젠가는 GUI가 들어가는 도구를 만들어야 할 때가 닥칠지도 모릅니다. 이 책에서는 두 장에 걸쳐서 GUI에 대해 알아볼 것입니다. 그리고 이벤트 처리 및 내부 클래스와 같은 자바의 또 다른 기능에 대해서도 알아볼 것입니다. 화면에 버튼을 만들고 색을 칠하고 jpeg 이미지를 표시하고 간단한 애니메이션도 만들어봅니다. 13장. 스윙을 알아봅시다 스윙은 쉽습니다. 모든 요소가 어디에 있어야 하는지를 중요하게 여기지 않는다면 그렇습니다. 스윙 코드는 쉬워 보이지만 컴파일한 다음 실행해보면 "어, 이게 아닌데?"하는 생각이 들지도 모릅니다. 이렇게 코딩하기 쉽다는 것은 거꾸로 제어하기가 힘들다는 것을 의미합니다. 하지만 조금만 노력하면 레이아웃 관리자도 자유자재로 제어할 수 있을 것입니다. 이 장에서는 스윙에 대해 알아보고 위젯에 대해 조금 더 자세하게 알아봅니다. 14장. 객체 저장 객체는 납작하게 압축할 수도 있고 빵빵하게 부풀릴 수도 있습니다. 객체에는 상태와 속성이 있습니다. 속성은 클래스에 들어있지만 상태는 각 객체마다 들어갑니다. 프로그램에서 상태를 저장해야 할때, 각 객체를 확인하면서 각 인스턴스 변수의 값을 일일히 기록하는 힘든 방법을 쓸 수도 있습니다. 하지만 매우 편리한 객체지향적인 방법을 사용할 수도 있습니다. 그 객체를 동결건조한 다음(직렬화한 다음) 나중에 필요할 때는 재구성(역직렬화)하면 됩니다. 15장. 연결하는 방법 외부 세계와 연결해봅시다. 별로 어렵지도 않습니다. 저수준 네트워킹과 관련된 자잘한 내용은 java.net 라이브러리에 들어있는 클래스에서 알아서 처리해줍니다. 자바의 가장 큰 장점 가운데 하나는 네트워크를 통해서 데이터를 주고받는 것이 사슬 끝에 조금 다른 연결 스트림이 있다는 것을 제외하면 일반적인 입출력과 전혀 다르지 않다는 점입니다. 이 장에서는 클라이언트 소켓과 서버 소켓을 만들어봅니다. 그리고 이 장이 끝날 무렵이면 완벽하게 작동하는 멀티스레드 기능을 갖춘 채팅 클라이언트를 완성할 것입니다. 오, 게다가 멀티스레딩까지 배우는군요. 16장. 자료구조 자바에서는 정렬도 한 방에 할 수 있습니다. 정렬 알고리즘을 직접 구현하지 않아도 되죠. 데이터를 모으고 조작할 수 있는 도구들이 모두 갖춰져 있으니까요. 자바 컬렉션 프레임워크에는 상황에 맞게 활용할 수 있는 거의 모든 자료구조가 있습니다. 새로운 항목을 추가하기 좋은 리스트가 필요하신가요? 이름만 가지고 뭔가를 찾고 싶으세요? 자동으로 중복된 항목을 빼주는 리스트가 있으면 좋겠다고요? 동료들의 목록을 배신 때린 횟수 순으로 정렬해야 한다고요? 17장. 코드를 배포합시다 이제 코드를 배포할 때가 되었습니다. 지금까지 코드를 만들었고 코드를 테스트했습니다. 그리고 코드를 다시 다듬었습니다. 뭔가 그럴듯한 프로그램을 만들어서 제대로 작동하는 것까지 확인했는데, 이제 어떻게 해야 할까요? 자신이 만든 자바 코드를 조직화하고 패키지로 묶고 배포하는 방법을 알아볼 때가 되었습니다. 실행 가능한 JAR 파일, 자바 웹 스타트, RMI, 서블릿과 같은 것을 포함한 로컬, 세미로컬, 원격 실행 옵션을 살펴봅시다. 생소한 것이 나왔다고 해서 긴장할 필요는 없답니다. 생각보다 쉽게 사용할 수 있으니까요. 18장. 분산 컴퓨팅 멀리 떨어져 있는 것이 반드시 나쁜 것은 아닙니다. 물론, 애플리케이션 전체가 한 장소에서, 같은 힙에서, JVM 하나를 통해서 실행되면 일이 상당히 쉬워지긴 합니다. 하지만 언제나 그럴 수는 없죠. 그리고 항상 그 방법이 좋다고 할 수도 없습니다. 애플리케이션에서 복잡한 계산을 해야 한다면 어떻게 해야 할까요? 애플리케이션에서 안전한 데이터베이스로부터 데이터를 받아야 한다면 어떻게 해야 할까요? 이 장에서는 매우 쉬운 자바의 원격 메소드 호출(RMI, Remote Method Invocation) 사용 방법을 배울 것입니다. 또한 서블릿, 엔터프라이즈 자바 빈즈(EJB), 지니 등에 대해서도 간략하게 알아봅니다. 부록 A 마지막 코드 키친 프로젝트. 클라이언트 서버 구조의 비트박스 코드를 수록했습니다. 모두들 락 스타가 되어봅시다. 부록 B 거의 책에 들어갈 뻔했던 내용 Top 10. 아직은 독자 여러분을 험한 세상으로 바로 보낼 수가 없네요. 몇 가지 내용을 더 알려드려야겠습니다. 하지만 이번엔 정말 끝입니다. |