[java] 클래스와 객체의 스레드(Thread)를 활용한 동시성 처리에 대해 설명해주세요.

자바는 멀티스레딩을 지원하는 언어로, 동시성 처리를 위해 클래스와 객체의 스레드를 사용할 수 있습니다. 이를 통해 여러 작업을 동시에 실행하고 병렬 처리를 할 수 있습니다.

1. 스레드(Thread)

스레드는 프로세스 안에서 실행되는 작업의 단위입니다. 기본적으로 모든 자바 프로그램은 메인 스레드에서 실행됩니다. 하지만 추가적인 스레드를 생성하여 여러 작업을 동시에 수행할 수 있습니다.

2. 클래스와 객체

클래스는 객체를 생성하기 위한 템플릿 역할을 합니다. 자바에서는 클래스를 기반으로 객체를 생성하고, 각 객체는 독립적인 상태와 동작을 가지게 됩니다. 이를 활용하여 여러 객체에 대해 동시에 작업을 수행할 수 있습니다.

3. 동시성 처리

동시성 처리는 여러 작업을 동시에 실행하여 시스템의 성능을 향상시키는 방법입니다. 자바에서는 멀티스레딩을 통해 동시성 처리를 구현할 수 있습니다.

3.1. 객체 스레드 생성 및 실행

객체별로 스레드를 생성하여 작업을 동시에 처리할 수 있습니다. 객체 스레드는 Thread 클래스를 상속받아 run 메서드를 오버라이딩하는 방식으로 정의할 수 있습니다.

class MyThread extends Thread {
    public void run() {
        // 작업 수행 코드
    }
}

public static void main(String[] args) {
    MyThread thread1 = new MyThread();
    MyThread thread2 = new MyThread();
    
    thread1.start(); // 스레드 실행
    thread2.start();
}

3.2. Runnable 인터페이스 구현

또 다른 방법은 Runnable 인터페이스를 구현하는 클래스를 만들고, Thread 생성자에 해당 클래스의 인스턴스를 전달하는 것입니다.

class MyRunnable implements Runnable {
    public void run() {
        // 작업 수행 코드
    }
}

public static void main(String[] args) {
    MyRunnable runnable1 = new MyRunnable();
    MyRunnable runnable2 = new MyRunnable();
    
    Thread thread1 = new Thread(runnable1);
    Thread thread2 = new Thread(runnable2);
    
    thread1.start();
    thread2.start();
}

4. 스레드 간 동기화

여러 스레드가 동일한 객체에 접근하는 경우 동시성 문제가 발생할 수 있습니다. 이를 해결하기 위해 스레드 간의 동기화가 필요합니다. 자바에서는 키워드인 synchronized를 사용하여 스레드 간의 동기화를 지원합니다.

class Counter {
    private int count = 0;
    
    public synchronized void increment() {
        count++;
    }
    
    public synchronized int getCount() {
        return count;
    }
}

// 사용 예시
Counter counter = new Counter();

// 여러 스레드에서 increment 메서드를 호출하여 count 값을 증가시킴

5. 참고 자료