본문 바로가기

[JAVA] 나 자바 개고수인데 자바 장점 알려준다

@Salieri2026. 2. 6. 12:06

 

 앞서 말했듯, JAVA 는 C++ 나 C와는 달리 자체적인 Garbage Collector가 계속해서 따라오면서 당신의 메모리 사용, 그러니까 C++ 에서 짜증낫던, malloc, ptr * &&의 사용을 줄여준다. 이로 인해, 각기 장단점이 존재하는데 메모리 사용을 접근해서 "내 맘대로 " 디자인은 불가능하다. (사실 C++ 까지가서 메모리 사용까지 하겟다는 것은 GigaChad 개발자임 ㅇㅇ) 나 같은 범부는 Java 의 multithread 를 능력 활용하면된다 

 

 

 

젠장 ` ~ ~ 또 도황이야

 

 

 

 


1. Java Thread란?

 

앵 이거 돈키호테 플라밍고 아니냐? 

 

 

 자바 애플리케이션 내에서 병렬로 실행되는 작업의 단위를 말한다. 하나의 프로세스(실행 중인 프로그램) 안에서 여러 개의 스레드가 동시에 실행되어 작업을 처리할 수 있다. 

 

  • 프로세스 (Process): 도플라밍고 본체 (실행 중인 프로그램 그 자체).
  • 스레드 (Thread): 도플라밍고가 손가락에서 뽑아낸 '실' 한 가닥

도플라밍고가 여러 개의 실을 동시에 조종하여 한쪽에서는 '기생실'로 사람을 조종하고, 다른 쪽에서는 '오색실'로 적을 공격하듯이, 하나의 프로세스(도플라밍고) 안에서 여러 개의 스레드(실)가 동시에 각기 다른 작업을 처리하는 것을 멀티 스레딩이라고 한다

 

사실, 더 깊게 들어가면 System Engineer 가 하는 Process 과정에 대한 이해도랑 원론적으로는 같아서..., 왜 마인크래프트 공장이나 아니면 폴아웃에서 공장같은거 만드시는 분들이 Java Thread 자원관리도 잘함 

 

 

"도 황" 은 JAVA 인 것이지....

 

 

이건 참을 수 없지, 바로 물어본다 

 

?? 이 왜진?

 

아무튼, 우리의 돈키호테 플라밍고의 "실 실" 열매에 대한 이해가 깊게 되어있다면, Java Thread 의 이해가 되는 것이니, I/O 관련의 이해도를 높이는 것이 가능하다는 소리가 되겟다. 

 

 

2. 그렇다면 ? 

블랙 나이트 (영기사) 스레드 생성 (new Thread) 도플라밍고가 실로 자신과 똑같은 분신을 만들어 본체와 별개로 싸우게 합니다.


→ 메인 스레드(본체)가 멈추지 않고, 별도의 작업 스레드(분신)를 생성해 동시에 일을 처리하는 것과 완벽히 같습니다.
기생실 (패러사이트) 스레드 스케줄링 (Scheduling) 보이지 않는 실로 타인을 조종합니다.


→ OS(운영체제) 스케줄러가 보이지 않는 손처럼 각 스레드에게 CPU 시간을 할당하고 제어하는 모습입니다.
새장 (버드케이지) 교착 상태 (Deadlock) 돔 형태의 실이 수축하며 안의 사람들을 가두고 통신을 차단합니다.


→ 잘못된 설계로 스레드들이 자원을 붙잡고 서로 놔주지 않아, 프로그램 전체가 멈추고 아무것도 할 수 없는 치명적인 상태입니다.
각성
(Awakening)
가상 스레드 (Virtual Threads) 주변의 건물과 땅까지 모조리 실로 바꿔버리는 압도적인 물량 공세입니다.


→ JDK 21의 가상 스레드는 OS 자원의 제약을 넘어 수백만 개의 스레드를 생성해 주변 환경(서버) 전체를 스레드로 뒤덮어 처리하는 '각성' 상태입니다.
갓 스레드 (신 주살) 임계 영역 (Critical Section) 최고의 공격력을 가진 16발의 성스러운 흉탄입니다.


→ 시스템 리소스를 가장 많이 점유하거나, 데이터의 무결성이 지켜져야 하는 가장 중요하고 민감한 작업 영역을 의미합니다.

 

 

돈키호테 기술이랑 Java Thread 를 서로 연관되어 있게 예시를 들어서 설명해줘 하니까 나옴

 

도황은 정말 JAVA 를 잘 알려주는 구나 

 

 

 

 

3. 스레드 생성 방법 (기본)

A. Thread 클래스 상속 (블랙 나이트 생성) :: 

class MyThread extends Thread {
    public void run() {
        System.out.println("분신(Thread)이 독자적으로 행동합니다.");
    }
}
// 실행: new MyThread().start();

B. Runnable 인터페이스 구현 (권장)

자바는 다중 상속이 불가능하므로, 인터페이스인 Runnable을 구현하는 것이 확장성 면에서 유리함

class MyRunnable implements Runnable {
    public void run() {
        System.out.println("Runnable 명령을 수행합니다.");
    }
}
// 실행: new Thread(new MyRunnable()).start();

C. 람다식 사용 (Java 8+, 가장 간결함) 

Thread thread = new Thread(() -> {
    System.out.println("간결한 람다식으로 분신 생성");
});
thread.start();

 

4. Java Thread의 장단점

장점 (Pros)

  1. 성능 향상 (멀티 태스킹): 도플라밍고가 본체는 루피와 싸우면서 분신으로 로를 공격하듯, I/O 작업 중에도 CPU가 쉬지 않고 다른 일을 처리한다.
  2. 응답성 향상: 무거운 작업을 별도 스레드(분신)에게 맡기면, 메인 스레드(본체)는 사용자 입력에 즉각 반응할 수 있습니다. 

단점 (Cons)

  1. 새장(Deadlock)의 위험: 스레드끼리 자원을 공유하다가 서로 엉키면 프로그램이 '새장'에 갇힌 듯 멈춰버립니다.
  2. 복잡성 증가: 실이 많아질수록 꼬이기 쉽듯이, 디버깅이 매우 어렵고 예기치 못한 버그(Race Condition)가 발생할 수 있습니다.

5. 실무 사용 패턴 (Modern Java)

실무에서는 new Thread()를 남발하지 않고 체계적으로 관리함

 

 

(new Thread() 를 써서 새로운 Thread 를 사용하는 것도 좋지만, 기본적으로 JAVA 나 프로그래밍을 하는데 있어서 마음가짐은, "보급 잘안나오는 행보관 마인드" 로 해야)

1. ExecutorService (스레드 풀)

  • 개념: 미리 정해진 수의 '패밀리 간부'들만 운영하는 방식입니다. 무한정 늘어나는 것을 막습니다.
// 간부 5명(스레드 5개) 고정 (나머지 작업은 대기열 Queue에서 대기)
ExecutorService executor = Executors.newFixedThreadPool(5);

for (int i = 0; i < 10; i++) {
    int taskId = i;
    executor.submit(() -> {
        System.out.println(Thread.currentThread().getName() + "가 작업 " + taskId + " 처리 중");
    });
}
executor.shutdown();

2. Virtual Threads (Java 21+ 각성 모드)

  • 개념: 도플라밍고의 '각성' 단계입니다.
    • OS 스레드(물리적 한계)에 묶이지 않고 JVM 내부에서 가볍게 처리되므로 100만 개의 실(스레드)을 동시에 다룰 수 있습니다.

<!-- end list -->

// 각성 상태: 일반 스레드였다면 메모리 부족(OOM)으로 붕괴했을 작업을 가볍게 처리
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    IntStream.range(0, 10_000).forEach(i -> {
        executor.submit(() -> {
            System.out.println("가상 스레드 공격: " + i);
        });
    });
}

6. 주의: 동기화 (Thread Safety)

여러 실이 엉키지 않게 교통정리를 하는 것이 필수적입니다.

문제 상황 (Race Condition)

int hp = 100;
// 분신 A와 분신 B가 동시에 hp를 깎으면 계산이 꼬여서 제대로 데미지가 안 들어감

해결책: synchronized (무장색 패기 방어)

한 번에 하나의 실만 통과하도록 단단하게 방어(Lock)합니다.

public synchronized void damage() { // 🔒 임계 영역 진입 (Lock)
    hp -= 10; // 한 번에 하나의 스레드만 접근 가능
}

 

결어

 

도황 Thread 정말 잘 쓰네 ...

 

 

 

아무튼, Thread 관련 지식은 더 많이 쓰이는데, 언제 많이 쓰이냐면... 

Salieri
@Salieri :: 살리에리의 인생살이 채널

평소에 내가 좋아하는것과 싫어하는 것들 그리고 왜 안되나 싶은 것들을 업로드 하는 블로그입니다 인생살이도 업로드 하고있어요. 제가 걸어온 길이 당신에게 있어서 도움이 되는 이정표였으면 좋겠네요. 질문은 항상 넓은 마음으로 받고있답니다. 대답하기 곤란한 질문이 아닌 이상 제에게 이메일을 써주세요 트위터 : https://twitter.com/@Salieri1845799 깃허브 : https://github.com/salieri009

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차