모던 자바를 빠르게 공략한다
모던 자바의 주요 개념을 확실하게 이해한다
현대 프로그래밍 언어의 트렌드를 반영하면서 자바에는 타입 추론, 함수형, 옵셔널, 널 안전 스트림, 디폴트 메서드, 중첩 기반 접근 제어, 퓨처, 개선된 동시성 기능 등이 추가되었다. 300개 이상의 응용프로그램과 1,000개 이상의 예제를 통해 주요 개념을 확실하게 이해하자.
빠르게 발전한 자바 문법과 라이브러리를 익힌다
자바 언어가 빠르게 발전하면서 자바 문법과 라이브러리에 많은 변화가 생겼다. 이러한 변화는 개발 환경의 변화와 그에 따른 개발자들의 요구를 수용하기 위한 것이었지만, 학습 곡선을 빠르게 높였다. 즉, 학습하기 어려워졌다. 이러한 변화는 자바 입문서로는 제대로 배우기 어렵다. 문법 이후 막막한 학생, 빠르게 발전한 자바의 발전을 따라 잡고 싶은 개발자에게 필요한 내용을 담았다.
실무에서 만나는 문제를 해결하면서 레벨업한다
실무에서 공통으로 접하게 되는 분야를 문제로 출제했다. 문자열, 숫자, 배열, 컬렉션, 데이터 구조, 날짜와 시간, 불변성, 타입 추론, 옵셔널, 자바 I/O, 비동기 처리, 동시성, 자바 리플렉션, 람다, 스트림, 컬렉터, 함수형 프로그래밍, 디자인 패턴, HTTP Client 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
____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 요약
필요한 자료를 선택하세요.
독자의견 남기기