CHAPTER 2 기본적인 작성법 익히기 17
2.1 자바의 기본적인 표기법 18
2.1.1 문장과 블록 18
2.1.2 주석 19
2.1.3 변수, 타입, 리터럴 19
2.1.4 연산자 20
2.1.5 제어 구문 26
2.2 클래스와 메서드 34
2.2.1 클래스 선언하기 34
2.2.2 메서드 선언하기 34
2.2.3 수식자 36
2.2.4 메서드 오버로딩 38
2.2.5 main 메서드 39
2.2.6 인스턴스 39
2.2.7 this를 사용할 때의 주의점 41
2.2.8 생성자 42
2.3 정보 공유를 위해 알아둘 기능 45
2.3.1 Javadoc 45
2.3.2 애노테이션 46
2.4 명명 규칙 48
2.4.1 클래스와 변수는 카멜 케이스로, 상수는 스네이크 케이스로 한다 48
2.4.2 변수명 뒤에는 ‘_’를 붙이지 않는다 49
2.4.3 변수는 명사, 메서드는 동사로 명명한다 49
2.4.4 ‘불길한 냄새’가 나는 이름에 주의하자 50
CHAPTER 3 타입 공략하기 51
3.1 기본형과 참조형 52
3.1.1 자바는 정적 타입 언어 52
3.1.2 기본형 53
3.1.3 참조형 57
3.1.4 래퍼 클래스 58
3.1.5 오토박싱과 언박싱 62
3.2 클래스 작성하기 64
3.2.1 클래스 정의하기 64
3.2.2 패키지 65
3.2.3 접근 제한자 66
3.2.4 그 외의 자주 이용하는 수식자 68
3.2.5 계승 71
3.2.6 추상 클래스 72
3.2.7 인터페이스 74
3.2.8 익명 클래스 75
3.3 타입 판정과 객체의 등가성 77
3.3.1 instanceof 연산자 77
3.3.2 객체의 등가성 78
3.4 타입에 관련된 문제 예방하기 88
3.4.1 열거형(enum) 88
3.4.2 제네릭스(Generics) 91
CHAPTER 4 배열과 컬렉션 공략하기 97
4.1 배열로 여러 데이터 처리하기 98
4.1.1 배열이란? 98
4.1.2 배열 초기화하기 100
4.1.3 배열의 대입과 취득 102
4.1.4 배열의 사이즈 변경하기 104
4.1.5 Arrays 클래스를 이용하여 배열 조작하기 105
4.1.6 가변 길이 인수로 메서드 정의하기 111
4.2 컬렉션 프레임워크로 여러 데이터 처리하기 113
4.2.1 배열의 한계와 컬렉션의 특징 113
4.2.2 대표적인 컬렉션과 구분 기준 113
4.3 배열과 비슷한 방법으로 여러 요소 처리하기 — List 인터페이스 115
4.3.1 List 인터페이스의 기본 115
4.3.2 List 작성하기 117
4.3.3 List의 대표적인 메서드 118
4.3.4 List 정렬하기 120
4.3.5 List 검색하기 121
4.3.6 List의 반복자 122
4.3.7 List의 세 가지 구현 클래스 이해하기 124
4.3.8 List의 구현 클래스를 어떻게 분류해서 사용할까? 127
4.4 키와 값의 조합으로 값 처리하기 — Map 인터페이스 128
4.4.1 Map 작성하기 129
4.4.2 Map 사용법 130
4.4.3 Map의 세 가지 구현 클래스 이해하기 132
4.4.4 Map의 구현 클래스를 어떻게 분류해서 사용할까? 134
4.5 값의 집합 처리하기 — Set 인터페이스 135
4.5.1 Set 초기화 136
4.5.2 Set 사용법 137
4.5.3 Set의 세 가지 구현 클래스 이해하기 139
4.6 그 외의 인터페이스 142
4.6.1 값 을 추가한 순서와 동일한 순서로 값 취득하기 ― Queue 인터페이스 142
4.6.2 양방향 Queue 사용하기 ― Deque 인터페이스 143
CHAPTER 5 스트림 처리 제대로 사용하기 — 람다식과 Stream API 145
5.1 Stream API를 사용하기 위한 기본 146
5.1.1 Stream API로 컬렉션의 조작은 어떻게 변하는가? 146
5.1.2 람다식 작성법 마스터하기 148
5.1.3 메서드 참조 152
5.2 Stream 작성하기 154
5.2.1 List나 Set으로부터 Stream 작성하기 154
5.2.2 배열로부터 Stream 작성하기 155
5.2.3 Map으로부터 Stream 작성하기 155
5.2.4 숫자 범위로부터 Stream 작성하기 156
5.3 Stream에 대한 ‘중간 작업’ 158
5.3.1 요소를 치환하는 중간 작업 158
5.3.2 요소를 걸러내는 중간 작업 162
5.3.4 요소를 정렬하는 중간 작업 163
5.4 Stream에 대한 ‘종료 작업’ 165
5.4.1 반복 처리를 실시하는 종료 작업 165
5.4.2 결과를 정리해서 추출하는 종료 작업 165
5.4.3 결과를 하나만 추출하는 종료 작업 167
5.4.4 집계 처리를 실시하는 종료 작업 168
5.5 Stream API를 사용하기 위한 포인트 169
5.5.1 왕도는 map, filter, collect 169
5.5.2 n번 반복하는 IntStream 169
5.5.3 List나 Map에 대한 효율적인 처리 실시하기 171
5.6 Stream API를 사용하여 List 초기화하기 174
5.6.1 Stream을 이용해 열거한 값으로 List 작성하기 174
5.6.2 Stream을 이용해 값의 범위로부터 List 작성하기 174
5.6.3 Stream을 이용해 배열 작성하기 175
CHAPTER 6 예외 공략하기 177
6.1 예외의 기본 178
6.1.1 예외의 세 가지 종류 178
6.1.2 예외를 나타내는 세 가지 클래스 179
6.1.3 예외 처리의 세 가지 구문 제대로 사용하기 181
6.2 예외 처리에서 혼란에 빠지지 않기 위한 포인트 187
6.2.1 오류 코드를 return하지 않기 187
6.2.2 예외를 제거하지 않기 188
6.2.3 공포의 throws Exception 감염 192
6.2.4 어느 계층에서 예외를 포착해서 처리해야 하는가? 195
6.2.5 독자적인 예외 작성하기 195
6.2.6 예외의 트렌드 198
CHAPTER 7 문자열 조작 공략하기 203
7.1 문자열 조작의 기본 204
7.1.1 String 클래스의 특징 204
7.1.2 문자열을 결합하는 세 가지 방법 205
7.1.3 문자열 분할하기 208
7.1.4 여러 문자열 결합하기 210
7.1.5 문자열 치환하기 211
7.1.6 문자열 검색하기 211
7.2 정규 표현으로 문자열 유연하게 지정하기 213
7.2.1 문자열이 정규 표현 패턴에 적합한지 체크하기 213
7.2.2 정규 표현을 사용하여 문자열 분할하기 214
7.2.3 정규 표현을 사용하여 문자열 치환하기 215
7.2.4 String 클래스의 메서드로 정규 표현 사용하기 216
7.3 문자열의 포맷과 출력 218
7.3.1 문자열 출력하기 218
7.3.2 MessageFormat에 대해서 219
7.4 문자 코드 변환하기 221
7.4.1 자바는 어떻게 문자 코드를 이용하는가? 221
7.4.2 자바 문자에서 임의의 문자 코드로 변환하기 222
7.4.3 임의의 문자 코드로부터 자바 문자로 변환하기 223
7.4.4 문자 깨짐의 원인과 대책 223
7.4.5 String 클래스의 intern 메서드로 같은 문자열 찾기 225
CHAPTER 8 파일 조작 공략하기 227
8.1 파일 조작의 기본 228
8.1.1 File 클래스로 초기화하기 228
8.1.2 Path 클래스로 초기화하기 230
8.2 파일 읽고 쓰기 234
8.2.1 바이너리 파일 읽어들이기 234
8.2.2 바이너리 파일 기록하기 237
8.2.3 텍스트 파일 읽어들이기 239
8.2.4 텍스트 파일 기록하기 241
8.2.5 Stream API를 사용해서 파일 읽어들이기 242
8.3 파일 조작하기 244
8.3.1 파일 복사하기 244
8.3.2 파일 삭제하기 246
8.3.3 파일 작성하기 247
8.3.4 디렉터리 작성하기 248
8.3.5 임시 파일 작성하기 250
8.4 다양한 파일 취급하기 253
8.4.1 속성 파일 253
8.4.2 CSV 파일 257
8.4.3 XML 파일 257
8.4.4 JSON 파일 272
CHAPTER 9 날짜 처리 공략하기 275
9.1 Date와 Calendar 구분하여 사용하기 276
9.1.1 Date 클래스 이용하기 276
9.1.2 Calendar 클래스 이용하기 277
9.1.3 Date 클래스와 Calendar 클래스의 상호 교환 실시하기 281
9.2 Date and Time API 사용하기 283
9.2.1 Date and Time API의 장점 283
9.2.2 날짜, 시간, 일시를 각각 별도의 클래스로 취급한다 284
9.2.3 연, 월, 일 등을 지정하여 인스턴스를 생성할 수 있다 285
9.2.4 연, 월, 일의 각 필드값을 개별로 취득할 수 있다 288
9.2.5 연, 월, 일을 계산할 수 있다 289
9.3 날짜 클래스와 문자열 상호 교환하기 292
9.3.1 날짜 클래스를 임의의 형식으로 문자열 출력하기 292
9.3.2 문자열로 표현된 날짜를 Date 클래스로 변환하기 293
9.3.3 SimpleDateFormat 클래스는 스레드 세이프가 아니다 294
9.4 Date and Time API로 날짜/시간 클래스와 문자열 상호 교환하기 295
9.4.1 날짜/시간 클래스를 임의의 형식으로 문자열 출력하기 295
9.4.2 문자열로 표현된 날짜를 날짜/시간 클래스로 변환하기 296
9.4.3 DateTimeFormatter 클래스는 스레드 세이프다 296
CHAPTER 10 객체지향 즐기기 299
10.1 기본형과 참조형의 값 전달하기 300
10.1.1 기본형과 참조형의 값 전달 방법 300
10.1.2 조작해도 값이 변하지 않는 불변 객체 클래스 302
10.1.3 조작하면 값이 변경되는 변경 가능 클래스 304
10.1.4 변경 가능한 클래스의 장점과 단점 305
10.2 가시성을 적절히 설정하여 버그가 적은 프로그램 만들기 307
10.2.1 자바가 사용할 수 있는 가시성 307
10.2.2 가시성의 좋은 사례 308
10.3 객체의 라이프 사이클 파악하기 311
10.3.1 세 종류의 라이프 사이클 311
10.3.2 라이프 사이클의 좋은 사례 312
10.4 인터페이스와 추상 클래스를 활용하여 설계하기 316
10.4.1 다형성을 실현하기 위한 메커니즘 316
10.4.2 인터페이스와 추상 클래스 317
10.4.3 인터페이스의 디폴트 구현 322
10.4.4 인터페이스의 static 메서드 323
CHAPTER 11 스레드 세이프 즐기기 329
11.1 멀티 스레드의 기본 330
11.1.1 멀티 스레드란? 330
11.1.2 멀티 스레드의 장점 331
11.1.3 멀티 스레드의 단점 334
11.1.4 동시에 작업하는 경우에 일어나는 문제 335
11.1.5 멀티 스레드 문제에 대응하기 어려운 이유 339
11.2 스레드 세이프 구현하기 340
11.2.1 스레드 세이프란? 340
11.2.2 상태를 유지하지 않게(Stateless) 한다 349
11.2.3 ‘메서드 단위’가 아니라 최소한의 ‘일련의 처리’에 대해 동기화한다 352
CHAPTER 12 디자인 패턴 즐기기 357
12.1 디자인 패턴의 기본 358
12.1.1 디자인 패턴이란? 358
12.1.2 디자인 패턴을 사용하면 좋은 점 359
12.2 생성에 관한 패턴 360
12.2.1 AbstractFactory 패턴 ― 일련의 인스턴스군을 모아서 생성하기 360
12.2.2 Builder 패턴 ― 복합화된 인스턴스의 생성 과정을 은폐한다 364
12.2.3 Singleton 패턴 ― 특정 클래스에 대해 인스턴스가 하나임을 보장한다 367
12.3 구조에 관한 패턴 369
12.3.1 Adapter 패턴 ― 인터페이스에 호환성이 없는 클래스들을 조합시키기 369
12.3.2 Composite 패턴 ― 재귀적 구조 쉽게 처리하기 373
12.4 행동에 관한 패턴 377
12.4.1 Command 패턴 ― ‘명령’을 인스턴스로 취급하여 처리 조합을 쉽게 한다 377
12.4.2 Strategy 패턴 ― 전략을 간단히 전환할 수 있는 구조를 제공한다 380
12.4.3 Iterator 패턴 ― 보유한 인스턴스의 각 요소에 순차적으로 액세스하는 방법을 제공한다 383
12.4.4 Observer 패턴 ― 어떤 인스턴스의 상태가 변화할 때 그 인스턴스 자신이 상태 의 변화를 통지하는 구조를 제공한다 385
CHAPTER 13 주변 도구로 품질 높이기 389
13.1 Maven으로 빌드하기 390
13.1.1 빌드란? 390
13.1.2 Maven의 기본적인 이용 방법 391
13.1.3 Maven에 플러그인 도입하기 396
13.2 Javadoc으로 문서화 주석 작성하기 398
13.2.1 왜 Javadoc 주석을 작성하는가? 398
13.2.2 Javadoc의 기본적인 작성 방법 399
13.2.3 알아두면 편리한 작성 방법 401
13.2.4 API 문서 작성하기 405
13.3 Checkstyle로 포맷 체크하기 406
13.3.1 Checkstyle이란? 406
13.3.2 이클립스에 의한 포맷 체크 407
13.3.3 Maven에 의한 포맷 체크 409
13.4 FindBugs로 버그 체크하기 410
13.4.1 이클립스에 의한 버그 체크 410
13.4.2 Maven에 의한 버그 체크 412
13.5 JUnit으로 테스트하기 413
13.5.1 왜 테스트용 프로그램을 만들어서 테스트할까? 413
13.5.2 테스트 코드 구현하기 414
13.5.3 테스트 실행하기 416
13.6 Jenkins로 품질 보고서 작성하기 418
13.6.1 지속적인 통합과 Jenkins 418
13.6.2 Jenkins 환경 준비하기 418
13.6.3 Jenkins에서 빌드 실행하기 422
13.6.4 Jenkins에서 보고서 생성하기 424
CHAPTER 14 라이브러리로 효율 높이기 429
14.1 재사용 가능한 컴포넌트를 모은 Apache Commons 430
14.1.1 Commons Lang 430
14.1.2 Commons BeanUtils 433
14.1.3 단순 복사와 딥 복사 434
14.2 CSV로 여러 데이터 보관하기 437
14.2.1 CSV란? 437
14.2.2 Super CSV로 CSV 변환을 효율적으로 실시하기 437
14.2.3 CSV 데이터 읽어들이기 438
14.2.4 CSV 데이터 쓰기 439
14.3 JSON으로 구조적인 데이터를 간단하게 하기 441
14.3.1 JSON이란? 441
14.3.2 Jackson으로 JSON 취급하기 441
14.3.3 JSON 데이터 분석하기 442
14.3.4 JSON 데이터 생성하기 443
14.4 Logger로 애플리케이션 로그 보관하기 445
14.4.1 로그와 레벨 445
14.4.2 SLF4J+Logback으로 로깅 실시하기 446
14.4.3 SLF4J+Logback의 기본적인 사용법 447
14.4.4 파일에 출력하기 449
14.4.5 변수 출력하기 450
14.4.6 패키지별로 출력 로그 레벨 변경하기 451
14.4.7 동적으로 설정 변경하기 451
감사의 글 453
찾아보기 455