🎯 F-lab Java 1주차 학습 커리큘럼

Psj·2026년 5월 4일

F-lab

목록 보기
5/230

🎯 F-lab Java 1주차 학습 커리큘럼

기존 정리내용을 복사해서 프롬프트에게 이하같이 요구함.

이 내용속에서 커리큘럼을 순서에 맞게 만들어줘

F-lab 1주차 자료에서 다룬 모든 토픽을 "선수지식 → 응용" 순서로 재배열한 학습 경로.
책의 페이지 순서가 아니라 개념 의존성을 기준으로 정렬했다.
각 Unit은 9-섹션 마스터 프롬프트로 깊이 학습할 수 있는 단위다.


📊 학습 경로 한눈에 보기

[Phase 1] OOP 기초 패러다임
   ↓
[Phase 2] 클래스 문법과 객체간 관계
   ↓
[Phase 3] SOLID — OOP를 망가뜨리지 않는 5계명
   ↓
[Phase 4] JVM 메모리 모델 ─────┐
   ↓                          │
[Phase 5] GC 깊이 파기         │  (메모리 이해 기반)
   ↓                          │
[Phase 6] 데이터 다루기 (문자열·컬렉션) ◄┘
   ↓
[Phase 7] 외부 세계와의 통신 (I/O·직렬화)

총 7 Phase × 25 Unit — 각 Unit은 30분~1시간 분량.


🗓️ 권장 학습 일정 (7일 기준)

DayPhase학습 목표
1일차Phase 1 + 2OOP 패러다임과 클래스 문법 끝내기
2일차Phase 3SOLID 5원칙 코드 레벨로 체화
3일차Phase 4JVM 메모리 모델·Pass by value 정복
4일차Phase 5GC 알고리즘과 GC 종류 정리
5일차Phase 6 (전반)String, StringBuilder, ArrayList vs LinkedList
6일차Phase 6 (후반)HashMap, TreeMap, 가변인자
7일차Phase 7I/O, NIO, Serializable, transient

📚 Phase 1 — OOP 기초 패러다임

목표: "왜 자바는 객체지향인가" 라는 질문에 직접 대답할 수 있게 된다.

Unit 1.1 — 절차지향 vs 객체지향

선수 지식: 없음 (출발점)

핵심 개념

  • 절차지향 (C 언어): 데이터와 함수가 분리됨
  • 객체지향 (Java): 데이터(상태)와 행동(메서드)을 하나의 객체로 묶음
  • 현실 모델링: "자동차의 속도와 가속"이 코드에서도 한 묶음으로 표현됨

자기 점검

  • C 구조체로 OOP를 흉내낼 수는 있는가? 그렇다면 자바와 무엇이 다른가?

원본 자료: 자바의신 1, p.27


Unit 1.2 — 클래스와 객체의 본질

선수 지식: Unit 1.1

핵심 개념

  • 클래스 = 청사진(blueprint), 객체 = 청사진으로 찍어낸 실물
  • 비유: 클래스는 붕어빵 틀, 객체(인스턴스)는 붕어빵
  • 클래스가 가져야 할 두 가지: 상태(필드)행동(메서드)

자기 점검

  • "클래스는 가장 작은 단위"라는 말의 의미는?
  • 상태 없이 행동만 있는 클래스는 의미가 있을까?

원본 자료: 자바의신 1, p.35


📚 Phase 2 — 클래스 문법과 객체간 관계

목표: 클래스 작성 → 상속 → 다형성으로 이어지는 OOP의 3대 축을 손에 익힌다.

Unit 2.1 — 메서드의 구조

선수 지식: Unit 1.2

핵심 개념

  • 시그니처: [접근제어자] [반환타입] 메서드명(매개변수)
  • 매개변수: 메서드명 우측 소괄호 안
  • 반환값: return 예약어 사용

자기 점검

  • void 반환 타입의 메서드에서 return을 쓸 수 있는가?
  • 매개변수 없는 메서드와 있는 메서드의 호출 방식 차이는?

원본 자료: 자바의신 1, p.35


Unit 2.2 — 가변인자 (Varargs)

선수 지식: Unit 2.1

핵심 개념

  • 매개변수 개수가 가변일 때 타입... 변수명 으로 선언
  • 메서드 안에서는 배열로 다룸
  • 오버로딩의 대안

자기 점검

  • void log(String... args)void log(String[] args) 의 차이는?
  • 가변인자는 매개변수 목록의 어느 위치에 와야 하는가?

원본 자료: 자바의신 1, p.251


Unit 2.3 — 상속과 생성자 체이닝

선수 지식: Unit 2.1

핵심 개념

  • extends로 부모 클래스의 필드/메서드 상속
  • 자식 생성자는 가장 먼저 부모 생성자를 호출 (super())
  • 함정: 부모에 매개변수 있는 생성자만 있으면, 자식은 명시적으로 super(...) 호출 필요

자기 점검

  • 부모 클래스에 매개변수 있는 생성자만 있고 자식에서 super를 안 쓰면 무슨 일이 일어나는가?
  • 다중 상속이 자바에서 금지된 이유는?

원본 자료: 자바의신 1, p.301


Unit 2.4 — 다형성 (Polymorphism)

선수 지식: Unit 2.3

핵심 개념

  • 부모 타입 변수가 자식 객체를 가리킬 수 있다
  • 메서드 호출 시 실제 객체의 메서드가 실행됨 (동적 바인딩)
  • "형 변환을 해도 호출되는 건 원래 객체의 메서드"

자기 점검

  • Animal a = new Dog(); a.eat(); 에서 호출되는 eat()은 누구 것인가?
  • 컴파일 타임 타입과 런타임 타입의 차이는?

원본 자료: 자바의신 1, p.317


Unit 2.5 — instanceof와 형변환

선수 지식: Unit 2.4

핵심 개념

  • instanceof로 실제 타입 확인
  • 가장 하위 자식 타입부터 확인해야 정확한 분기 가능
  • Java 16+ 패턴 매칭: if (a instanceof Dog d) { d.bark(); }

자기 점검

  • 부모 타입을 자식 타입으로 캐스팅하기 전에 왜 instanceof 검사가 필요한가?
  • Object instanceof String 이 false일 수 있는 경우는?

원본 자료: 자바의신 1, p.315


Unit 2.6 — Nested / Inner / Anonymous 클래스

선수 지식: Unit 2.4

핵심 개념

  • Nested 클래스: 클래스 안의 클래스
  • 내부 클래스 = Inner 클래스 (이름 있음)
  • 익명 클래스 = Anonymous 클래스 (이름 없음, 즉석 정의)
  • 람다의 전신

자기 점검

  • 익명 클래스는 언제 람다로 대체할 수 있는가?
  • 내부 클래스가 외부 클래스의 private 필드에 접근 가능한 이유는?

원본 자료: 자바의신 1, p.530, p.535


📚 Phase 3 — SOLID 5원칙

목표: OOP 문법은 알지만 "잘 짠 코드"가 무엇인지 모르는 단계에서, 변경에 강한 코드의 5가지 규칙을 체득한다.

Unit 3.1 — SRP (단일 책임 원칙)

선수 지식: Phase 2 전체

핵심 개념

  • "클래스는 변경 이유가 하나여야 한다"
  • 한 클래스에 DB 저장 + 메일 발송 + 리포트 생성이 다 들어있으면 ❌
  • 책임별로 클래스 분리: User / UserRepository / EmailService

자기 점검

  • "책임"의 단위는 어떻게 정의하는가?
  • SRP를 너무 엄격히 적용하면 어떤 부작용이 있는가?

Unit 3.2 — OCP (개방-폐쇄 원칙)

선수 지식: Unit 3.1, 인터페이스 개념

핵심 개념

  • "확장에는 열려있고, 수정에는 닫혀있어야 한다"
  • if-else로 타입 분기 → 인터페이스로 다형성 활용
  • 새 기능 추가 시 기존 코드 안 건드리는 게 목표

자기 점검

  • if (type.equals("VIP")) 같은 코드는 왜 OCP 위반인가?
  • Strategy 패턴이 OCP의 대표 구현체인 이유는?

Unit 3.3 — LSP (리스코프 치환 원칙)

선수 지식: Unit 2.4, Unit 3.2

핵심 개념

  • "자식은 부모를 완벽히 대체할 수 있어야 한다"
  • Penguin extends Bird 에서 fly()를 막으면 LSP 위반
  • 해결: 상속 구조를 재설계 (FlyingBird 인터페이스 분리)

자기 점검

  • 자식이 부모의 메서드에 UnsupportedOperationException을 던지면 왜 안 되는가?
  • LSP가 깨지면 다형성도 깨지는 이유는?

Unit 3.4 — ISP (인터페이스 분리 원칙)

선수 지식: Unit 3.3

핵심 개념

  • "클라이언트는 안 쓰는 인터페이스에 의존하지 말 것"
  • Worker { work(); eat(); } → Robot에는 eat() 불필요
  • 해결: WorkableEatable로 분리

자기 점검

  • 인터페이스가 너무 잘게 쪼개지면 어떤 문제가 생기는가?
  • ISP와 SRP의 차이는?

Unit 3.5 — DIP (의존 역전 원칙)

선수 지식: Unit 3.4

핵심 개념

  • "추상화에 의존하라, 구체에 의존하지 말라"
  • Computernew Keyboard() 를 직접 만들면 ❌
  • 해결: InputDevice 인터페이스에 의존, 외부에서 주입(DI)
  • Spring의 의존성 주입과 정확히 같은 원리

자기 점검

  • "의존성 역전"에서 무엇이 무엇으로 역전되는 것인가?
  • DIP와 DI(Dependency Injection)의 관계는?

📚 Phase 4 — JVM 메모리 모델

목표: 객체가 어디에 어떻게 저장되는지를 본 다음, "Pass by value의 진실"을 이해한다.

Unit 4.1 — JVM 런타임 데이터 영역

선수 지식: Phase 1, 2

핵심 개념

  • Method Area: 클래스 정보, static 변수, Constant Pool
  • Heap: 모든 객체 (new로 만든 것)
  • Stack (스레드별): 메서드 호출 프레임, 지역변수
  • PC Register, Native Method Stack

자기 점검

  • Member m = new Member() 에서 m은 어디에, 객체 본체는 어디에 저장되는가?
  • static 변수와 인스턴스 변수의 저장 위치 차이는?

원본 자료: 자바의신 1, p.83 (JVM 구조)


Unit 4.2 — Pass by value (자바의 진실)

선수 지식: Unit 4.1

핵심 개념

  • 자바에는 pass by reference가 없다
  • 기본 자료형: 값이 복사됨
  • 참조 자료형: 주소값이 복사됨 → 같은 객체를 가리키므로 필드 변경이 호출자에 보임
  • 메서드 안에서 new로 재할당하면 호출자에 영향 없음

자기 점검

  • 매개변수로 받은 String에 b = "z" 를 하면 왜 호출자에 영향이 없는가?
  • 참조 자료형이라도 호출자에 영향 없게 하려면?

원본 자료: 자바의신 1, p.246


📚 Phase 5 — GC (Garbage Collection)

목표: GC의 동작 원리·알고리즘·종류를 이해해서 운영 환경에서 GC를 선택·튜닝할 수 있다.

Unit 5.1 — GC의 기본 개념과 약한 세대 가설

선수 지식: Unit 4.1

핵심 개념

  • Garbage = 더 이상 참조되지 않는 객체
  • GC = Heap에서 Garbage를 자동으로 수거하는 메커니즘
  • 약한 세대 가설: 대부분의 객체는 금방 죽고, 오래된 객체가 젊은 객체를 참조하는 경우는 드물다
  • STW(Stop The World): GC 동안 모든 애플리케이션 스레드 정지

자기 점검

  • 약한 세대 가설이 맞다면 메모리 구조를 어떻게 설계하는 게 합리적인가?
  • "GC 튜닝"이 일반적으로 무엇을 줄이는 것인가?

원본 자료: 자바의신 1, p.83


Unit 5.2 — Heap의 세대 구조

선수 지식: Unit 5.1

핵심 개념

  • Young Generation: Eden, Survivor 0(From), Survivor 1(To)
  • Old Generation: 장수 객체
  • 객체의 일생:
    1. Eden 생성
    2. Minor GC → 살아남으면 Survivor로
    3. From↔To 스위칭하며 N회 생존
    4. Old로 Promotion
    5. Old 가득 차면 Full GC + STW

자기 점검

  • Survivor가 두 개(From, To)로 나뉘어 있는 이유는?
  • 거대 객체(Survivor 영역보다 큰)는 어떻게 처리되는가?

Unit 5.3 — GC 알고리즘 4가지

선수 지식: Unit 5.2

핵심 개념

알고리즘핵심단점
Reference Counting참조 카운트 0이면 회수순환 참조 시 메모리 누수
Mark-and-SweepRoot에서 추적해 마킹 후 비마킹 객체 제거Compaction 없어서 단편화
Mark-and-CompactSweep 후 살아남은 객체를 모음Compact 오버헤드
Generational (실제 사용)Young/Old 분리 관리구조 복잡

자기 점검

  • 순환 참조가 Reference Counting에서 왜 문제인지 그림으로 그려보라
  • Mark-and-Sweep에서 OOM이 발생할 수 있는 이유는?

Unit 5.4 — GC 종류와 선택 기준

선수 지식: Unit 5.3

핵심 개념

GC등장특징적합 환경
Serial GC초기싱글 스레드CPU 1개, 작은 메모리
Parallel GCJava 7~8 default멀티 스레드 GC처리량 우선
CMS(Java 9 deprecated)STW 최소화응답성 중요
G1 GCJava 9+ defaultRegion 단위대부분의 서버
Z GCJava 11+STW 10ms 이하초저지연

터미널에서 내 GC 확인

java -XX:+PrintCommandLineFlags -version

자기 점검

  • G1 GC가 큰 Heap에 적합한 이유는?
  • ZGC와 G1의 가장 큰 차이는?

📚 Phase 6 — 데이터 다루기 (문자열·컬렉션)

목표: 자바에서 데이터를 보관·조작하는 자료구조를 용도에 맞게 선택할 수 있다.

Unit 6.1 — String과 Constant Pool

선수 지식: Unit 4.1

핵심 개념

  • 리터럴 "hello"String Constant Pool 에 저장
  • 같은 값의 리터럴은 재사용 (a == b 가 true가 됨)
  • new String("hello") 는 강제로 Heap에 새 객체 생성
  • String은 불변(immutable) 객체

자기 점검

  • String a = "abc"; String b = new String("abc"); a.equals(b)a == b 의 결과는?
  • String이 불변이어서 얻는 이점은?

원본 자료: 자바의신 1, p.483


Unit 6.2 — StringBuilder vs StringBuffer

선수 지식: Unit 6.1

핵심 개념

  • 둘 다 가변 문자열 (내부 char 배열)
  • append() 는 새 객체를 만들지 않음, 메서드 체이닝 가능
  • StringBuilder: 단일 스레드용 (빠름)
  • StringBuffer: 멀티 스레드용 (synchronized, 느림)
  • 루프 안의 문자열 합치기는 반드시 이걸로

자기 점검

  • String + String + ... 을 100만 번 반복하면 무슨 일이?
  • 메서드 로컬에서는 둘 중 무엇을 써야 하는가?

원본 자료: 자바의신 1, p.483


Unit 6.3 — ArrayList vs LinkedList

선수 지식: Unit 6.1, 배열 개념

핵심 개념

작업ArrayListLinkedList
get(i)O(1)O(n)
끝에 addO(1) 평균O(1)
중간 add/removeO(n)O(1) (위치 알 때)
메모리적음많음 (prev/next 포인터)

자기 점검

  • 인덱스 접근이 많은 워크로드에 LinkedList를 쓰면 어떻게 되는가?
  • 큐(Queue)로 쓸 때는 어느 쪽이 적합한가?

원본 자료: 자바의신 2, p.109


Unit 6.4 — HashMap과 LoadFactor

선수 지식: Unit 6.3, 해시 함수 개념

핵심 개념

  • 내부: 배열 + 해시 + (충돌 시) 연결 리스트 → Java 8부터 트리
  • LoadFactor 0.75: 배열의 75% 가 차면 배열을 2배로 확장하고 rehash
  • LoadFactor가 작으면 메모리 낭비, 크면 충돌 증가

자기 점검

  • LoadFactor 1.0 으로 설정하면 무슨 문제가 생기는가?
  • HashMap 키로 쓰는 객체에 equals()만 재정의하면?

원본 자료: 자바의신 2, p.104


Unit 6.5 — TreeMap과 SortedMap

선수 지식: Unit 6.4

핵심 개념

  • 내부: Red-Black Tree (자가 균형 이진탐색트리)
  • 키가 항상 정렬된 상태
  • put, get, remove 모두 O(log n) (HashMap의 O(1)보다 느림)
  • 키는 Comparable 구현 또는 Comparator 제공 필수

자기 점검

  • 정렬이 필요 없는데 TreeMap을 쓰면 어떤 손해가 있는가?
  • "날짜별 매출"을 저장하기에 적합한 자료구조는?

원본 자료: 자바의신 2, p.132


📚 Phase 7 — 외부 세계와의 통신 (I/O·직렬화)

목표: 파일, 네트워크와 데이터를 주고받는 추상화와 직렬화의 보안 함정까지 이해한다.

Unit 7.1 — try-finally → try-with-resources

선수 지식: Phase 2 (예외 개념 필요)

핵심 개념

  • 자원(파일, 소켓, DB 커넥션)은 반드시 close 해야 함
  • try 안에서 close하면 예외 시 호출 안 됨 → finally 필수
  • Java 7+: try (Resource r = ...) { } → 자동 close
  • AutoCloseable 인터페이스 구현 필요

자기 점검

  • try 안에서 close()를 하면 어떤 시나리오에서 누수가 발생하는가?
  • 여러 자원을 try-with-resources에서 선언하면 close 순서는?

원본 자료: 자바의신 2, p.211


Unit 7.2 — File → NIO.2 (Files, Path)

선수 지식: Unit 7.1

핵심 개념

  • 전통 java.io.File: 객체 생성 필요, 예외 정보 빈약 (delete()가 false만 반환)
  • NIO.2 java.nio.file.Files: 모든 메서드가 static, 정확한 예외 throw
  • Path로 파일 경로 표현

자기 점검

  • File.delete() 가 false를 반환했을 때 이유를 알 수 있는가?
  • Files.delete(path) 가 던지는 예외에는 무엇이 있는가?

원본 자료: 자바의신 2, p.191


Unit 7.3 — NIO (Channel + Buffer)

선수 지식: Unit 7.2

핵심 개념

  • 전통 I/O: Stream, 한 바이트씩, 블로킹
  • NIO: ChannelBuffer, 블록 단위, 논블로킹 가능
  • Selector: 한 스레드가 여러 채널을 감시
  • 동시 접속 1만 명 시나리오에서 차이가 극명

자기 점검

  • 블로킹 I/O로 1만 동시 접속을 처리하려면 스레드가 몇 개 필요한가?
  • Selector는 어떻게 한 스레드로 여러 채널을 처리하는가?

원본 자료: 자바의신 2, p.230


Unit 7.4 — Serializable과 transient

선수 지식: Phase 2

핵심 개념

  • Serializable 구현 → 객체를 바이트 스트림으로 변환 가능
  • serialVersionUID 명시 필수 (안 하면 클래스 변경 시 역직렬화 깨짐)
  • transient: 직렬화에서 제외할 필드
  • 비밀번호, 토큰, 임시 캐시는 transient 필수

자기 점검

  • 비밀번호 필드에 transient를 안 붙이면 무슨 보안 사고가 가능한가?
  • serialVersionUID 를 명시 안 하면 언제 문제가 터지는가?

원본 자료: 자바의신 2, p.230


🎓 종합 자기 점검 (1주차 졸업 시험)

각 질문에 막힘없이 답할 수 있다면 1주차는 합격이다.

OOP & 클래스

  1. C 구조체로 OOP를 흉내낼 수는 있지만 Java와 결정적 차이는 무엇인가?
  2. 클래스가 가져야 할 두 가지는?
  3. 자식 클래스에서 super(...) 를 명시적으로 호출해야 하는 경우는?
  4. 다형성에서 "형 변환을 해도 호출되는 건 원래 객체의 메서드"라는 말의 의미는?
  5. instanceof 검사를 가장 하위 자식부터 해야 하는 이유는?

SOLID

  1. SRP 위반 사례를 자기 코드에서 하나 찾아 설명해보라
  2. OCP를 인터페이스 없이 적용하는 것이 가능한가?
  3. LSP가 깨지면 다형성도 깨지는 이유는?
  4. DIP와 Spring의 DI는 어떤 관계인가?

JVM & GC

  1. Member m = new Member() 에서 m과 객체 본체는 각각 어디에 저장되는가?
  2. 자바에 pass by reference가 없다는 말의 정확한 의미는?
  3. 약한 세대 가설을 한 문장으로 설명해보라
  4. Eden → Survivor → Old로 객체가 이동하는 조건은?
  5. Mark-and-Sweep과 Mark-and-Compact의 차이는?
  6. G1 GC가 큰 Heap에 적합한 이유는?

데이터 구조

  1. String a = "abc"; String b = "abc"; 일 때 a == b 가 true인 이유는?
  2. 루프 안에서 String을 +로 합치면 무슨 일이 벌어지는가?
  3. ArrayList의 중간 삭제가 O(n)인 이유는?
  4. HashMap의 LoadFactor 0.75 의미는?
  5. TreeMap이 HashMap보다 느린 이유와, 그럼에도 쓰는 이유는?

I/O & 직렬화

  1. try 안에서 close()를 하면 무엇이 누수되는가?
  2. NIO가 전통 I/O보다 동시 접속에 유리한 이유는?
  3. transient를 비밀번호에 안 붙이면 어떤 보안 사고가 나는가?
  4. File보다 Files/Path 를 권장하는 두 가지 이유는?

📌 학습 운영 팁

각 Unit을 9-섹션 마스터 프롬프트로 깊이 파기

이 커리큘럼의 각 Unit은 9-섹션 마스터 프롬프트(세상 속 비유 → 탄생 배경 → 없으면 생기는 문제 → 해결책 → 내부 동작 → 실전 코드 → 주의사항 → 연관 개념 → 핵심 요약)로 확장 학습 가능하다.

특히 다음 Unit은 반드시 9-섹션으로 깊이 파는 걸 추천한다.

  • Unit 3.1 ~ 3.5 (SOLID 5원칙) — 면접 단골
  • Unit 4.2 (Pass by value) — 멘토 면담 대비 필수
  • Unit 5.2 ~ 5.3 (GC 동작 원리) — 실무 튜닝의 출발점
  • Unit 6.4 (HashMap 내부) — 면접 단골

Phase별 진도 체크리스트

[ ] Phase 1 — OOP 기초 패러다임 (Unit 1.1~1.2)
[ ] Phase 2 — 클래스 문법과 객체간 관계 (Unit 2.1~2.6)
[ ] Phase 3 — SOLID 5원칙 (Unit 3.1~3.5)
[ ] Phase 4 — JVM 메모리 모델 (Unit 4.1~4.2)
[ ] Phase 5 — GC 깊이 파기 (Unit 5.1~5.4)
[ ] Phase 6 — 데이터 다루기 (Unit 6.1~6.5)
[ ] Phase 7 — 외부 세계와의 통신 (Unit 7.1~7.4)
[ ] 종합 자기 점검 24문항 통과

ILIC 실무 연결 지점

각 Phase가 실무에서 만나는 지점을 미리 정리하면 학습 동기가 유지된다.

PhaseILIC 실무 연결
3 (SOLID)Service / Repository 분리, Strategy 패턴, Spring DI
4 (JVM)운영 서버 heap 사이즈 결정, OOM 분석
5 (GC)GC 로그 분석, 응답 지연 트러블슈팅
6 (Collections)DTO 매핑, 캐시 자료구조 선택
7 (I/O, Serialization)파일 업로드, Redis 세션, JPA Entity 직렬화
profile
Software Developer

0개의 댓글