JAVA 37

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

익명 클래스

익명 클래스 - 시작익명 클래스(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

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

중첩 클래스, 내부 클래스란? for (...) { //중첩 for문for (...) { } }다음과 같이 for 문 안에 for 문을 중첩하는 것을 중첩 (Nested) for 문이라 한다.  class Outer { ... //중첩 클래스 class Nested { ... } }다음과 같이 클래스 안에 클래스를 중첩해서 정의할 수 있는데, 이것을 중첩 클래스라 한다.중첩 클래스는 클래스를 정의하는 위치에 따라 다음과 같이 분류한다. 중첩 클래스의 분류     중첩 클래스는 총 4가지가 있고, 크게 2가지로 분류할 수 있다.정적 중첩 클래스내부 클래스내부 클래스지역 클래스익명 클래스 중첩 클래스를 정의하는 위치는 변수의 선언 위치와 같다. 변수의 선언 위치정적 변수 (클..

JAVA 2024.12.23

자바 정규식 Reqular Expression

만약 숫자로만 이루어져 있는지, 대문자, 소문자를 포함하고 있는지 검사하고 싶다면 요소 하나하나를 비교하는 방법도 있지만 정규식을 이용하며 간단하게 확인할 수 있다.   정규식 문법 기호 모음 정규식 기본 기호기호설명예제.임의의 문자 1개를 의미 ^시작을 의미한다[] 괄호 안에 있다면 일치하지 않는 부정의 의미로로 쓰인다^a : a로 시작하는 단어[^a] : a가 아닌 철자인 문자 1개$$앞의 문자열로 문자가 끝나는지를 의미한다a$ : a로 끝나는 단어[][] 괄호 안의 문자가 있는지를 확인한다[ab][cd] : a,b중 한 문자와 c,d중 한 문자→ ac ad bc bd [^][] 대괄호 안에 ^ 문자가 있으면, 제외를 뜻함- 대괄호 안에 ^ 가 쓰이면 제외의 뜻- 대괄호 밖에 ^ 가 쓰이면 시작점의 ..

JAVA 2024.12.23