728x90
반응형

📚 목차

  1. 이게 왜 중요한데?
  2. 표 하나로 비교 끝!
  3. 언제 뭘 써야 하나요?
  4. 마무리 요약 (진짜 1분 컷)

1. 이게 왜 중요한데?

자바 개발하면서 List, Set, Map 구분 못 하면...
👉 NullPointerException, IndexOutOfBoundsException, 동기화 오류
줄줄이 터집니다.
그럼 PM이 와서 말하죠:

“그거... 그냥 ArrayList 말고 HashSet 쓰면 안 되나?”


2. 표 하나로 비교 끝! ✅

구분ListSetMap
중복 허용 ✅ O ❌ X ✅ Value만 O
순서 유지 ✅ O ❌ X (HashSet), ✅ TreeSet은 정렬됨 ❌ X (정렬 불가)
인덱스로 접근 ✅ O (get(index)) ❌ X ❌ X
Key-Value 구조 ❌ X ❌ X ✅ O
대표 클래스 ArrayList, LinkedList HashSet, TreeSet HashMap, TreeMap
 

3. 언제 뭘 써야 하나요?

상황추천 컬렉션
데이터 순서 유지 + 중복 허용 ArrayList
중복 없이 빠르게 저장 HashSet
정렬된 데이터 필요 TreeSet, TreeMap
Key로 조회 필요 HashMap
삽입/삭제가 많음 LinkedList
 

4. 마무리 요약 (1분 컷 핵심)

List<String> list = new ArrayList<>(); // 순서 O, 중복 O
Set<String> set = new HashSet<>();     // 순서 X, 중복 X
Map<String, String> map = new HashMap<>(); // Key-Value

📌 기억법:

  • List: 줄세우기 좋아함
  • Set: 중복 싫어함
  • Map: Key로 놀고 Value로 살고
728x90
728x90
반응형

JVM은 자바(Java)의 핵심이라 해도 과언이 아닙니다.
우리가 작성한 자바 코드가 어떻게 실행되는지,
플랫폼 독립성이 어떻게 보장되는지,
모든 답은 JVM에 있습니다.

이 글에서는 JVM이 무엇인지, 내부 구성 요소는 무엇이며,
왜 Java가 JVM 덕분에 강력한 언어인지 쉽게 정리해드립니다.

☕ JVM이란?

JVM (Java Virtual Machine) = 자바 가상 머신

자바 프로그램을 실행하는 엔진이자,
"한 번 작성하면 어디서나 실행된다 (Write Once, Run Anywhere)"라는 자바 철학을 실현해주는 핵심 기술입니다.


🔧 무슨 일을 할까?

JVM의 핵심 역할은 딱 하나:

컴파일된 .class 바이트코드 파일을 실행하는 것

즉, 우리가 작성한 .java 소스 코드는 **JDK의 컴파일러(javac)**에 의해 .class라는 바이트코드로 바뀌고,
이 바이트코드를 운영체제에 맞게 해석해서 실행하는 주체가 바로 JVM입니다.


🔍 JVM 내부 동작 구조 요약

[.class 파일]
      ↓
 Class Loader → 메모리에 로딩
      ↓
 Bytecode Verifier → 유효성 검사
      ↓
 Execution Engine → 실행 (JIT 컴파일 포함)
      ↓
 Native Code → 실제 OS에서 동작

📦 구성 요소 간단 설명

구성 요소역할
Class Loader 클래스 파일 메모리에 로드
Execution Engine 바이트코드 해석 & 실행
JIT Compiler 바이트코드를 네이티브 코드로 동적 변환
GC (Garbage Collector) 불필요한 객체 메모리 자동 정리
Runtime Data Area 메모리 공간 (Heap, Stack 등)
 

🤔 JVM이 왜 중요한가요?

  • 플랫폼 독립성: 같은 자바 프로그램이 Windows, Linux, macOS에서 실행 가능
  • 메모리 관리 자동화: GC 덕분에 개발자가 직접 메모리 해제할 필요 없음
  • 보안성: 바이트코드 검사 및 제한된 실행 환경 제공

📌 용어 간 관계 정리

용어설명
JDK 자바 개발 도구 세트 (JRE + 컴파일러 포함)
JRE 실행 환경 (JVM + 라이브러리)
JVM 실제 실행기 (JRE 내부에 있음)

 

728x90
728x90
반응형

✅ 한눈에 보는 차이표

구성 요소설명포함 관계주요 역할
JDK (Java Development Kit) 자바 개발 도구 전체 세트 JDK ⊃ JRE ⊃ JVM 개발 + 실행
JRE (Java Runtime Environment) 자바 실행 환경 JRE ⊃ JVM 실행만 가능
JVM (Java Virtual Machine) 자바 가상 머신 (실행 엔진) JRE ⊃ JVM 바이트코드 실행
 

🔍 1. JVM (Java Virtual Machine)

“Write once, run anywhere”를 실현시키는 핵심”

  • 역할: .class 파일(바이트코드)을 실행
  • 동작:
    1. Class Loader: 클래스를 메모리에 로딩
    2. Bytecode Verifier: 코드 검증
    3. Execution Engine: 코드 실행 (JIT 컴파일 포함)
  • OS/환경별로 다름: 각 OS에 맞는 JVM이 존재

🔸 JVM만으로는 자바 코드 작성 불가


🔍 2. JRE (Java Runtime Environment)

“자바 프로그램을 실행할 수 있는 환경”

  • 구성:
    • JVM
    • 자바 클래스 라이브러리(rt.jar)
    • 필요한 기타 실행파일 (예: java 명령어)
  • 목적: 자바 프로그램 실행만 가능 (컴파일 ×)
  • 대상: 자바 개발이 아닌 실행만 필요한 사용자 (예: 서버 운영자)

🔸 개발 도구 없음 (javac X)


🔍 3. JDK (Java Development Kit)

“자바를 개발하기 위한 모든 도구 포함”

  • 구성:
    • JRE
    • 개발 툴 (javac, javadoc, jar 등)
  • 역할: 자바 소스 코드를 작성, 컴파일, 디버깅 가능
  • 대상: 자바 개발자

🔸 JDK 설치하면 JRE, JVM 포함

[JDK]
 └── [JRE]
       └── [JVM]

🧠 쉽게 외우는 포인트

외우는 방법
JVM은 바이트코드를 실행하는 엔진
JRE는 JVM + 실행 라이브러리 = 실행 환경
JDK는 JRE + 개발 도구 = 개발 키트
 

🎯 개발자 입장에서 요약

  • 자바 코드 작성 ➡️ JDK 필수
  • 자바 앱 실행만 ➡️ JRE만 설치해도 가능
  • 바이트코드 실행 책임자 ➡️ JVM

 

728x90
728x90
반응형

오늘은 백엔드 개발할 때 "어떤 자바 버전 쓰면 좋을까?"에 대한 내용을 쉽게 정리해봤어요.

요즘도 Java 8 쓰는 데가 있다는데… 진짜일까요? 최신 버전은 어떤 걸까요?


✅ 자바 버전, 한눈에 요약!

순위자바 버전특징 & 상황
1위 Java 11 (LTS) 대기업, 공공기관, SI의 국민템! 안정성과 호환성 짱.
2위 Java 8 (LTS) 아직도 많이 쓴다! 레거시 프로젝트에 필수.
3위 Java 17 (LTS) 요즘 Spring Boot 3.0+는 거의 이걸 씀. 모던 개발 스타일
4위 Java 21 (최신 LTS) 새로운 프로젝트라면 이게 최고! Loom(가상 스레드) 기대주.
 

🥇 Java 11 – 지금도 가장 널리 쓰이는 LTS

  • 출시: 2018년
  • 특징:
    • 안정성 최고
    • Java 8보다 진보된 기능 탑재
    • 기업이 제일 많이 채택 중
  • 💡 나도 Spring Boot 2.7 개발할 땐 이거 썼어요.

🥈 Java 8 – 고인물이지만 무시 못함

  • 출시: 2014년
  • 특징:
    • 스트림, 람다식 도입으로 한 획 그었죠
    • 하지만 이제는 조금씩 퇴장 중
    • 아직 공공기관이나 SI에서 자주 나옴

🥉 Java 17 – 스프링 부트 3.0의 짝꿍

  • 출시: 2021년
  • 특징:
    • Records, Sealed class 같은 최신 문법 가능
    • Spring Boot 3.0부터 이걸 기본으로 삼아요
    • JDK 8~11 벗어나고 싶다면 이게 무난함

🌟 Java 21 – 최신이자 미래형 자바

  • 출시: 2023년
  • 특징:
    • Virtual Threads (비동기 개발에 짱)
    • Unnamed classes, String templates
    • JDK 업데이트 정책이 빠르게 도는 요즘, Java 21은 미래 대비로 GOOD
  • ⚠ 단점: 일부 라이브러리 호환성은 확인 필요

🚫 Java 22 이상은요?

  • LTS(장기지원)가 아님
  • 테스트, 실험용으로는 좋지만 기업은 아직 관심 없음

✍️ 결론 – 어떤 버전을 써야 할까?

👉 신규 프로젝트: Java 17 또는 Java 21
👉 레거시/기관 시스템 유지보수: Java 8 또는 Java 11
👉 Spring Boot 3.x 사용: Java 17 이상 필수!


🔧 개인적인 팁!

  • 저는 요즘 모든 프로젝트를 Java 21 + Spring Boot 3.2로 짭니다.
  • 이유? 미래 대비 + 테스트 성능 + Swagger 호환성까지 굿!

📌 마무리 요약

🔹 Java 11은 국민 표준
🔹 Java 17/21은 미래 지향적 선택
🔹 Java 8은 아직도 현실에서 존재함
🔹 최신 Spring Boot는 17 이상 필수!


👉 도움이 되셨다면 공감 + 댓글 부탁드려요 😊

 

 

728x90
728x90
반응형

자바 개발자라면 꼭 알고 있어야 하는 GC(Garbage Collector)!
객체는 언제 메모리에서 사라지고, 애플리케이션이 왜 가끔씩 멈추는지 궁금하셨나요?
아래 이미지와 함께 GC의 작동 구조를 쉽게 설명해드립니다.


🔍 GC 개념 요약

**Garbage Collector(GC)**는 사용하지 않는 객체를 힙 메모리에서 자동으로 제거하는 JVM의 기능입니다.
메모리 누수를 방지하고 개발자가 직접 메모리를 관리하지 않아도 되게 해주는 아주 고마운 기능이죠.


🧠 Java 힙 메모리 구조

아래 이미지는 자바 힙(Heap) 메모리의 구성과 객체 이동 과정을 시각적으로 표현한 구조입니다.

✅ 설명:

  • 객체는 먼저 Eden 영역에 생성됩니다.
  • GC(Minor GC)가 발생하면 Eden → Survivor1 → Survivor2를 오가며 살아남습니다.
  • 여러 번 살아남으면 Old 영역으로 이동합니다.
  • Old가 꽉 차면 **Major GC (또는 Full GC)**가 발생합니다.
  • Permanent(또는 Java 8 이후 MetaSpace)는 클래스 정보 등 JVM 메타데이터를 저장하는 공간입니다.

💥 GC의 종류

GC 종류대상 영역특징
🧹 Minor GC Young Generation (Eden + Survivor) 빠르고 자주 발생함
🧹 Major GC Old Generation 느리고 멈춤(STW)이 발생함
🧹 Full GC 전체 힙 영역 Major GC 포함 + 기타 리소스 정리
 

🛑 STW(Stop The World)란?

GC를 수행하는 동안 JVM의 모든 스레드가 멈추는 현상입니다.
특히 Major GC나 Full GC 시 STW가 발생하며 사용자 체감 지연이 생길 수 있습니다.

📌 GC 튜닝의 핵심: STW 시간을 최소화하는 것!


⚙ 대표적인 GC 알고리즘

GC 종류특징적합 환경
Serial GC 단일 스레드, 기본 구조 저사양/테스트용
Parallel GC 멀티스레드 병렬 처리 일반 서버, 병렬 CPU
Parallel Old GC Old까지 병렬 처리 고사양 서버
G1 GC Region 단위 처리, STW 최소화 Java 9 이상 대규모 앱
ZGC/Shenandoah 실시간 GC, STW 거의 없음 실시간 처리 시스템
 

🧰 개발 팁 요약

  • 객체는 가능한 빨리 Eden에서 제거되도록 설계하자
  • Old로 가는 객체는 재사용하거나 Pool 처리가 바람직
  • GC 튜닝 시에는 G1 GC, ZGC 등 최신 GC 전략 고려

✅ 마무리

GC는 Java의 강력한 장점 중 하나지만,
그 내부 동작을 모르면 애플리케이션 지연이나 STW 문제를 겪기 쉽습니다.
이제 GC 동작 구조를 알았으니, 메모리 튜닝과 성능 최적화에 자신감이 붙으실 겁니다!

728x90
728x90
반응형

🔎 접근자(Accessor)란?

객체 지향 프로그래밍(OOP)에서는 객체가 가진 **프로퍼티(속성)**에 직접 접근하기보다,
메서드를 통해 안전하게 접근하는 것을 권장합니다.
이때 사용하는 메서드가 바로 **접근자(Accessor)**입니다.


✅ 접근자가 필요한 이유

user.name = "Steve";  // ❌ 직접 접근

이처럼 필드에 직접 접근하게 되면:

  • 데이터 무결성을 보장할 수 없고,
  • 나중에 로직을 추가하거나 디버깅하기 어려워집니다.

→ 그래서 우리는 GetterSetter를 통해 간접 접근을 유도합니다.


🧩 Getter / Setter 정의

  • Getter: 특정 속성 값을 읽을 때 사용
  • Setter: 특정 속성 값을 변경할 때 사용

✅ Java 예시

public class User {
    private String name;
    private int age;

    // Getter
    public String getName() {
        return name;
    }

    // Setter
    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

→ 위와 같이 getName(), setName() 메서드를 통해
외부에서 안전하게 name 필드를 조회/수정할 수 있습니다.


📚 정리

역할이름예시
값 읽기 Getter getName()
값 설정 Setter setName("Steve")
 

접근자는 객체 캡슐화의 핵심이며,
이 원칙을 지킴으로써 객체의 상태를 안정적으로 관리할 수 있습니다.

728x90
728x90
반응형

Java에서 자주 마주치는 static 키워드, 정확히 어떤 역할을 하고 어떻게 동작할까요?
이번 포스트에서는 static 키워드의 메모리 구조, 특징, 사용 예시까지 한 번에 정리해 드립니다.


✅ static이란?

  • static은 클래스 로딩 시 메모리에 한번만 할당되고,
    프로그램이 종료될 때까지 공유되고 유지되는 자원입니다.
  • 객체를 생성하지 않아도 클래스명으로 직접 접근할 수 있다는 것이 특징입니다.

🧠 static의 메모리 구조

구분메모리 영역설명
클래스 자체 Method Area (static 영역) 클래스 정보 로드
new 생성 객체 Heap 영역 Garbage Collector 관리 대상
static 변수/메서드 Method Area (static 영역) 프로그램 종료 시까지 유지
 

🔸 static은 GC의 대상이 아니며, 모든 인스턴스가 공유합니다.


📌 static 변수/메소드 특징

  • 클래스 변수 (모든 객체가 공통으로 사용)
  • 객체 생성 없이도 사용 가능 (클래스명.변수, 클래스명.메서드)
  • 자주 사용하면 메모리 누수 위험 존재 (GC가 해제하지 않음)

✅ Java 코드 예시

public class Calculator {
    public static String calName = "myBoard";

    public static int add(int x, int y) {
        return x + y;
    }

    public int min(int x, int y) {
        return x - y;
    }
}

☑ 사용 예시

Calculator.add(5, 1);  // ✅ 객체 없이 사용 가능
Calculator.min(5, 1);  // ❌ 오류 (static 아님)

Calculator cal = new Calculator();
cal.add(5, 1);  // 가능은 하지만 ❗비권장
cal.min(5, 1);  // 정상 사용

⚠ static 사용 시 주의사항

  • 전역 상태처럼 작동하므로 남용 시 테스트 어려움, 의존성 증가
  • 웹 서버 환경에서는 동시성 이슈 발생 가능성
  • 주로 공용 유틸성 클래스 또는 상수 선언에 사용
728x90
728x90
반응형

📌 목차

  1. 프로그램이란?
  2. 프로세스란?
  3. 스레드란?
  4. 자바 스레드의 개념
  5. 스레드 사용 시 주의사항

1. 프로그램 (Program)

  • 사전적 의미: 어떤 작업을 위해 실행 가능한 파일
  • .exe, .jar, .py 등 사용자가 실행시킬 수 있는 상태
  • 아직 메모리에 올라가지 않은 정적인 상태

2. 프로세스 (Process)

메모리에 적재되어 실행되고 있는 프로그램의 인스턴스

✅ 정의

  • 운영체제로부터 CPU 시간, 메모리 등 시스템 자원을 할당받은 실행 단위
  • 하나의 독립된 개체로서 **자신만의 주소 공간과 메모리 구조(Code/Data/Stack/Heap)**를 가짐

✅ 주요 특징

  • 프로세스는 독립된 주소 공간을 사용
  • 기본적으로 프로세스마다 1개 이상의 스레드 포함
  • 다른 프로세스와 자원 공유 ❌ (단, IPC(Inter-Process Communication) 이용 가능)
🧱 프로세스 메모리 구조
┌────────┐
│  Code  │ ← 실행 코드
│  Data  │ ← 정적 변수
│  Heap  │ ← 동적 할당 객체
│  Stack │ ← 함수 호출/지역변수 (스레드별)
└────────┘

 


3. 스레드 (Thread)

프로세스 내부에서 실행되는 흐름의 최소 단위

✅ 정의

  • 하나의 프로세스 내에서 여러 작업을 동시에 처리할 수 있는 실행 흐름
  • 프로세스의 **자원(Code/Data/Heap)**을 공유하지만,
    스택(Stack)과 레지스터는 스레드별로 독립적

✅ 주요 특징

  • 스레드는 **경량 프로세스(Lightweight Process)**라고 불림
  • 같은 프로세스 내 스레드 간에는 메모리 공유 → 속도 빠름, 통신 쉬움
  • 메모리 공유로 인한 경합 조건(race condition) 발생 가능성 있음
 
📌 스레드는 같은 Heap 공유
⟶ 스택은 독립, 힙은 공유

 


4. 자바 스레드 (Java Thread)

✅ 자바 스레드 개요

  • JVM이 운영체제처럼 스레드를 관리
  • 자바는 프로세스 개념 없음, 오직 스레드만 있음
  • JVM 내부에서 스레드는 다음을 관리:
    • 총 스레드 수
    • 각 스레드의 메모리 주소
    • 스레드 상태 (NEW, RUNNABLE, BLOCKED 등)
    • 우선순위

✅ 자바 스레드의 실행 흐름 예시

public class MyThread extends Thread {
    public void run() {
        System.out.println("스레드 실행 중!");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread t = new MyThread();
        t.start(); // JVM에 실행 요청
    }
}

5. 스레드 사용 시 주의사항

⚠️ 동기화 문제(Synchronization)

  • 멀티 스레드 환경에서는 같은 자원에 동시 접근하면 충돌 가능
  • 이를 방지하기 위해 동기화(synchronized) 키워드 사용
  • 예시:
synchronized void increaseCounter() {
    counter++;
}
728x90

+ Recent posts