JAVA
-
java.util.concurrent.FutureJAVA 2025. 8. 7. 18:07
1. Future란 무엇일까?Java의 Future Interface는 비동기 연산의 결과를 나타내는 핵심 컴포넌트입니다.Future는 Multi Thread 환경에서 비동기적으로 실행되는 작업의 결과를 관리하기 쉽게 해줍니다.시간이 오래 걸리는 작업을 Background에서 실행 하는 경우여러 작업을 병렬로 실행하고 결과를 기다리는 경우작업의 진행 상태를 확인하거나 취소해야 하는 경우2. Future의 기본 개념2-1. 비동기 연산의 생명 주기Future로 관리하는 비동기 작업은 다음과 같이 나타낼 수 있습니다.생성 -> 실행 -> 완료 / 취소 / 예외2-2. Generic TypeFuture는 Generic Interface이기 때문에 반환될 결과의 타입을 지정할 수 있습니다.Future strin..
-
java.util.concurrent.locksJAVA 2025. 7. 17. 18:06
java.util.concurrent.locks 패키지는 내장된 동기화(synchronization) 및 모니터(monitor) 기능과는 구별되는 락(lock)과 조건(condition) 대기를 위한 프레임워크를 제공하는 인터페이스 및 클래스들로 구성되어 있습니다. 구문(syntax)이 다소 복잡해지는 대가로 락과 조건 변수 사용에 있어 훨씬 더 유연한 방식을 허용합니다.Lock Interface : 유연한 동시성 제어를 위한 핵심 도구주요 구현체 : ReentrantLockLock 인터페이스는 재진입, 공정성 등 다양한 락 제어 방식을 지원하며 synchronized처럼 코드 블록 단위로만 락을 거는 방식과 달리 필요한 시점에 직접 락을 걸고 해제할 수 있기 때문에 노드 하나씩 이동하며 락을 넘겨주는 ..
-
[Java] Thread에 대해 알아보자JAVA 2025. 6. 26. 18:29
Java에서 Thread는 어플리케이션에서 실행되는 가장 작은 단위의 작업 흐름을 의미합니다.하나의 Process는 N개의 Thread를 가질 수 있으며 N개의 Thread가 동시에 실행되는 환경을 Multi-Thread라고 합니다.Java는 대표적인 Multi-Thread 환경이며 여러 작업을 병렬 처리하여 자원을 효율적으로 사용할 수 있는 장점이 있지만 동기화 문제와 교착 (Dead Lock) 상태 같은 문제들을 발생 할 수 있습니다.Thread 종류Java Thread는 크게 동작 방식과 역할에 따라 2가지로 분류할 수있습니다.1. User Thread백그라운드에서 동작하며 주요 로직을 수행하는 스레드를 의미합니다.JVM은 모든 User Thread가 종료될 때까지 기다렸다가 종료됩니다.하나라도 남..
-
[Java] I/O 작동 원리 HDD 구조부터 시작하기JAVA 2025. 5. 29. 22:27
Java I/O의 시작 - File과 하드디스크의 이해Java의 I/O(Input/Output) 기능은 운영체제를 통해 하드웨어 자원에 접근하며, 주로 파일, 네트워크, 콘솔 등의 입출력 작업을 수행하는 데 사용되며 가장 기본적인 파일에 관해 하드디스크부터 천천히 알아보겠습니다.하드디스크(HDD)의 논리적 구조하드디스크는 회전하는 원형 디스크(platter)와 이를 읽고 쓰는 기계적 팔(arm)으로 구성되어 있으며 플래터는 여러 개의 트랙(track)과 섹터(sector)로 나뉘어서 데이터를 저장할 수 있는 논리적 단위를 형성합니다.트랙(Track): 디스크의 중심에서 바깥 방향으로 동심원 형태로 번호가 매겨집니다 (0, 1, 2, ...)섹터(Sector): 각 트랙을 나누는 조각이며, 시계 방향으로 ..
-
[Java] 인코딩 디코딩 다시 이해하기JAVA 2025. 5. 8. 00:10
컴퓨터는 오직 0 or 1 즉 바이트(byte)를 처리할 수 있고 사람이 알아보는 문자는 char 또는 String입니다. 쉽게 말하면 인코딩은 문자를 바이트로 디코딩은 바이트를 문자로 바꾸는 작업입니다.간단한 String 예시String message = "콜라 마시고 싶다.";// 인코딩 올바른 예byte[] bytes = message.getBytes(StandardCharsets.UTF_8);// 인코딩 잘못된 예byte[] failBytes = message.getBytes(StandardCharsets.ISO_8859_1);// 디코딩 올바른 예String success = new String(bytes, StandardCharsets.UTF_8);// 디코딩 잘못된 예String fail =..
-
[Java 파먹기] 정렬 기준 : Comparable & ComparatorJAVA 2025. 4. 17. 01:25
개요Java에서 기본적으로 제공하는 인터페이스 Comparable과 Comparator에 대해 알아보겠습니다.기본적으로 Comparable과 Comparator는 제네릭 타입으로 동작하기 때문에 원시 타입은 사용할 수 없습니다.Comparable객체 내부의 요소를 활용한 정렬이 필요한 경우 사용됩니다.java.lang 패키지에서 제공합니다.정렬이 필요한 객체 내부에 compareTo를 구현해야 합니다.@Getterpublic class Coupon implements Comparable { private int maxDiscount; private String name; public Coupon(int maxDiscount, String name) { this.maxD..
-
[레거시 코드와 데이트] SimpleDateFormat의 함정JAVA 2025. 2. 21. 00:35
Java에서 날짜와 시간을 포맷하거나 파싱 할 때 흔히 사용하는 SimpleDateFormat은 편리하지만 멀티스레드 환경에서 공유 자원으로 사용할 경우 동시성 문제를 일으킬 수 있습니다.이는 SimpleDateFormat이 Non-Thread-Safe로 설계되었기 때문인데 현재 회사 레거시 프로젝트에서 SimpleDateFormat을 공유 자원으로 사용하고 있는 코드를 발견했는데 이 문제를 해결하기 위해 동시성 문제의 원인을 분석하고 수정이 필요한 이유와 대안을 정리해 보았습니다.동시성 문제 발생 원인SimpleDateFormat의 동시성 문제는 주로 내부적으로 공유되는 Calendar 객체와 pattern 문자열의 상태 변경에서 비롯되는데 이 클래스는 날짜를 포맷하거나 파싱 할 때 Calendar 객..
-
JAVA의 컨텍스트 스위칭이 비싼 이유?JAVA 2025. 1. 10. 10:40
공부를 하다 보면 "Java의 컨텍스트 스위칭 비용이 비싸다"라는 말을 자주 듣곤 하는데 이번 글에서는 왜 Java의 컨텍스트 스위칭 비용이 비싼지 정리해보았습니다.JAVA의 Thread 구조Java에서는 java.lang.Thread를 통해 스레드를 생성하게 되는데 이 과정에서 JVM은 플랫폼 스레드를 만들고 이를 OS 스레드와 연결되고 이 OS 스레드는 다시 커널 스레드와 연결됩니다. 즉, Java에서는 스레드가 JVM 플랫폼 스레드 → OS 스레드 → 커널 스레드의 1:1:1 관계로 동작합니다.- JVM 스레드 : 크기가 작음- OS 스레드 : JVM 스레드에 비해 훨씬 큼Context Switching컨텍스트 스위칭은 실행 중인 스레드를 변경할 때 현재 스레드의 상태(레지스터, 스택 포인터, 메모..