Thread & Lamda

Jean·2025년 8월 13일
0

풀스택 교육

목록 보기
25/28

🧶 스레드(Thread) 관련 개념

😈 데몬 스레드 (setDaemon(true))

  • 메인 스레드가 종료되면 함께 종료되는 백그라운드 스레드
  • 예: 가비지 컬렉터, 자동 저장 기능 등

🔄 동기화(Synchronization)

  • 멀티스레드에서 공유 자원에 접근할 때 충돌 방지용
synchronized (object) {
    // 하나의 스레드만 접근 가능
}

🥊  공유 자원 충돌

  • 버퍼나 리스트 등 공용 데이터를 여러 스레드가 동시에 수정 → 충돌 발생 가능

🌟 동기화 컬렉션

List<String> list1 = Collections.synchronizedList(new ArrayList<>());
List<String> list2 = new CopyOnWriteArrayList<>();
  • synchronizedList: 쓰기엔 안전하지만 느림
  • CopyOnWriteArrayList: 쓰기 많으면 느림, 읽기에는 안전하고 빠름

🦺 안전하게 스레드 종료하기

  • interrupt(), volatile, flag 사용!

🍒 벡터(Vector) vs 어레이리스트(ArrayList)

항목VectorArrayList
동기화OX
성능느림빠름
스레드 안전성OX

🍎 StringBuffer vs StringBuilder

항목StringBufferStringBuilder
동기화O (스레드 안전)X (싱글 스레드용)
성능느림빠름

🧩 람다식 (Lambda Expression)

🥝 람다식?

  • 함수형 인터페이스를 간단하게 구현하는 방법
  • 익명 클래스의 축약형
(매개변수) -> { 실행문 }

🍏 예시

Runnable r = () -> System.out.println("Hello");
Function<Integer, Integer> f = x -> x + 1;

🥑 함수형 인터페이스 (@FunctionalInterface)

  • 추상 메서드가 1개만 있는 인터페이스
  • 그 하나의 메서드를 람다식으로 구현할 수 있음
@FunctionalInterface
interface MyFunc {
    void method();
}

→ 람다식은 메서드 이름이 없어도 되기 때문에, 어떤 메서드인지 명확해야 함 → 1개만 허용


🫒 익명 클래스 vs 람다식

// 익명 클래스
Sample s = new Sample() {
    public int calc(int n) {
        return n + 1;
    }
};

// 람다식
Sample s = n -> n + 1;

🍋‍🟩 메서드 참조 (::)

  • ::는 특정 메서드를 참조해서 대신 호출하게 함
Consumer<String> c1 = x -> System.out.println(x);
Consumer<String> c2 = System.out::println;  // 메서드 참조
형태의미
클래스::메서드정적 메서드 참조
참조변수::메서드인스턴스 메서드 참조
클래스::new생성자 참조

🥬 생성자 참조

Supplier<Date> s1 = () -> new Date();
Supplier<Date> s2 = Date::new;

✅ 자주 쓰이는 함수형 인터페이스

인터페이스역할예시
Runnable매개변수 없음, 반환 없음() -> System.out.println("run")
Supplier<T>매개변수 없음, T 반환() -> "hello"
Consumer<T>T 매개변수, 반환 없음x -> System.out.println(x)
Function<T,R>T 입력 → R 출력x -> x + 1
Predicate<T>T 입력 → boolean 출력x -> x > 0

📝 람다식으로 기존 코드 바꾸는 방법!

  1. 익명 클래스 확인

    new 인터페이스() { ... } 형태 찾기

  2. 해당 인터페이스가 추상 메서드 1개인지 확인

  3. 람다 문법으로 축약

profile
햇내기 개발자 지망생

0개의 댓글