JAVA 48

지연 연산 vs 즉시 연산: Kotlin과 Java Stream을 통한 최적화 전략 이해하기

지연 연산 (Lazy Evaluation) vs 즉시 연산 (Eager Evaluation) 스트림을 배우다 보면 지연연산이라는 특징을 접하게 된다. 지연연산을 종단연산을 실행하기 전까지 연산을 미루기 때문에 해당 연산을 즉시 실행되지 않는다. 그렇다면 지연 연산이란 무엇일까? Lazy  vs Eager 지연 연산이란 간단히 말해 결괏값이 필요할 때까지 계산을 늦추는 기법이다. 즉, 눈앞에 코드가 주어졌을 때 곧바로 해당 코드를 실행하는 것이 아니라 실행결과가  필요해지는 시점에 실행을 하도록 하는 것이다. 다만, 이러한 방식으로 코드가 동작하기 위해 내부적으로 준비해 주는 작업이 필요하므로  무조건 효율적인 방식이라고 보기 어렵다. 이에 반해 어떠한 작업이 즉시 수행되다면 말 그대로 실행할 코드가 보이..

JAVA 2025.01.17

Runnable과 Callable

Runnable과 Callable의 차이점은 무엇이고 왜 쓰일까?둘 다 스레드를 만들 때 사용된다. 즉 스레드를 만들어 실행시킨다는 의미는 비동기적으로 실행시킨다는 의미이다. 비동기적으로 실행해야 하는 작업에 대해서 반환값을 받아야 할 때는 Callable 를 쓰고 그 결과를 무시해도 될 때는 Runnable를 사용한다. Thread는 비동기적으로 실행해야 하는 작업이 있을 때 쓰인다.기존 Runnable 은 반환값이 없고 체크 예외를 던질 수 없다는 불편함이 있었다.public interface Runnable { void run();}Runnable  의 run()  은 반환 타입이 void이다. 따라서 값을 반환할 수 없다.예외가 선업되어 있지 않다.  따라서 해당 인터페이스를 구현하는 모든 메서..

JAVA 2025.01.12

ReentrantLock

ReentrantLock - 이론 자바는 1.0부터 존재한 synchronized와 BLOCKED 상태를 통한 임계 영역 관리의 한계를 극복하기 위해 자바 1.5부터 Lock 인터페이스와 ReentrantLock 구현체를 제공한다. synchronized 단점 무한 대기 : BLOCKED 상태의 스레드는 락이 풀릴 때까지 무한 대기한다.특정 시간까지만 대기하는 타임아웃 X 중간에 인터럽트 X공정성 : 락이 돌아왔을 때 ` BLOCKED ` 상태의 여러 스레드 중에 어떤 스레드가 락을 획득할지 알 수 없다. 최악의 경우 특정 스레드가 너무 오랜 기간 락을 획득하지 못할 수 있다.  package java.util.concurrent.locks; public interface Lock { void l..

JAVA 2025.01.07

Java에서의 지연 초기화,지연 평가 Optional 활용: orElse vs orElseGet

지연 평가는 언제 사용할까?Optional 케이스에서  orElseGet() 인 경우에는 Optinal.empty() 일때만 평가를 하지때문에 평가하는데 비용이 크거나,empty 가 아닐때 평가를 안해도 되는 비용들을 좀 줄여야하는 필요가 있을때  orElseGet을 써서 지연평가로 해당 부분을 해결한다. 핵심: orElseGet을 통해 평가 비용이 큰 연산을 지연시키고, 필요할 때만 실행하는 방식이 지연 평가의 본질이다. 이를 통해 성능을 최적화할 수 있다. 지연 초기화는 객체나 리소스의 초기화 시점을 지연시키는 것이고지연 평가는 연산 시점을 지연시킨다. 둘다 성능 최적화라는 공통점이 있다. Supplier 의 내부 람다식이 언제 평가(실행)될까?import java.util.function.Suppl..

JAVA 2025.01.06

고급 동기화 - concurrent.Lock

LockSupport1` synchronized` 는 자바 1.0부터 제공되는 매우 편리한 기능이지만, 다음과 같은 한계가 있다. synchronized의 단점 무한 대기 : BLOCKED 상태의 스레드는 락을 풀릴 때까지 무한 대기한다.특정 시간까지만 대기하는 타임 아웃 X중간에 인터럽트 X공정성 : 락이 돌아왔을 때 BLOCKED 상태의 여러 스레드 중에 어떤 스레드가 락을 획득할지 알 수 없다. 최악의 경우 특정 스레드가 너무 오랜 기간 락을 획득하지 못할 수 있다.  자바 1.5부터 ` java.util.concurrent` 라는 동시성 문제 해결을 위한 라이브러리 패키지가 추가된다.이 라이브러리에는 수 많은 클래스가 있지만, 가장 기본이 되는 ` LockSupport` 에 대해서 먼저 알아보자...

JAVA 2025.01.05

생산자 소비자 문제1

생산자 소비자 문제 - 소개 생산자 소비자 문제는 멀티스레드 프로그래밍에서 자주 등장하는 동시성 문제 중  하나로, 여러  스레드가 동시에 데이터를 생성하고 소비하는 상황을 다룬다. 멀티스레드의 핵심을 제대로 이해하려면 반드시 생산자 소비자 문제를 이해하고, 올바른 해결방안도 함께 알아두어야 한다.생산자 소비자 문제를 제대로 이해하면 멀티스레드를 제대로 이해했다고 볼 수 있다. 그만큼 중요한  내용이다. 프린터 예제 그림  기본 개념 생산자(Producer) 데이터를 생성하거나 작업을 요청하는 역할. 예를 들어, 파일에서 데이터를 읽어 오거나 네트워크에서 데이터를 받아오는 스레드가 생산자 역할을 할 수 있다프린터 예제에서 사용자의 입력을 프린터 큐에 전달하는 스레드가 생산자의 역할이다.소비자(Consum..

JAVA 2024.12.31

멀티스레드 환경에서 volatile 의 중요성: 메모리 가시성 문제 해결

1. 멀티스레드 환경에서의 문제멀티스레드 프로그래밍에서 여러 스레드가 같은 데이터를 공유할 때 중요한 문제는 바로 메모리 가시성 (Memory Visibility 이다.메모리 가시성이란, 한 스레드가 변경한 값이 다른 스레드에서 언제 보이는지에 대한 문제이다.즉 이름 그대도 변경한 값이 보이는가, 보이지 않는가의 문제이다.  volatile, 메모리 가시성 1 volatile 로 변수 상태에 대해 스레드 간 가시성을 확보할 수 있다.volatile 이 붙은 변수는 각 스레드의 로컬 캐시를 사용하지 않고, 항상 메인 메모리에서 값을 읽고 쓰게 만든다. 이를 통해 한 스레드에서 값을 변경하면 다른 스레드에서 즉시 그 변경사항을 볼수 있다.  volatile과 메모리 가시성을 이해하기 위해, 간단한 예제를 ..

JAVA 2024.12.29

익명 클래스

익명 클래스 - 시작익명 클래스(anonymous class)는 지역 클래스의 특별한 종류의 하나이다.익명 클래스는 지역 클래스인데,  클래스의 이름이 없다는 특징이 있다. 앞서 만들었던 지역 클래스 예제 코드인 코드를  ` LocalOuterV2 `  다시 한번 살펴보자. package nested.local;public class LocalOuterV2 { private int outInstanceVar = 3; public void process(int paramVar) { int localVar = 1; class LocalPrinter implements Printer { int value = 0; @Override ..

JAVA 2024.12.24

중첩 클래스, 내부 클래스 2

지역 클래스 - 시작 지역 클래스 (Local class)는 내부 클래스의 특별한 종류의 하나이다. 따라서 내부 클래스의 특징을 그대로 가진다. 예를 들어서 지역 클래스도 내부 클래스이므로 바깥 클래스의 인스턴스 멤버에 접근할 수 있다. 지역 클래스 예class Outer { public void process() { //지역 변수 int localVar = 0; //지역 클래스 class Local {...} Local local = new Local(); } } 지역 클래스의 특징지역 클래스는 지역 변수처럼 코드 블록 안에 클래스를 선언한다.지역 클래스는 지역 변수에 접근할 수 있다.package nested.local;publ..

JAVA 2024.12.24