자바 개발자 로드맵 — 여기까지 왔다면 다음은 어디로
자바 개발자 로드맵 — 여기까지 왔다면, 다음은 어디로
34편의 Java 시리즈를 끝냈다. 이제 뭘 공부해야 하지?
변수와 타입부터 시작해서 JVM 내부 구조, 제네릭, 동시성까지 달려왔습니다. 면접 준비를 하면서 "이걸 다 알아야 하나?"라는 생각이 들었던 적이 한두 번이 아닌데, 사실 이 시리즈를 처음부터 끝까지 따라왔다면 Java 기본기는 상당히 탄탄해진 상태입니다.
이 마지막 글에서는 지금까지 배운 것을 정리하고, 면접에서 실제로 자주 나오는 주제를 짚고, 다음 단계로 어디로 가야 하는지 로드맵을 그려보겠습니다.
1. 34편 전체 복습 맵
34편을 크게 7개 그룹으로 나눌 수 있습니다. 각 그룹이 어떤 역할을 하는지, 핵심 키워드가 뭔지 한눈에 정리해봤습니다.
입문 (1~4편): Java의 첫걸음
| 편 | 주제 | 핵심 키워드 |
|---|---|---|
| 1 | Java 시작하기 | JDK, JRE, javac, main 메서드 |
| 2 | 변수와 타입 | primitive vs reference, 타입 캐스팅, 래퍼 클래스 |
| 3 | 제어문과 반복문 | if-else, switch, for, while, break/continue |
| 4 | 메서드와 배열 | 매개변수 전달(Call by Value), 가변 인자, 다차원 배열 |
이 구간은 어떤 언어든 기본이 되는 부분입니다. 면접에서 단독으로 물어보는 경우는 드물지만, "Java는 Call by Value인가 Call by Reference인가?" 같은 질문은 여전히 나옵니다.
OOP (5~7편): 객체지향의 뼈대
| 편 | 주제 | 핵심 키워드 |
|---|---|---|
| 5 | 클래스와 객체 | 생성자, this, static, 접근 제어자 |
| 6 | 상속과 다형성 | extends, 오버라이딩, 업캐스팅, instanceof |
| 7 | 인터페이스와 추상 클래스 | abstract, default 메서드, 다중 구현, DIP |
객체지향은 Java의 정체성 그 자체입니다. 면접에서 **"추상 클래스와 인터페이스의 차이"**를 못 대답하면 다른 질문으로 넘어갈 기회조차 없을 수 있습니다.
핵심 API (8~13편): 실무에서 매일 쓰는 도구들
| 편 | 주제 | 핵심 키워드 |
|---|---|---|
| 8 | 예외 처리 | checked vs unchecked, try-with-resources, 커스텀 예외 |
| 9 | 문자열 | String Pool, immutability, StringBuilder vs StringBuffer |
| 10 | 컬렉션 프레임워크 | List, Set, Map, ArrayList vs LinkedList, HashMap |
| 11 | 제네릭 | 타입 소거, 와일드카드, PECS |
| 12 | Enum과 어노테이션 | enum 메서드, 커스텀 어노테이션, 메타 어노테이션 |
| 13 | 람다와 스트림 | 함수형 인터페이스, Stream API, 지연 평가 |
이 구간은 코딩 테스트와 실무 모두에서 필수입니다. 특히 컬렉션과 스트림은 거의 매일 쓰게 됩니다.
I/O (14~15편): 입출력의 세계
| 편 | 주제 | 핵심 키워드 |
|---|---|---|
| 14 | I/O와 NIO | InputStream/OutputStream, Channel, Buffer, Selector |
| 15 | 직렬화와 JSON | Serializable, transient, Jackson, Gson |
네트워크 프로그래밍이나 파일 처리를 할 때 기반이 되는 지식입니다. NIO는 Netty 같은 프레임워크의 동작 원리를 이해하는 데 필수입니다.
동시성 (16~17편): 멀티스레딩의 핵심
| 편 | 주제 | 핵심 키워드 |
|---|---|---|
| 16 | 스레드 기초 | Thread, Runnable, synchronized, volatile |
| 17 | Java 동시성 심화 | ExecutorService, CompletableFuture, ConcurrentHashMap, Virtual Thread |
면접에서 가장 깊이 있는 질문이 나오는 영역입니다. "synchronized와 ReentrantLock의 차이"는 거의 단골 질문이고, 최근에는 Virtual Thread 관련 질문도 늘어나는 추세입니다.
JVM과 버전 (18~19편): 내부를 들여다보기
| 편 | 주제 | 핵심 키워드 |
|---|---|---|
| 18 | JVM 내부 구조 | ClassLoader, Runtime Data Area, GC, JIT |
| 19 | Java 버전별 변경점 | Java 8 람다, Java 11 var, Java 17 sealed, Java 21 가상 스레드 |
JVM을 이해하면 성능 튜닝, 메모리 누수 디버깅, GC 로그 분석 같은 실무 역량이 생깁니다. 시니어 개발자와의 차이가 여기서 나옵니다.
고급·심화 (20~34편): 깊이를 더하는 주제들
| 편 | 주제 | 핵심 키워드 |
|---|---|---|
| 20 | 제네릭 심화 | 타입 소거 원리, 와일드카드 바운드, PECS |
| 21 | 동시성 심화 | Lock, Atomic, Fork/Join, CompletableFuture 체이닝 |
| 22 | 리플렉션 | Class 객체, Method.invoke, 다이나믹 프록시 |
| 23~34 | 기타 심화 | 날짜/시간, 디자인 패턴, 성능 최적화 등 |
특히 리플렉션은 Spring의 동작 원리를 이해하는 열쇠입니다.
2. FAANG 면접 빈출 TOP 10
면접 준비할 때 "어디서부터 봐야 하지?"라는 고민이 있다면, 이 10가지 주제를 먼저 잡으면 됩니다. 실제 기술 면접에서 자주 나오는 순서대로 정리했습니다.
1위: HashMap의 내부 동작 원리
- 관련 편: 10편 (컬렉션 프레임워크)
- 핵심 포인트: 해시 충돌 처리, 체이닝 → 트리화 (Java 8), 리사이징 과정
- 예상 질문: "HashMap의 put() 메서드 내부에서 어떤 일이 일어나나요?"
이 주제는 자료구조, 알고리즘, Java API 지식을 동시에 확인할 수 있어서 면접관이 매우 좋아합니다.
2위: String의 불변성과 String Pool
- 관련 편: 9편 (문자열)
- 핵심 포인트: String Pool, intern(),
==vsequals(), StringBuilder 사용 시점 - 예상 질문: "
new String("hello")와"hello"의 차이는?"
간단해 보이지만 JVM 메모리 구조와 연결되면 깊어지는 주제입니다.
3위: GC (Garbage Collection)
- 관련 편: 18편 (JVM 내부 구조)
- 핵심 포인트: Young/Old Generation, Mark-and-Sweep, G1GC, ZGC
- 예상 질문: "STW(Stop-The-World)가 뭔가요? 줄이려면 어떻게 하나요?"
시니어 면접에서는 GC 로그를 읽고 튜닝한 경험을 물어보기도 합니다.
4위: synchronized vs ReentrantLock
- 관련 편: 16~17편 (동시성)
- 핵심 포인트: 모니터 락, tryLock, Condition, fairness
- 예상 질문: "synchronized를 쓰면 되는데 왜 ReentrantLock이 필요한가요?"
5위: 제네릭과 타입 소거
- 관련 편: 11편, 20편 (제네릭)
- 핵심 포인트: 컴파일 타임 vs 런타임, 브릿지 메서드,
List<Integer>와List<String>의 런타임 차이 - 예상 질문: "제네릭이 런타임에 사라진다는 게 무슨 뜻이고, 어떤 문제가 생기나요?"
6위: equals/hashCode 규약
- 관련 편: 5편 (클래스와 객체), 10편 (컬렉션)
- 핵심 포인트: 대칭성, 일관성, hashCode 규약, HashMap과의 관계
- 예상 질문: "equals만 재정의하고 hashCode를 재정의하지 않으면 어떤 버그가 생기나요?"
7위: JVM 메모리 구조
- 관련 편: 18편 (JVM 내부 구조)
- 핵심 포인트: Stack, Heap, Method Area, PC Register, Native Method Stack
- 예상 질문: "지역 변수는 어디에 저장되고, 객체는 어디에 저장되나요?"
8위: 추상 클래스 vs 인터페이스
- 관련 편: 7편 (인터페이스와 추상 클래스)
- 핵심 포인트: 다중 상속, default 메서드 (Java 8), 설계 관점 차이
- 예상 질문: "인터페이스에 default 메서드가 생겼는데, 그러면 추상 클래스가 왜 필요한가요?"
9위: Stream API와 함수형 프로그래밍
- 관련 편: 13편 (람다와 스트림)
- 핵심 포인트: 지연 평가, 중간 연산 vs 최종 연산, parallelStream 주의점
- 예상 질문: "parallelStream을 아무 데나 쓰면 안 되는 이유는?"
10위: checked vs unchecked 예외
- 관련 편: 8편 (예외 처리)
- 핵심 포인트: 컴파일러 강제 여부, RuntimeException, 실무에서의 전략
- 예상 질문: "Spring에서는 왜 주로 unchecked 예외를 사용하나요?"
3. 자주 나오는 꼬리 질문 패턴
면접에서 첫 번째 답을 잘 했다고 끝이 아닙니다. 면접관은 거의 반드시 꼬리 질문을 던집니다. 패턴을 알면 대비할 수 있습니다.
패턴 1: "그래서 내부적으로는?"
면접관: "ArrayList와 LinkedList의 차이가 뭔가요?"
지원자: "ArrayList는 배열 기반이고 LinkedList는 노드 기반입니다."
면접관: "그러면 ArrayList의 add()에서 배열이 꽉 찼을 때 내부적으로 어떤 일이 일어나나요?"
이 패턴은 API를 외웠는지, 원리를 이해했는지 확인하는 질문입니다.
대비 방법:
- 자주 쓰는 클래스의 핵심 메서드를 소스 코드 수준에서 한 번 읽어보기
- "내부적으로 ~를 호출하고, ~의 이유로 이렇게 동작합니다"라는 답변 구조 연습
패턴 2: "그게 왜 그렇게 동작하나요?"
면접관: "String이 왜 불변인가요?"
지원자: "보안과 성능 때문입니다."
면접관: "보안이라고 했는데, 구체적으로 어떤 보안 문제가 생기나요?"
단순히 "~때문"이라고 답하면, 그 이유의 이유를 물어봅니다.
대비 방법:
- 모든 답변에 **"구체적인 예시"**를 하나씩 준비하기
- "예를 들어 ~한 상황에서 ~가 발생할 수 있어서"라는 형태로 답변
패턴 3: "그러면 이건 어떻게 되나요?" (엣지 케이스)
면접관: "HashMap은 null 키를 허용하나요?"
지원자: "네, 허용합니다."
면접관: "ConcurrentHashMap은요? 왜 다르게 동작하나요?"
한 주제에서 비슷하지만 미묘하게 다른 케이스로 확장하는 패턴입니다.
대비 방법:
- 비슷한 클래스를 비교 테이블로 정리해두기
- HashMap vs ConcurrentHashMap vs TreeMap vs LinkedHashMap 같은 비교
패턴 4: "실무에서는 어떻게 쓰세요?"
면접관: "synchronized를 아시죠?"
지원자: "네, 모니터 락 기반의 동기화 메커니즘입니다."
면접관: "실무에서 동시성 문제를 해결한 경험이 있나요? 어떤 방법을 선택했고 왜 그랬나요?"
이론에서 갑자기 경험으로 넘어가는 패턴입니다.
대비 방법:
- 사이드 프로젝트에서라도 직접 겪은 문제와 해결 과정을 정리해두기
- "처음에는 ~를 시도했는데, ~한 문제가 있어서 결국 ~로 해결했습니다" 구조
패턴 5: "트레이드오프가 뭔가요?"
면접관: "ArrayList 대신 LinkedList를 쓰면 좋은 점이 뭔가요?"
지원자: "중간 삽입/삭제가 O(1)입니다."
면접관: "그러면 왜 실무에서는 거의 ArrayList만 쓰나요? LinkedList의 단점은?"
어떤 기술이든 장점만 있는 건 없다는 걸 아는지 확인하는 질문입니다.
대비 방법:
- 모든 기술 선택에 대해 "장점 / 단점 / 언제 쓰는지" 세 가지를 정리
- "~는 ~에 좋지만, ~라는 트레이드오프가 있어서 ~한 상황에서는 ~가 더 낫습니다"
4. 이 시리즈에서 다루지 못한 것들
34편이라는 분량에도 Java의 모든 것을 담기는 어려웠습니다. 더 깊이 들어가고 싶다면 이런 주제들이 기다리고 있습니다.
Java Agent와 바이트코드 조작
// Java Agent의 premain 메서드 — JVM 시작 시 호출됨
public static void premain(String agentArgs, Instrumentation inst) {
// 모든 클래스 로딩을 가로채서 바이트코드를 조작할 수 있음
inst.addTransformer(new MyClassTransformer());
}
Java Agent는 JVM에 로드되는 클래스의 바이트코드를 런타임에 조작하는 기술입니다. APM(Application Performance Monitoring) 도구들이 이 기술을 핵심적으로 사용합니다.
- 관련 기술: ASM, Byte Buddy, Javassist
- 실무 활용: 성능 모니터링(Pinpoint, Datadog), 코드 커버리지(JaCoCo)
- 학습 난이도: 상 — 바이트코드 명령어(Bytecode Instruction Set)를 이해해야 함
sun.misc.Unsafe (그리고 후속 API)
// Unsafe를 이용한 직접 메모리 할당 — 일반적으로 사용하면 안 됨
Unsafe unsafe = getUnsafeInstance();
long address = unsafe.allocateMemory(1024); // 힙 밖 메모리 할당
unsafe.freeMemory(address); // 수동 해제 필요
Unsafe는 Java의 안전장치를 우회하는 내부 API입니다. CAS 연산, 직접 메모리 접근, 객체 생성자 우회 등이 가능합니다.
- 관련 기술: VarHandle (Java 9에서 일부 대체), Foreign Memory Access API
- 실무 활용: 고성능 라이브러리 (Netty, Kafka의 내부 구현)
- 주의: Java 9부터 접근이 제한되기 시작, JEP 471로 향후 제거 예정
Project Panama — 네이티브 코드와의 연결
// Panama의 Foreign Function & Memory API (Java 22 프리뷰)
// C 라이브러리의 strlen 함수를 Java에서 직접 호출
Linker linker = Linker.nativeLinker();
SymbolLookup stdlib = linker.defaultLookup();
MethodHandle strlen = linker.downcallHandle(
stdlib.find("strlen").orElseThrow(),
FunctionDescriptor.of(ValueLayout.JAVA_LONG, ValueLayout.ADDRESS)
);
JNI의 복잡함을 해소하기 위한 프로젝트입니다. Java에서 C/C++ 라이브러리를 직접 호출하는 것이 훨씬 간단해집니다.
Project Valhalla — 값 타입
// Value Class (아직 프리뷰 단계)
// identity가 없는 타입 — 힙 할당 없이 인라인 가능
value class Point {
int x;
int y;
}
Java의 원시 타입과 객체 타입 사이의 간극을 메우기 위한 프로젝트입니다. int처럼 스택에 저장되면서도 메서드를 가질 수 있는 타입을 만듭니다.
GraalVM Native Image
# Java 애플리케이션을 네이티브 바이너리로 컴파일
native-image -jar myapp.jar
# 결과: JVM 없이 실행 가능한 단일 실행 파일
# 시작 시간: 수십 밀리초, 메모리: 수십 MB
GraalVM은 Java 코드를 AOT(Ahead-of-Time) 컴파일하여 네이티브 바이너리로 만들 수 있습니다. 서버리스, CLI 도구, 마이크로서비스에서 주목받고 있습니다.
- 장점: 초고속 시작, 낮은 메모리 사용
- 단점: 리플렉션 제한, 빌드 시간 증가, 다이나믹 클래스 로딩 불가
- 관련 프레임워크: Quarkus, Micronaut (GraalVM 네이티브 이미지 1등 지원)
5. Spring 생태계로의 확장
Java를 배웠다면 다음 목적지는 거의 확정적으로 Spring입니다. Java 생태계에서 Spring 없이 백엔드 개발을 논하기는 어렵습니다.
Spring Boot — 진입점
// Spring Boot의 시작점 — Java 시리즈에서 배운 어노테이션, 리플렉션이 여기서 빛남
@SpringBootApplication // @Configuration + @EnableAutoConfiguration + @ComponentScan
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args); // 내장 톰캣 시작
}
}
Spring Boot를 처음 만나면 "마법 같다"고 느끼는데, 사실 그 마법의 정체는 우리가 배운 어노테이션, 리플렉션, 다이나믹 프록시입니다.
- 연결되는 시리즈 지식: 어노테이션(12편), 리플렉션(22편), 인터페이스(7편)
- 핵심 개념: IoC 컨테이너, DI, AOP, Auto Configuration
Spring Security — 인증과 인가
보안은 선택이 아니라 필수입니다. Spring Security는 FilterChain 패턴으로 동작하는데, 서블릿 필터와 프록시 패턴을 이해하면 훨씬 수월합니다.
- 연결되는 시리즈 지식: 디자인 패턴(체인 오브 리스폰시빌리티), 예외 처리(8편)
- 핵심 개념: Authentication, Authorization, FilterChain, OAuth2
Spring Data JPA — 데이터베이스 접근
// JPA 리포지토리 — 인터페이스만 선언하면 구현체가 자동 생성됨
// 이것이 가능한 이유: 다이나믹 프록시 (22편에서 다룬 내용)
public interface UserRepository extends JpaRepository<User, Long> {
// 메서드 이름만으로 쿼리가 생성됨
List<User> findByNameAndAge(String name, int age);
}
인터페이스만 만들면 구현체가 자동으로 생기는 "마법"의 정체가 바로 다이나믹 프록시입니다.
- 연결되는 시리즈 지식: 리플렉션(22편), 제네릭(11편), 인터페이스(7편)
- 핵심 개념: 영속성 컨텍스트, 지연 로딩, N+1 문제, JPQL
Spring Cloud — 마이크로서비스
분산 시스템을 구축한다면 Spring Cloud가 필요합니다.
- 핵심 구성요소:
- Spring Cloud Gateway — API 게이트웨이
- Spring Cloud Config — 중앙 설정 관리
- Resilience4j — 서킷 브레이커
- Spring Cloud Sleuth/Micrometer — 분산 추적
Spring 학습 로드맵 요약
Spring Boot 기초
↓
Spring MVC (REST API)
↓
Spring Data JPA (데이터베이스)
↓
Spring Security (인증/인가)
↓
Spring Cloud (MSA) ← 이 단계는 취업 후에도 늦지 않음
Spring을 배울 때 가장 중요한 건 "왜 이렇게 동작하지?"라는 질문을 멈추지 않는 것입니다. 그 답은 대부분 이 Java 시리즈에서 다룬 내용에 있습니다.
6. 추천 학습 자료
필독서
Effective Java (Joshua Bloch)
Java 개발자라면 반드시 한 번은 읽어야 하는 책입니다.
특히 중요한 아이템들:
- Item 1: 생성자 대신 정적 팩터리 메서드를 고려하라
- Item 10-11: equals/hashCode 규약
- Item 17: 변경 가능성을 최소화하라 (불변 객체)
- Item 28: 배열보다는 리스트를 사용하라
- Item 31: 한정적 와일드카드를 사용해 API 유연성을 높여라
- Item 78-84: 동시성 관련 아이템들
이 시리즈에서 다룬 제네릭, 동시성, 불변 객체 같은 주제가 왜 그렇게 설계되었는지 깊이 있게 설명합니다.
Java Concurrency in Practice (Brian Goetz)
동시성 프로그래밍의 바이블입니다. 16~17편에서 다룬 내용의 이론적 배경을 탄탄히 잡을 수 있습니다.
핵심 챕터:
- Part 1: 스레드 안전성과 공유 객체
- Part 2: 동시성 애플리케이션 구조화
- Part 3: 성능과 테스트
- Part 4: 고급 주제 (메모리 모델, CAS)
출간된 지 오래됐지만 동시성의 원리는 변하지 않기 때문에 여전히 유효합니다.
Modern Java in Action
Java 8 이후의 함수형 프로그래밍 스타일을 깊이 있게 다룹니다. 13편 (람다와 스트림)을 더 파고 싶다면 추천합니다.
공식 문서 & 온라인 리소스
- Oracle Java Documentation — 가장 정확한 레퍼런스
- Java Language Specification (JLS) — 표준 확인용
- Baeldung — Java/Spring 튜토리얼의 사실상 표준
- Inside Java (Oracle YouTube) — JDK 개발자들이 직접 설명하는 채널
7. 시니어로 가는 길
주니어에서 시니어로 성장하는 데 필요한 것은 단순히 "더 많이 아는 것"이 아닙니다.
깊이 vs 넓이 — 둘 다 필요하지만 순서가 있다
주니어 시기: 깊이 우선
├── Java 하나를 제대로 파고들기
├── Spring Boot로 실제 서비스 만들어보기
└── 하나의 데이터베이스를 깊이 있게 사용해보기
미드레벨 시기: 넓이 확장
├── 다른 언어/패러다임 경험 (Go, Kotlin, Python)
├── 인프라 기본기 (Docker, K8s, CI/CD)
└── 분산 시스템 기초 (메시지 큐, 캐시, 로드 밸런싱)
시니어 시기: 깊이 + 넓이 + 판단력
├── 기술 선택의 트레이드오프를 설명할 수 있음
├── 시스템 설계에서 병목을 예측할 수 있음
└── 팀의 기술 방향을 결정하고 근거를 제시할 수 있음
주니어 때 가장 중요한 건 하나를 깊이 파는 것입니다. 이 시리즈를 끝까지 따라왔다면 그 "하나"로 Java를 선택한 셈이고, 좋은 출발입니다.
오픈소스 기여
오픈소스 기여는 생각보다 진입장벽이 낮습니다.
단계별 접근:
1. 문서 오타 수정, README 번역 — 코드를 몰라도 가능
2. Good First Issue 라벨이 붙은 이슈 해결
3. 버그 리포트 + 재현 코드 작성
4. 실제 기능 구현 PR
오픈소스 기여를 추천하는 이유는 현업 개발자에게 코드 리뷰를 받을 수 있기 때문입니다. 추천 시작점으로는 Spring Framework, Apache Commons, Guava 등이 있습니다.
코드 리뷰와 아키텍처 설계
좋은 코드 리뷰는 **"이게 틀렸다"가 아니라 "이렇게 하면 어떨까?"**입니다. 주니어일 때 코드 리뷰를 받으면서 **"왜 이렇게 바꿔야 하지?"**라는 질문을 계속하세요. 그 과정 자체가 학습입니다.
시니어가 된다는 건 결국 **"어떻게 만들까"를 넘어 "왜 이렇게 만들어야 하는가"**를 설명할 수 있는 것입니다. 트래픽 예측, SLA, 단일 장애점, 데이터 정합성 vs 가용성 같은 고민이 필요한데, Java를 깊이 이해한 개발자는 이런 판단을 배우는 속도가 다릅니다. HashMap의 내부 동작을 이해한 사람은 Redis의 Hash 자료구조도 금방 이해하고, JVM의 GC를 아는 사람은 Go의 GC와 비교하면서 더 깊이 학습할 수 있습니다.
8. 마무리
34편을 여기까지 읽어주셔서 정말 감사합니다.
처음 이 시리즈를 시작할 때 목표는 단순했습니다. "면접에서 Java 질문이 나왔을 때 당황하지 않을 정도의 기본기를 쌓자." 변수와 타입부터 시작해서, 컬렉션의 내부 구조를 파헤치고, JVM이 어떻게 돌아가는지 살펴보고, 동시성의 세계까지 탐험했습니다.
공부하면서 느낀 건, Java가 단순히 오래된 언어가 아니라는 것입니다. Virtual Thread, Pattern Matching, Record 같은 최신 기능들은 Java가 계속 진화하고 있다는 증거입니다.
기억해주세요
기초가 단단하면 어떤 프레임워크도 결국 이해할 수 있습니다.
Spring이 "마법처럼" 동작하는 것도, JPA가 "알아서" 쿼리를 만들어주는 것도, 결국 Java의 리플렉션, 프록시, 어노테이션이라는 기초 위에 서 있습니다. 새로운 프레임워크가 나와도, 새로운 라이브러리가 등장해도, 그 아래에는 항상 우리가 배운 Java의 기본기가 있습니다.
면접장에서 긴장되더라도 이렇게 생각해보세요:
"나는 HashMap이 내부에서 어떻게 동작하는지 알고 있고, String이 왜 불변인지 설명할 수 있고, synchronized와 ReentrantLock의 차이를 알고 있다. 기본기는 충분하다."
물론 부족한 부분도 있을 겁니다. 모든 것을 완벽하게 아는 개발자는 없습니다. 중요한 건 **"모르는 것을 알게 되었을 때 어떻게 학습하는가"**이고, 이 시리즈를 통해 그 방법도 함께 연습했다고 생각합니다.
앞으로의 여정
이제 이 시리즈는 끝나지만, 학습은 계속됩니다.
당장 할 수 있는 것들:
1. 이 시리즈를 한 번 더 훑으며 "설명할 수 없는 부분" 체크하기
2. 면접 빈출 TOP 10을 친구에게 설명해보기 (설명 못하면 모르는 것)
3. Effective Java에서 관심 가는 아이템 3개만 읽기
4. Spring Boot로 간단한 REST API 하나 만들어보기
5. LeetCode에서 Java로 문제 풀면서 API 감각 유지하기
코드 한 줄, 개념 하나를 이해할 때마다 여러분은 어제보다 더 나은 개발자가 되고 있습니다. 그 과정을 즐기시길 바랍니다.
수고하셨습니다. 그리고 행운을 빕니다.