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. 아직은 독자 여러분을 험한 세상으로 바로 보낼 수가 없네요. 몇 가지 내용을 더 알려드려야겠습니다. 하지만 이번엔 정말 끝입니다.