코딩 개념 잡는 자바 코딩 문제집
더북(TheBook)

코딩 개념 잡는 자바 코딩 문제집

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

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

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

«코딩 개념 잡는 자바 코딩 문제집»은 1장을 공개합니다.

목차

  • 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 함수형 스타일과 절차적 코드에서 null 참조 검사
  • 041 null 참조 검사와 맞춤형 NullPointerException 던지기
  • 042 null 참조 검사와 명시된 예외(가령 IllegalArgumentException) 던지기
  • 043 null 참조 검사와 null이 아닌 기본 참조 반환
  • 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와 null 초기자, 인스턴스 변수, 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과 null 참조
  • 232 값이 존재하는 Optional 클래스 소비
  • 233 값이 존재하는 Optional 클래스 혹은 다른 클래스 반환
  • 234 orElseFoo( )로 람다 연결
  • 235 값을 구하기 위한 Optional 사용 금지
  • 236 필드에 Optional 사용 금지
  • 237 생성자 인수에 Optional 사용 금지
  • 238 세터 인수에 Optional 사용 금지
  • 239 메서드 인수에 Optional 사용 금지
  • 240 비어 있거나 널인 컬렉션 또는 배열 반환에 Optional 사용 금지
  • 241 컬렉션에 Optional 쓰지 않기
  • 242 of( )와 ofNullable( ) 혼동
  • 243 Optional<T> 대 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 요약
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.