자바 기본 & 자바 객체 지향

동동주·2025년 11월 20일

jscode 자바 스터디

목록 보기
1/5

🔥

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 8Java 11Java 17
릴리즈20142018 LTS2021 LTS
핵심 변화람다, 스트림var, HttpClientrecord, 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

값을 복사해서 넘김.
자바의 모든 지역 변수 전달 방식.

✔ 자바는 이렇게 동작함

  • 기본 타입(int, long …) → 실제 값이 복사됨

  • 참조 타입(Object) → 객체 주소값이 복사되어 전달됨

    • 그래서 메서드 안에서 필드를 바꾸면 바깥 객체에도 반영
    • 하지만 참조 자체를 다른 객체로 바꿔도 원본 참조에는 영향 없음

즉,

"객체의 내부 상태는 바뀌지만, 객체 자체를 바꾸면 바깥에 반영되지 않는다."


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 더 깔끔해짐.

0개의 댓글