🔥
1. Java 버전 특징 & 변화 포인트
자바는 장기 지원(LTS) 버전 중심으로 생태계가 굴러가고, 버전이 올라갈수록 “더 간단하고, 더 빠르고, 더 안전하게”라는 방향으로 진화함.
✔ Java 8 (2014)
- 람다(lambda) 도입 → 함수형 스타일 지원
- Stream API → 컬렉션 처리 패턴 대폭 간소화
- Optional → NPE 줄이기
- Interface default 메서드
- 대부분의 프레임워크가 Java 8 기반 가이드를 오~래 유지함.
✔ Java 11 (2018, LTS)
- var 지역 변수 타입 추론 → 코드 짧아짐
- String API 강화
- HTTP Client 표준화 (기존 HttpURLConnection을 대체하는 현대식 API)
- 모듈 시스템(Java 9) 이후 영향 있음.
- 이제 대부분의 기업/서비스가 Java 11 기준으로 마이그레이션 완료.
✔ Java 17 (2021, LTS)
- record 공식 도입 → 불변 데이터 클래스를 초간단 방식으로 선언
- Sealed classes → 상속 제어
- Switch 패턴 매칭 개선
- GC 개선(ZGC, G1 튜닝) → 성능/지연시간 향상
- 현대 프레임워크(Spring Boot 3.x 등)는 Java 17 이상을 요구.
✔ 그 외 기술과 버전 연관
-
QueryDSL
- Java 8 이상이면 기본 사용 가능.
- Java 17에서 annotation processing 환경이 좀 더 안정됨.
-
record
- Java 16 프리뷰 → Java 17 정식
- DTO, Value Object 만들 때 압도적으로 깔끔함.
2. Java 8, 11, 17의 핵심 차이 요약
| 항목 | Java 8 | Java 11 | Java 17 |
|---|
| 릴리즈 | 2014 | 2018 LTS | 2021 LTS |
| 핵심 변화 | 람다, 스트림 | var, HttpClient | record, sealed, 패턴 매칭 |
| 생태계 지원 | 오래된 레거시 많이 사용 | 기업 표준 | 최신 프레임워크 표준 |
| 실행 성능 | 상대적 느림 | 개선 | GC/성능 대폭 향상 |
| 사용 용도 | 레거시, 옛 프로젝트 | 대부분의 실무 | 신규·현대적 프로젝트 |
3. JDK vs JRE 차이
개발 첫 주차에도 자주 헷갈리는 파트.
✔ JDK (Java Development Kit)
- 자바 개발 도구 full package
- 컴파일러(javac), javadoc, 디버거 포함
- 즉, 개발하려면 JDK 필요함.
✔ JRE (Java Runtime Environment)
- 실행만 할 수 있는 환경
- JVM + 표준 라이브러리 포함
- 컴파일 기능 없음 → 실행만 가능
요약 = 개발자면 무조건 JDK만 신경 쓰면 됨
(요즘은 JRE 단독 배포를 거의 안 함)
4. Call by Value vs Call by Reference (자바 관점!)
여기서 자바는 일관되게 call by value다.
근데 ‘참조값을 value로 넘기기 때문에’ 종종 오해가 생김.
✔ Call by Value
값을 복사해서 넘김.
자바의 모든 지역 변수 전달 방식.
✔ 자바는 이렇게 동작함
즉,
"객체의 내부 상태는 바뀌지만, 객체 자체를 바꾸면 바깥에 반영되지 않는다."
5. 자바 직렬화 (Serialization)
✔ 개념
- 객체를 바이트 스트림으로 변환하는 과정
- 파일로 저장하거나, 네트워크 전송할 때 사용 가능
✔ 방법
implements Serializable
ObjectOutputStream, ObjectInputStream으로 읽고 쓰기
✔ BUT! 실무에서는 거의 비추천
- 성능 나쁨
- 유지보수 어려움 (serialVersionUID 관리)
- 이식성 떨어짐
- 보안 위험(임의 객체 주입 가능)
그래서 요즘은:
- JSON 직렬화 (Jackson, Gson)
- ProtoBuf, Avro
처럼 대체 방식을 사용함.
6. instanceof란?
✔ 역할
- 객체가 특정 클래스/인터페이스 타입인지 확인할 때 사용
- “이 객체 타입 맞아?” 를 체크하는 연산자
✔ 사용 예
if (obj instanceof String s) {
System.out.println(s.toUpperCase());
}
Java 16+에서는 패턴 매칭 지원 so 더 깔끔해짐.