길벗·이지톡

도서 IT 전문서 프로그래밍/오픈소스

모던 자바를 빠르게 공략한다

 

모던 자바의 주요 개념을 확실하게 이해한다

현대 프로그래밍 언어의 트렌드를 반영하면서 자바에는 타입 추론, 함수형, 옵셔널, 널 안전 스트림, 디폴트 메서드, 중첩 기반 접근 제어, 퓨처, 개선된 동시성 기능 등이 추가되었다. 300개 이상의 응용프로그램과 1,000개 이상의 예제를 통해 주요 개념을 확실하게 이해하자.

 

빠르게 발전한 자바 문법과 라이브러리를 익힌다

자바 언어가 빠르게 발전하면서 자바 문법과 라이브러리에 많은 변화가 생겼다. 이러한 변화는 개발 환경의 변화와 그에 따른 개발자들의 요구를 수용하기 위한 것이었지만, 학습 곡선을 빠르게 높였다. 즉, 학습하기 어려워졌다. 이러한 변화는 자바 입문서로는 제대로 배우기 어렵다. 문법 이후 막막한 학생, 빠르게 발전한 자바의 발전을 따라 잡고 싶은 개발자에게 필요한 내용을 담았다.

 

실무에서 만나는 문제를 해결하면서 레벨업한다

실무에서 공통으로 접하게 되는 분야를 문제로 출제했다. 문자열, 숫자, 배열, 컬렉션, 데이터 구조, 날짜와 시간, 불변성, 타입 추론, 옵셔널, 자바 I/O, 비동기 처리, 동시성, 자바 리플렉션, 람다, 스트림, 컬렉터, 함수형 프로그래밍, 디자인 패턴, HTTP Client API 등에 대한 문제를 수록했다. 문제마다 구글 검색으로 해결하려 한다면 코딩 속도가 너무 느리다. <자바 코딩 문제집>으로 많은 문제를 접하고 해법을 익혀두자. 이미 접해본 문제와 해법이 많을수록 문제 해결력이 생기고 코딩 속도도 빨라진다.

 

[이 책의 내용]

  • 코드에 최신 자바 11, 12를 적용하는 법
  • 컬렉션과 데이터 구조와 관련된 문제 해결
  • 람다를 사용한 함수형 프로그래밍 스타일
  • 비동기 통신과 병렬 데이터 처리
  • 최신 자바 API로 문자열과 숫자 문제 처리하기
  • 다양한 객체 불변성을 이해하기
  • 올바른 구현과 클린 코드 기법

[관련도서]

자바로 배우는 리팩토링 입문

자바 코딩의 기술

자바와 JUnit을 활용한 실용주의 단위 테스트

 

[역자 서문]

프로그래밍 언어는 문법을 익힌 다음 실전에 쓰일 만한 코드를 작성해봐야 실력을 키울 수 있습니다. 실전 코드를 작성해보면서 깊이 있는 내용을 배워야 합니다. <코딩 개념 잡는 자바 코딩 문제집>은 최신 자바 기능을 활용해 실전 문제 269개를 풀어보면서 자바 코딩 실력을 한층 높일 기회를 제공합니다. 데이터 처리와 입출력을 비롯해 객체 불변성, 리플렉션, 함수형 프로그래밍, 동시성, 옵셔널 같은 고급 기능까지 한 권에 모두 아우릅니다. 더불어 자칫 수박 겉핥기가 되지 않도록 실용적인 예제 코드로 간결하게 설명합니다.

이 책은 크게는 개념 단위로, 작게는 문제 단위로 자바를 소개합니다. 1995년에 공개된 자바는 오늘날엔 아주 복잡한 기능을 갖춘 자바 생태계로 진화했습니다. 이 방대한 자바 생태계를 이 책은 13개의 장으로 나눈 후, 한눈에 파악하기 쉽도록 매 장의 첫 번째 절에서 어떤 문제를 다룰지 요약해 놓았습니다. 자바 개발자에게 실질적으로 유용한 개념과 API들이 마치 백과사전처럼 예제와 함께 주제별로 수록하여 업무상 필요하거나 실력을 늘리고 싶은 부분만 추려서 찾아보기 좋습니다.

문제가 매우 많은데다 자바가 제공하는 기능을 폭넓게 소개하므로 꼭 끝까지 차례대로 읽겠다는 무거운 다짐은 내려놓으세요. 구성이 독립적이니 리프레시가 필요할 때 한두 장씩 훑어보아도 좋습니다. 문제 하나하나는 결코 이해하기 어렵지 않습니다. 아주 쉽게 핵심만 강조하여 설명하고 이를 활용할 수 있도록 안내합니다.

이 책은 문제뿐 아니라 그 해법 또한 다양하게 제시합니다. 자바 버전별로 다르게 문제를 해결하기도 하고 함수형 해법도 적용해봅니다. 익숙한 API가 뜻밖의 방식으로 쓰이고, 아주 생소한 API가 등장하기도 합니다. 바꿔 말해 이미 해결법을 아는 문제라도 새로운 기능으로 더 간결하게 해결하는 법을 배울 수 있습니다. 중급 이상의 개발자라면 문제의 해법을 읽기 전에 스스로 코드를 작성해보세요. 최신 API 문서도 살펴보고 오류도 해결해보세요. 더 나은 해법을 모색하고 다른 개발자의 코드와 비교해 나가는 과정도 코딩의 일부입니다.

<코딩 개념 잡는 자바 코딩 문제집>은 단순히 문제를 나열하는 데 그치지 않고 어떤 문제가 주어지든 올바른 해법을 고안할 수 있도록, 혹은 최소한 그 시작점을 찾아낼 수 있도록 돕습니다. 같은 형식으로 반복되는 문제를 통해 독자는 단련될 수 있습니다. 효과를 극대화하려면 예제를 직접 실습하여 자신의 것으로 만드세요. 간결하면서도 명확한 설명으로 독자가 지치지 않게끔 배려하는 저자의 정성을 문득문득 느낄 수 있을 것입니다.

_심지현

 

 

[저자 서문]

JDK가 버전 8부터 12까지 빠른 속도로 진화함에 따라 현대 자바의 학습 곡선이 점차 올라가면서 개발자가 생산성의 안정 단계에 접어들기 위한 시간도 늘어나고 있다. JDK의 새로운 기능과 개념을 활용하면 최근의 다양한 문제를 해결할 수 있다. 이 책은 복잡도와 성능, 가독성 관점에서 올바른 관례와 결정을 설명함으로써 일반적인 문제에 객관적으로 접근하게 해준다.

<코딩 개념 잡는 자바 코딩 문제집>은 기한 안에 주어진 업무를 마치도록 돕는다. 이 책에 나오는 300개 이상의 애플리케이션은 문자열, 수, 배열, 컬렉션, 데이터 구조, 날짜와 시간, 불변성, 타입 추론, Optional, 자바 I/O, 자바 리플렉션, 함수형 프로그래밍, 동시성, HTTP 클라이언트 API 같은 일반적이고 기초적인 관심 분야를 다루는 1,000개 이상의 예제를 포함하므로 활용도가 높다. 일상 업무에서 사용할 핵심 지식을 강조하고 다뤄 보기 위해 정교하게 만든 문제들이니 온갖 능력을 발휘해 배워보자. 다시 말해 (맡은 업무가 쉽든 평범하든 복잡하든) 이러한 지식을 미리 갖추는 것은 선택이 아니라 필수다.

이 책을 다 읽을 무렵에는 자바 개념을 깊이 이해하게 되고, 자신있게 문제에 맞는 올바른 해법을 고안하고 선택할 수 있을 것이다.

 

이 책의 독자층

<코딩 개념 잡는 자바 코딩 문제집>은 자바 초보 개발자나 중급 개발자에게 가장 알맞다. 하지만 이 책의 모든 문제는 어떤 자바 개발자든 일상적으로 마주할 문제들이다.

기술적 배경 지식은 얕아도 좋다. 다만 자바의 팬이어야 하고 자바 코드를 이해하는 뛰어난 능력과 직관을 갖추고 있어야 한다.


 

목차

1장 문자열과 수, 수학

__1.1 문제

__1.2 해법

____001 문자 개수 세기

____002 반복되지 않는 첫 번째 문자 찾기

____003 글자와 단어 뒤집기

____004 숫자만 포함하는 문자열인지 검사

____005 모음과 자음 세기

____006 문자 빈도수 세기

____007 문자열을 int, long, float, double로 변환

____008 문자열에서 여백 제거

____009 구분자로 여러 문자열 합치기

____010 모든 순열 생성

____011 문자열 회문 검사

____012 중복 문자 제거

____013 주어진 문자 제거

____014 빈도수가 가장 높은 문자 찾기

____015 문자열 배열을 길이 순으로 정렬

____016 문자열이 부분 문자열을 포함하는지 검사

____017 문자열 내 부분 문자열 빈도수 세기

____018 두 문자열이 애너그램인지 검사

____019 여러 줄 문자열(텍스트 블록) 선언

____020 같은 문자열 n번 이어 붙이기

____021 문자열 앞과 뒤 공백 제거

____022 가장 긴 공통 접두사 찾기

____023 들여쓰기 적용

____024 문자열 변환

____025 두 수의 최솟값과 최댓값 계산

____026 두 큰 int/long 수의 합과 연산 오버플로

____027 기수를 지정해 문자열을 부호 없는 수로 변환

____028 부호 없는 수로 변환

____029 부호 없는 두 수 비교

____030 부호 없는 값의 나눗셈과 나머지

____031 double/float가 유한 부동소수점 값인지 검사

____032 두 불 표현식에 논리 AND/OR/XOR 적용

____033 BigInteger를 원시 타입으로 변환

____034 long을 int로 변환

____035 나눗셈과 나머지의 버림 계산

____036 다음 부동소수점 값

____037 두 큰 int/long 수의 곱과 연산 오버플로

____038 단일 곱셈 누산기(Fused Multiply Add)

____039 컴팩트 수 포매팅

__1.3 요약

 

2장 객체와 불변성, switch 문

__2.1 문제

__2.2 해법

____040 함수형 스타일과 절차적 코드에서 %00; 참조 검사

____041 %00; 참조 검사와 맞춤형 %00;PointerException 던지기

____042 %00; 참조 검사와 명시된 예외(가령 IllegalArgumentException) 던지기

____043 %00; 참조 검사와 %00;이 아닌 기본 참조 반환

____044 인덱스가 0부터 길이까지 범위에 속하는지 검사

____045 부분 범위가 0부터 길이까지 범위에 속하는지 검사

____046 equals( )와 hashCode( )

____047 불변 객체 개요

____048 불변 문자열

____049 불변 클래스 작성

____050 불변 클래스로 가변 객체 전달

____051 빌더 패턴으로 불변 클래스 작성

____052 불변 객체 내 잘못된 데이터 유입 방지

____053 객체 복제

____054 toString( ) 오버라이딩

____055 switch 표현식

____056 다수의 case 레이블

____057 명령문 블록

__2.3 요약

 

3장 날짜와 시간 다루기

__3.1 문제

__3.2 해법

____058 문자열을 날짜와 시간으로 변환

____059 날짜와 시간 포매팅

____060 시간/날짜 없이 현재 날짜/시간 구하기

____061 LocalDate와 LocalTime으로 LocalDateTime 생성

____062 Instant 클래스로 기계 시간 구하기

____063 날짜 기반 값을 사용한 기간(period)과 시간 기반 값을 사용한 기간(duration) 정의

____064 날짜와 시간 단위 구하기

____065 날짜와 시간 더하기와 빼기

____066 UTC와 GMT로 모든 표준 시간대 구하기

____067 모든 표준 시간대로 로컬 날짜와 시간 구하기

____068 항공편 날짜와 시간 표시

____069 유닉스 타임스탬프를 날짜와 시간으로 변환

____070 어떤 달의 첫째 날과 마지막 날 찾기

____071 존 오프셋 정의/추출

____072 Date와 Temporal 간 변환

____073 날짜 범위 순회

____074 나이 계산

____075 어떤 날의 시작과 끝 시간

____076 두 날짜 간 차이

____077 체스 시계 구현

__3.3 요약

 

4장 타입 추론

__4.1 문제

__4.2 해법

____078 간단한 var 예제

____079 원시 타입에 var 사용하기

____080 var와 자동 형 변환으로 코드 유지 보수성 지속

____081 명시적 다운캐스트, 사실 var를 쓰지 않는 편이 낫다

____082 눈으로 봤을 때 호출하는 이름에 타입 정보가 부족하면 var를 쓰지 말자

____083 LVTI와 인터페이스 기반 프로그래밍 기법

____084 LVTI와 다이아몬드 연산자

____085 배열을 var에 할당

____086 LVTI로 복합 선언

____087 LVTI와 변수 범위

____088 LVTI와 삼항 연산자

____089 LVTI와 for 루프

____090 LVTI와 스트림

____091 LVTI로 연쇄적인 중첩/긴 표현식 나누기

____092 LVTI와 메서드 리턴과 인자 타입

____093 LVTI와 익명 클래스

____094 LVTI는 final과 effectively final에 사용할 수 있다

____095 LVTI와 람다

____096 LVTI와 %00; 초기자, 인스턴스 변수, catch 블록 변수

____097 LVTI와 제네릭 타입 T

____098 LVTI와 와일드카드, 공변성, 반변성

__4.3 요약

 

5장 배열, 컬렉션, 그리고 데이터 구조

__5.1 문제

__5.2 해법

____099 배열 정렬

____100 배열 내 원소 찾기

____101 두 배열의 동등 혹은 불일치 검사

____102 사전 순으로 두 배열 비교

____103 배열로 스트림 생성

____104 배열의 최솟값과 최댓값, 평균

____105 배열 뒤집기

____106 배열 채우기와 할당

____107 NGE(Next Greater Element)

____108 배열 크기 변경

____109 수정 불가/불변 컬렉션 생성

____110 기본값 매핑

____111 맵의 존재/부재 계산

____112 맵에서 삭제

____113 맵 항목 치환

____114 두 맵 비교

____115 맵 정렬

____116 해시맵 복사

____117 두 맵 병합

____118 프레디케이트와 일치하는 컬렉션 내 모든 원소 삭제

____119 컬렉션을 배열로 변환

____120 리스트로 컬렉션 필터링

____121 리스트 원소 치환

____122 스레드 안전 컬렉션, 스택, 큐

____123 너비 우선 탐색

____124 트라이

____125 튜플

____126 유니온 파인드

____127 펜윅 트리 또는 이진 인덱스 트리

____128 블룸 필터

__5.3 요약

 

6장 자바 입출력 경로, 파일, 버퍼, 스캐닝, 포매팅

__6.1 문제

__6.2 해법

____129 파일 경로 생성

____130 파일 경로 변환

____131 파일 경로 결합

____132 두 위치 간 경로 생성

____133 파일 경로 비교

____134 경로 탐색

____135 경로 감시

____136 파일 내용 스트리밍

____137 파일 트리에서 파일과 폴더 검색

____138 효율적으로 텍스트 파일 읽고 쓰기

____139 효율적으로 이진 파일 읽고 쓰기

____140 대용량 파일 검색

____141 JSON/CSV 파일 객체로 읽기

____142 임시 폴더와 파일 다루기

____143 파일 필터링

____144 두 파일 간 불일치 찾기

____145 순환 바이트 버퍼

____146 파일 토큰화

____147 출력을 포매팅해서 파일에 작성하기

____148 Scanner 다루기

__6.3 요약

 

7장 자바 리플렉션 클래스, 인터페이스, 생성자, 메서드, 필드

__7.1 문제

__7.2 해법

____149 패키지 검사

____150 클래스 검사

____151 리플렉션 생성자로 인스턴스 생성

____152 리시버 타입의 애너테이션 알아내기

____153 합성과 브릿지 구조체 알아내기

____154 다양한 수의 인수 검사

____155 디폴트 메서드 검사

____156 리플렉션으로 중첩 기반 접근 제어

____157 게터와 세터 리플렉션

____158 애너테이션 리플렉션

____159 인스턴스 메서드 호출

____160 static 메서드 알아내기

____161 메서드, 필드, 예외의 제네릭 타입 알아내기

____162 퍼블릭과 프라이빗 필드 알아내기

____163 배열 처리

____164 모듈 검사

____165 동적 프록시

__7.3 요약

 

8장 함수형 스타일 프로그래밍의 기초와 디자인 패턴

__8.1 문제

__8.2 해법

____166 함수형 인터페이스 작성하기

____167 람다 요약

____168 실행 어라운드 패턴 구현

____169 팩터리 패턴 구현

____170 전략 패턴 구현

____171 템플릿 메서드 패턴 구현

____172 옵저버 패턴 구현

____173 론 패턴 구현

____174 데코레이터 패턴 구현

____175 캐스케이드 빌더 패턴 구현

____176 커맨드 패턴 구현

__8.3 요약

 

9장 함수형 스타일 프로그래밍 더 깊이 파고들기

__9.1 문제

__9.2 해법

____177 고차 함수 테스트

____178 람다를 사용하는 메서드 테스트

____179 람다 디버깅

____180 스트림에서 0이 아닌 원소 필터링

____181 무한 스트림, takeWhile( ), dropWhile( )

____182 스트림 매핑

____183 스트림에서 원소 찾기

____184 스트림에서 같은 원소 찾기

____185 스트림의 합, 최대, 최소

____186 스트림 결과 모으기

____187 스트림 결과 조인

____188 컬렉터 요약

____189 그루핑

____190 파티셔닝

____191 컬렉터 필터링, 플래트닝, 매핑

____192 병합

____193 맞춤형 컬렉터 작성

____194 메서드 참조

____195 스트림 병렬 처리

____196 널 안전 스트림

____197 함수, 프레디케이트, 비교자 구성

____198 디폴트 메서드

__9.3 요약

 

10장 동시성 - 스레드 풀, 콜러블, 싱크로나이저

__10.1 문제

__10.2 해법

____199 스레드 생명 주기 상태

____200 객체 레벨 잠금 대 클래스 레벨 잠금

____201 자바 스레드 풀

____202 단일 스레드 풀

____203 고정된 수의 스레드 풀

____204 캐시와 스케줄 스레드 풀

____205 작업 가로채기 스레드 풀

____206 Callable과 Future

____207 다수의 Callable 작업 호출

____208 래치

____209 배리어

____210 익스체인저

____211 세마포어

____212 페이저

__10.3 요약

 

11장 동시성 더 깊이 파고들기

__11.1 문제

__11.2 해법

____213 인터럽터블 메서드

____214 포크/조인 프레임워크

____215 포크/조인 프레임워크와 compareAndSetForkJoinTaskTag( )

____216 CompletableFuture

____217 다수의 CompletableFuture 객체 조합

____218 바쁜 대기 최적화

____219 작업 취소

____220 ThreadLocal

____221 원자 변수

____222 ReentrantLock

____223 ReentrantReadWriteLock

____224 StampedLock

____225 데드락(식사하는 철학자)

__11.3 요약

 

12장 옵셔널

__12.1 문제

__12.2 해법

____226 Optional 초기화

____227 Optional.get( )과 누락 값

____228 미리 정해둔 기본값 반환

____229 존재하지 않는 기본값 반환

____230 NoSuchElementException 던지기

____231 Optional과 %00; 참조

____232 값이 존재하는 Optional 클래스 소비

____233 값이 존재하는 Optional 클래스 혹은 다른 클래스 반환

____234 orElseFoo( )로 람다 연결

____235 값을 구하기 위한 Optional 사용 금지

____236 필드에 Optional 사용 금지

____237 생성자 인수에 Optional 사용 금지

____238 세터 인수에 Optional 사용 금지

____239 메서드 인수에 Optional 사용 금지

____240 비어 있거나 널인 컬렉션 또는 배열 반환에 Optional 사용 금지

____241 컬렉션에 Optional 쓰지 않기

____242 of( )와 of%00;able( ) 혼동

____243 Optional 대 OptionalInt

____244 Optional 클래스 동등 어서션

____245 map( )과 flatMap( )으로 값 변형

____246 Optional.filter( )로 값 필터링

____247 Optional과 스트림 API 연결

____248 Optional과 식별에 민감한 연산

____249 Optional이 비었으면 boolean 반환

__12.3 요약

 

13장 HTTP 클라이언트와 WebSocket API

__13.1 문제

__13.2 해법

____250 HTTP/2

____251 비동기 GET 요청 트리거

____252 프록시 설정

____253 헤더 설정/가져오기

____254 HTTP 메서드 명시

____255 요청 본문 설정

____256 연결 인증 설정

____257 타임아웃 설정

____258 리다이렉트 정책 설정

____259 동기와 비동기 요청 전송

____260 쿠키 처리

____261 응답 정보 가져오기

____262 응답 본문 타입 처리

____263 JSON 가져오기와 업데이트, 저장

____264 압축

____265 폼 데이터 처리

____266 자원 다운로드

____267 다중 업로드

____268 HTTP/2 서버 푸시

____269 WebSocket

__13.3 요약

 

 

더보기접기

저자

ㆍ지은이 앵겔 레너드

지은이 소개
앵겔 레너드(Anghel Leonard)는 자바 생태계에서 20년 넘게 경력을 쌓은 수석 기술 전략가이다. 강력한 아키텍처와 클린 코드, 고성능을 갖춘 자바 분산 애플리케이션의 설계와 개발이 주 업무다. 코칭과 멘토링, 기술자 리더십에도 열성적이다. 자바 기술과 관련해 여러 가지 책과 영상, 그리고 다수의 글을 남겼다.

ㆍ옮긴이 심지현

옮긴이 소개
이화여대 컴퓨터공학과를 졸업하고, KAIST 대학원 전산과에서 데이터베이스 전공으로 석사 학위를 취득했다. 데이터베이스 외에 온톨로지(Ontology), 개인화 검색 등을 연구했으며 졸업 후 네이버에서 검색 서버 설계 및 개발 실무 경험을 쌓다가 현재는 검색 연구실에서 검색 모델링과 추천 시스템 관련 연구를 진행 중이다.

연관 프로그램

아래 프로그램은 길벗출판사가 제공하는 것이 아닙니다.
무료로 사용할 수 있는 정보를 안내해 드리니, 지원이 필요하면 해당 프로그렘 제작사로 문의해 주세요.