TIL/Java

TIL 2024-10-15 (Java 문법 종합반)

myoma 2024. 10. 15. 21:03

1 ) 프로세스와 쓰레드

  • 프로세스 : 운영체제로부터 자원을 할당받는 작업의 단위
    • 실행 중인 프로그램 이라고 생각하면 된다.
    • 카카오톡, 브라우저, JAVA 프로그램 모두 프로세스로 실행.
    • 크롬 브라우저를 2개 띄우면 크롬 브라우저 프로세스도 2개 띄워진 것
  • 쓰레드 : 프로세스가 할당받은 자원을 이용하여 실행하는 단위
    • 프로세스 내에서 일하는 일꾼
    • 생성 : 프로세스가 작업 중인 프로그램에서 실행 요청이 들어오면 쓰레드(일꾼)을 만들어 명령을 처리하도록 한다.
    • 자원 : 프로세스 안에서 여러 쓰레드들이 있고, 쓰레드들은 실행을 위한 프로세스 내 주소 공간이나 메모리 공간(Heap)을 공유 받는다.
      • 쓰레드들은 각각 명령 처리를 위한 자신만의 메모리 공간(stack)을 할당 받는다.
    • Java 쓰레드 : 프로그램을 실행하면 앞 서 배운 JVM 프로세스 위에서 실행됨.

 


2 ) Thread 와 Runnable

  • Thread
public class TestThread extends Thread {
    @Override
    public void run() {
        // 쓰레드 수행작업
    }
}

...

TestThread thread = new TestThread(); // 쓰레드 생성
thread.start() // 쓰레드 실행
  • Thread 메소드를 상속 받아야 사용 가능.

 

  • Runnable
public class TestRunnable implements Runnable {
    @Override
    public void run() {
        // 쓰레드 수행작업 
    }
}

...

Runnable run = new TestRunnable();
Thread thread = new Thread(run); // 쓰레드 생성

thread.start(); // 쓰레드 실행
  • 여기서도 run() 메서드도 마찬가지로 쓰레드가 수행할 작업.
  • Thread를 직접 상속받아 사용하는 방법이 더 간단해 보이지만 Runnable을 사용하여 쓰레드를 구현하는 방법을 쓰는 이유?
    • 클래스와 인터페이스 차이 때문, Java는 다중 상속을 지원하지 않는다.
    • 그렇기 때문에 Thread를 상속받아 처리하는 방법은 확장성이 매우 떨어짐.
    • 반대로 Runnable은 인터페이스이기 때문에 다른 필요한 클래스를 상속 받을 수 있다.
      • 따라서 확장성 유리

 

 


3 ) 쓰레드 상태와 제어

  • 우리는 동영상을 보거나 음악을 듣고 있을 때 일시정지 후에 다시 보거나 듣기도 하고 중간에 종료 시키기도 합니다. 쓰레드도 마찬가지로 상태가 존재하고 이르 제어할 수 있습니다.

 

  • 쓰레드 상태

이처럼 실행과 대기를 반복하며 run() 메서드를 수행한다.

run() 메서드가 종료되면 실행이 멈춘다. 

  • 쓰레드도 일시정지 상태를 만들 수 있으며, 일시정지 상태에선 쓰레드가 실행을 할 수 없는 상태가 된다.

 

  • 쓰레드 제어의 종류

 

 

 


4 ) 람다와 스트림 문법

  • 람다 ( Lambda )
// 기본적으로 문법은 다음과 같습니다.
(파라미터 값, ...) -> {함수 몸체}

(  ) ->  {  }


// 아래의 함수 두개는 같은 함수입니다.
// 이름 반환타입, return문 여부에 따라 {}까지도 생략이 가능합니다.
pubilc int toLambdaMethod(int x, int y) {
    return x + y;
}

(x, y) -> x + y

// 이런 함수도 가능하겠죠?
pubilc int toLambdaMethod2() {
    return 100;
}

() -> 100

// 모든 유형의 함수애 가능합니다.
public void toLambdaMethod3() {
    System.out.println("Hello World");
}

() -> System.out.println("Hello World");

 

 

  • 스트림 ( Stream() )
    • 스트림은 정확하게는 Java 8부터 제공되는, 한 번 더 추상화된 자료구조와 자주 사용하는 프로그래밍 API를 제공한 것.
    • 병렬 처리에 유리한 구조로 조건부로 성능도 챙길 수 있다.
    • 원본의 데이터를 변경하지 않으며, 일회용이다.
carWantToPark.stream() // 스트림 받아오기
   .filter((Car car) -> car.getCompany().equals("Benz")) // 스트림 가공하기
   .toList(); // 스트림 결과 만들기