ch16_참고최신문법과스레드
통합 문서입니다.
1. Java 최신 문법 개요
Java 최신 문법 개요
학습 목표
- 최근 Java 문법(
var,record, switch expression, pattern matching)의 의도를 이해할 수 있다. - 새 문법을 “짧은 코드”가 아니라 “명확한 코드” 관점으로 적용할 수 있다.
- 프로젝트 버전 호환성과 팀 코드 규칙을 함께 고려해 도입할 수 있다.
1. 최신 문법을 보는 관점
최신 문법 도입의 목적은 생산성보다 의도 전달력 향상이다.
- 불필요한 보일러플레이트 제거
- 오류 가능성 낮춘 안전한 문법 제공
- 데이터/분기 처리 표현력 개선
2. var (지역 변수 타입 추론)
var name = "Kim"; // String
var count = 10; // int
장점:
- 중복 타입 선언 감소
주의:
- 타입이 명확하지 않은 코드는 오히려 가독성 저하
- 필드/매개변수 타입에는 사용 불가
3. record (데이터 중심 타입)
public record User(long id, String name) {}
자동 생성:
- 생성자
- getter(컴포넌트 접근자)
equals/hashCode/toString
적합한 경우:
- 불변 데이터 전달 객체(DTO, 응답 모델)
4. switch 표현식
String grade = switch (score / 10) {
case 10, 9 -> "A";
case 8 -> "B";
default -> "C";
};
장점:
- 값 반환 구조 명확
- fall-through 실수 감소
5. 패턴 매칭
5.1 instanceof 패턴
if (obj instanceof String s) {
System.out.println(s.length());
}
5.2 switch 패턴(지원 버전 기준)
타입/패턴에 따른 분기를 간결하게 작성 가능.
6. 텍스트 블록
멀티라인 문자열 작성 가독성 향상.
String sql = """
SELECT id, name
FROM users
WHERE status = 'ACTIVE'
""";
SQL/JSON/HTML 템플릿 처리에 유용하다.
7. 컬렉션 팩토리 메소드
List<String> list = List.of("A", "B");
Map<String, Integer> map = Map.of("A", 1, "B", 2);
불변 컬렉션을 간결하게 생성 가능.
8. 도입 전략
- 프로젝트 JDK와 런타임 버전 일치 확인
- 팀 합의된 코딩 컨벤션 수립
- 파일 단위로 점진 도입
- 코드리뷰에서 가독성 이득 검증
9. 자주 하는 실수
var남용으로 타입 의도 숨김- switch 표현식을 기존 switch 습관으로 작성해 복잡화
- record를 엔티티/가변 객체에 무리하게 적용
- 버전 호환성 확인 없이 문법 사용
10. 정리
- 최신 문법은 문법 자체보다 설계 의도 전달을 위해 도입해야 한다.
- 프로젝트 표준 버전과 팀 가독성 규칙이 먼저다.
- “짧은 코드”보다 “명확하고 안전한 코드”가 도입 기준이다.
2. 멀티스레드
멀티스레드
학습 목표
- 스레드 생명주기와 동시성 문제(가시성/원자성/경쟁상태)를 이해할 수 있다.
ExecutorService, 동기화 도구, 원자 클래스 사용 기준을 설명할 수 있다.- 성능과 안정성을 함께 고려한 동시성 코드를 설계할 수 있다.
1. 스레드 기본
- 프로세스: 실행 중인 프로그램 단위
- 스레드: 프로세스 내부 실행 흐름 단위
멀티스레드는 병렬성/응답성을 높일 수 있지만,
공유 상태를 잘못 다루면 심각한 버그가 생긴다.
2. 생성 방식
2.1 Thread 직접 생성
Thread t = new Thread(() -> System.out.println("run"));
t.start();
2.2 ExecutorService (권장)
ExecutorService pool = Executors.newFixedThreadPool(4);
pool.submit(() -> doWork());
pool.shutdown();
실무에서는 스레드 생성/관리보다 풀 기반 실행이 기본이다.
3. 동시성 핵심 문제
- 경쟁 상태(Race Condition)
- 원자성(Atomicity) 붕괴
- 가시성(Visibility) 문제
- 순서 재배치(Reordering)로 인한 예상 밖 동작
4. 동기화 기법
4.1 synchronized
synchronized (lock) {
count++;
}
장점:
- 단순하고 직관적
주의:
- 락 경합 증가 시 성능 저하
4.2 Lock 계열
ReentrantLock으로 더 세밀한 제어(tryLock, 공정성 등) 가능.
4.3 원자 클래스
AtomicInteger ai = new AtomicInteger();
ai.incrementAndGet();
단순 카운터/플래그에는 원자 클래스가 효율적.
5. volatile 의미
volatile은 가시성을 보장하지만 복합 연산 원자성까지 보장하지 않는다.
volatile boolean running = true;
종료 플래그와 같은 단순 공유 상태에는 유용하지만
count++ 같은 연산에는 불충분하다.
6. ExecutorService/Callable/Future
ExecutorService pool = Executors.newFixedThreadPool(2);
Future<Integer> f = pool.submit(() -> 1 + 2);
int result = f.get();
pool.shutdown();
핵심:
- 작업 제출과 실행 분리
- 결과 비동기 수집
- 타임아웃/취소 가능
7. 스레드 안전 컬렉션
상황별 선택:
ConcurrentHashMap: 고성능 동시 맵CopyOnWriteArrayList: 읽기 많고 쓰기 적을 때- BlockingQueue: 생산자-소비자 패턴
8. 데드락/라이브락/기아
데드락 방지 원칙:
- 락 획득 순서 통일
- 락 범위 최소화
- 타임아웃 있는 락 시도
- 중첩 락 최소화
9. 실무 설계 원칙
- 공유 가변 상태 최소화
- 불변 객체 선호
- 작업 단위를 작게 분리
- 타임아웃/취소/종료 시나리오 설계
- 예외와 로그를 스레드 경계에서 명확히 처리
10. 테스트와 관측
동시성 버그는 재현이 어렵다.
전략:
- 반복 실행/스트레스 테스트
- 스레드 덤프 분석
- 메트릭(큐 길이, 처리시간, 대기시간) 수집
11. 정리
- 멀티스레드의 핵심은 빠르게 만드는 것이 아니라 안전하게 만드는 것이다.
ExecutorService + 동기화 전략 + 공유 상태 최소화가 실무 기본 조합이다.- 가시성/원자성/순서 문제를 명확히 이해해야 동시성 버그를 줄일 수 있다.
3. 최신문법과 스레드 학습 가이드
최신 문법과 스레드 학습 가이드
문서 목적
- 최신 Java 문법과 동시성 주제를 연결해 실무 적용 관점을 제공한다.
- “문법 개선”과 “안정성 확보”를 함께 고려하는 학습 로드맵을 제시한다.
1. 왜 함께 학습해야 하는가
최신 문법은 코드 표현력을 높이고,
멀티스레드는 시스템 안정성을 결정한다.
즉:
- 문법은 생산성/가독성
- 동시성 설계는 신뢰성/성능
둘을 분리하면 실제 서비스 코드 품질이 떨어질 수 있다.
2. 권장 학습 순서
- 최신 문법 핵심(
var,record, switch expression, pattern matching) - 람다/스트림과 결합해 선언형 코드 작성
- 스레드 생명주기와 공유 상태 문제 이해
ExecutorService, 동기화, 원자 클래스 실습- 실무 시나리오(예: 비동기 주문 처리) 통합 구현
3. 통합 설계 관점
예시: 주문 처리 시스템
- 요청/응답 DTO는 record로 간결화
- 검증/변환은 함수형 스타일로 파이프라인 처리
- I/O 작업은 스레드 풀로 비동기 처리
- 공유 캐시는 동시성 컬렉션 사용
- 예외/타임아웃/취소 정책 명시
4. 코드 품질 체크포인트
- 새 문법이 실제로 가독성을 높이는가?
- 스레드 코드에서 공유 상태 접근 규칙이 명확한가?
- 예외/취소/종료 경로가 설계되어 있는가?
- 테스트에서 시간/스레드 의존성을 통제하는가?
5. 실무 도입 전략
- JDK 버전 표준화
- 팀 컨벤션 문서화 (
var사용 기준 등) - 모듈 단위 점진 도입
- 코드리뷰에서 “짧음”이 아닌 “명확성” 검증
6. 정리
- 최신 문법과 멀티스레드는 연결된 주제다.
- 문법은 개발 속도를, 동시성 설계는 서비스 신뢰성을 만든다.
- 최종 목표는 “화려한 문법”이 아니라 “예측 가능한 시스템”이다.
4. 문제
문제
ch16 범위(최신 문법 + 멀티스레드) 종합 문제입니다.
A. 최신 문법
record User(long id, String name)를 정의하고 사용하시오.- switch 표현식으로 주문 상태 코드를 메시지로 변환하시오.
instanceof패턴 매칭으로 타입별 분기 코드를 작성하시오.- 텍스트 블록으로 멀티라인 SQL 문자열을 작성하시오.
B. var/가독성
- 기존 명시 타입 코드를
var로 리팩터링하시오. var가 가독성을 해치는 예를 찾아 다시 명시 타입으로 수정하시오.- 팀 컨벤션 기준(사용해도 되는 곳/금지할 곳)을 작성하시오.
C. 스레드 기초
Runnable기반 스레드 2개를 실행하고join으로 종료를 기다리시오.ExecutorService고정 스레드 풀로 작업 10개를 실행하시오.Callable/Future로 비동기 계산 결과를 수집하시오.
D. 동시성 제어
- 공유 카운터를
synchronized로 안전하게 증가시키시오. - 동일 기능을
AtomicInteger로 다시 구현하시오. volatile플래그로 스레드 종료 제어를 구현하시오.
E. 동시성 문제 재현
- 동기화 없는 카운터 증가에서 race condition을 재현하시오.
- 락 순서가 엇갈리는 데드락 코드를 만들고 해결하시오.
- 타임아웃 있는 락 시도로 무한 대기를 방지하시오.
F. 통합 챌린지
- 주문 처리 큐를 구현하시오.
- Producer: 주문 생성
- Consumer: 스레드풀에서 처리
- 실패 시 재시도/로그
- 최신 문법(record/switch 패턴)을 일부 적용해 코드 가독성을 개선하시오.
- 처리량/실패율/평균지연 메트릭을 출력하시오.
제출 체크리스트
- 최신 문법 적용이 실제로 가독성을 높였는가?
- 공유 자원 접근 규칙이 명확한가?
- 스레드 종료/예외/타임아웃 처리가 포함되었는가?
- race condition을 재현하고 해결까지 검증했는가?