JAVA 8

[TIL] Java 멀티스레드 - 생산자 소비자 문제와 wait/notify (2026.05.07)

오늘 배운 것멀티스레드 환경에서 가장 자주 등장하는 패턴인 생산자-소비자 문제와, 이를 해결하기 위한 Object.wait() / notify() 메커니즘을 학습했다.생산자-소비자 문제란?생산자(Producer)는 데이터를 만들어 버퍼에 넣고, 소비자(Consumer)는 버퍼에서 데이터를 꺼내 처리한다. 버퍼는 한정된 공간이기 때문에 두 가지 상황이 문제가 된다.버퍼가 가득 찼을 때 생산자가 계속 넣으려 하면 데이터 유실버퍼가 비었을 때 소비자가 계속 꺼내려 하면 null 처리 또는 무한 루프단순히 synchronized만 붙인다고 해결되는 문제가 아니다. 스레드 간 협력(cooperation)이 필요하다.V1 - 단순 구현 (데이터 유실 발생)가장 먼저 시도할 수 있는 방법은 synchronized로 ..

JAVA 2026.05.08

[TIL] Java 멀티스레드 - LockSupport와 ReentrantLock (2026.05.06)

오늘 배운 것synchronized의 한계를 극복하기 위해 핵심인 LockSupport와 ReentrantLock에 대해 학습했다.synchronized의 한계 복습단점 내용무한 대기BLOCKED 상태에서 타임아웃·인터럽트 없이 락이 풀릴 때까지 무한 대기공정성 없음어떤 스레드가 락을 먼저 얻는지 보장 안 됨 → 기아 현상 가능 LockSupport스레드를 직접 WAITING / TIMED_WAITING 상태로 제어하는 저수준 유틸리티.LockSupport.park(); // RUNNABLE → WAITINGLockSupport.parkNanos(2_000_000_000L); // RUNNABLE → TIMED_WAITING (2초)LockSupport.unpark(thre..

JAVA 2026.05.06

[TIL] Java 멀티스레드 - synchronized와 임계 영역 (2026.05.04)

동시성 문제란?여러 스레드가 같은 공유 자원(인스턴스 필드 등)에 동시에 접근할 때 발생한다.잔액 1000원 계좌에 t1, t2가 동시에 800원 출금을 시도하는 예제에서 두 가지 문제가 나타났다.케이스 1 - t1이 약간 먼저 실행t1이 잔액 검증(1000 >= 800) 통과 후 아직 balance를 줄이지 않은 상태t2도 잔액 1000으로 검증 통과결과: t1 출금 후 잔액 200, t2 출금 후 잔액 -600 (마이너스 발생)케이스 2 - t1, t2 완전히 동시 실행둘 다 balance=1000 읽음 → 둘 다 1000-800=200 계산 → 둘 다 balance=200 저장결과: 1600원이 빠져나갔는데 잔액은 200원 (800원 증발)volatile로는 해결 안 된다. 메모리 가시성 문제만 해..

JAVA 2026.05.04

[TIL] Java 멀티스레드 - 인터럽트, yield와 메모리 가시성 (2026.4.23)

1. 인터럽트란?특정 스레드가 WAITING, TIMED_WAITING 같은 대기 상태일 때 강제로 깨워 RUNNABLE 상태로 전환시키는 메커니즘thread.interrupt()를 호출하면 해당 스레드의 인터럽트 상태(flag)가 true로 변경됨sleep(), wait() 등 InterruptedException을 던지는 메서드 실행 중이라면 즉시 예외 발생while(true), 일반 연산 중에는 예외가 발생하지 않음 (인터럽트 상태만 true로 남음)2. runFlag 방식의 한계가장 단순한 스레드 중단 방법은 volatile 변수를 사용하는 것이다.while (runFlag) { log("작업 중"); sleep(3000); // 3초 대기}// main이 4초 뒤에 runFlag = ..

JAVA 2026.04.24

[TIL] Java 멀티스레드 기초 정리 (2026.4.22)

1. 프로세스와 스레드 소개멀티태스킹과 멀티프로세싱단일 프로그램 실행프로그램의 실행이란 프로그램을 구성하는 코드를 순서대로 CPU에서 연산(실행)하는 일이다. CPU 코어가 1개면 한 번에 하나의 프로그램 코드만 실행 가능하다. 초창기 컴퓨터는 한 번에 하나의 프로그램만 실행할 수 있어서 음악 프로그램이 끝나야만 워드 프로그램을 실행할 수 있었다. 지금 시각으로 보면 매우 불편한 방식이다.[단일 실행 흐름]프로그램A: 코드1 -> 코드2 -> 코드3 -> 코드4 (완료)프로그램B: 코드1 -> 코드2 -> 코드3 -> 코드4 (완료)-> A가 끝난 후에야 B 시작 가능 멀티태스킹 (Multitasking)하나의 컴퓨터 시스템이 동시에 여러 작업을 수행하는 능력이다. 핵심 원리는 시분할(Time Shari..

JAVA 2026.04.22

getter 언제, 어떻게 사용해야 하는가!!!

Getter를 지양하라는 말을 많이 한다.사용을 지양해야 하는건 맞지만 왜 지양해야 되는지?? 생각은 깊게 해보지 않은 것 같아서 깊게 생각할 겸 정리할 겸 글을 작성해 보려고 한다.많은 글에서 “getter를 쓰지 말라”는 조언이 나온다.하지만 대부분 이유는 설명하지 않고, 금지 규칙만 남긴다.정작 중요한 건 왜 그게 문제인지, 그리고 대신 어떻게 해야 하는지다. 1. getter를 지양하라는 진짜 이유객체 지향 설계의 핵심 원칙 중 하나는 "캡슐화"이다.객체 내부의 상태를 숨기고, 외부에서 직접 조작하거나 판단하지 못하도록 보호하는 개념이다. public class Student { private final String name; private final int age; public ..

JAVA 2025.11.06

[자료구조] 자료구조 기본 이해하기

ArrayList기본 개념동적 배열(Dynamic Array) 기반의 리스트내부적으로 Object[] elementData 배열을 사용함배열이 꽉 차면 1.5배로 자동 확장인덱스 기반 접근이 빠르지만, 중간 삽입/삭제는 느림첫 add()시 10크기 배열 생성됨.List list = new ArrayList();list.add("A"); // elementData[0] = "A"list.add("B"); // elementData[1] = "B"list.get(0); // O(1)로 접근list.remove(1); // 뒤의 원소를 전부 한 칸씩 앞으로 이동 → O(n)데이터가 순차적으로 추가/조회될 때 유리Stack, Queue를 직접 구현할 때 내부 자료구조로 활용 가능LinkedListpublic..

JAVA 2025.11.04

좋은 객체 7가지 덕목

라이브러리는 본질적으로 호출 가능한 함수의 집합 => 보통 클래스에 모여있다. - 마틴 파울러 하지만1. 클래스는 함수를 모아두는 곳이 아니다.(가장 최근에 한 실수...)2. 객체는 자료구조가 아니다. "적절한 객체"에 대해서 알아보자들어가기 전.클래스 vs 객체클래스는 다들 알겠지만 설계도이다. 클래스의 주된 책임은 필요에 따라 새로운 객체 생성하고 쓰지 않을때 파괴하는 것이다.클래스는 자식들이 따라야 하는 행동, 즉 계약에 대해 알고 있다.이따금 클래스를 "객체 템플릿" 으로 부르는 것은 정확하지 않다.why?? -> 이 정의에 따르면 클래스는 수동적인 위치에 있게 된다. 누군가가 템플릿을 가지고 그것을 사용해 객체를 만들어 낸다고 가정한다. (지금 까지 나도 이렇게 생각했다. 어떻게 바뀌는지 정리..

JAVA 2025.04.04