[Java] Volatile: 메모리 가시성과 멀티스레딩
·
Dev Lang/Java
Java의 Volatile 키워드: 메모리 가시성과 멀티스레딩백엔드 개발자로서 멀티스레드 환경을 다루다 보면, 데이터의 일관성과 가시성 문제가 자주 발생합니다.특히 Java 개발자라면 Volatile 키워드가 왜 중요한지, 그리고 이를 어떻게 활용할지 이해하는 것이 핵심입니다. 이 글에서는 Volatile의 기본 개념부터 Java Memory Model(JMM)까지 단계적으로 설명하겠습니다. 실제 코드 예시를 통해 개념을 구체화하고, 나중에 다시 읽을 때 도움이 되도록 깊이 있게 다루겠습니다. 메모리 가시성(Memory Visibility)멀티스레드 환경에서 한 스레드가 변경한 값이 다른 스레드에서 언제 보이는지에 대한 문제를 메모리 가시성(Memory Visibility)이라고 합니다. 이름 그대로 ..
[Java] 함수형 인터페이스 완전 정복 – 제네릭, 타겟 타입, 내장 함수형 인터페이스까지
·
Dev Lang/Java
Java 함수형 인터페이스 완전 정복 – 제네릭, 타겟 타입, 내장 함수형 인터페이스까지Java에서 함수형 프로그래밍의 핵심 요소는 단연코 함수형 인터페이스(Functional Interface) 입니다. 람다는 함수형 인터페이스를 통해 타입 추론, 호출 규칙, 문법적 간결성 등을 얻게 되며, Java 8 이후 다양한 내장 함수형 인터페이스도 함께 제공됩니다.이번 글에서는 다음의 7가지 주제를 중심으로 함수형 인터페이스를 깊이 있게 다룹니다. 1. 함수형 인터페이스와 제네릭 1 – 람다의 재사용성과 타입 유연성 확보함수형 인터페이스란?함수형 인터페이스(Functional Interface) 는 추상 메서드가 단 하나만 존재하는 인터페이스입니다. @FunctionalInterface 어노테이션을 붙여 의..
[Java] JAVA - 람다 vs 익명 클래스 완전 정리
·
Dev Lang/Java
JAVA - 람다 vs 익명 클래스 완전 정리개요자바에서 익명 클래스(Anonymous Class)와 람다 표현식(Lambda Expression)은 둘 다 일회성 로직을 간결하게 구현할 수 있는 방법이다. 하지만 문법 구조, 내부 동작, 상태 관리, 가리키는 this 등에서 뚜렷한 차이가 존재한다. 이 글에서는 두 방식의 차이를 정확히 비교하며 언제 어떤 방식이 더 적합한지 예제 중심으로 설명한다. 1. 문법 차이익명 클래스Button button = new Button();button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { System.out.println("버튼 클릭..
[Java] 람다 완전 정리 – 함수형 프로그래밍의 시작
·
Dev Lang/Java
Java 람다 완전 정리 – 함수형 프로그래밍의 시작Java 8부터 도입된 람다(Lambda) 는 자바의 문법과 프로그래밍 패러다임을 획기적으로 변화시켰습니다. 익명 내부 클래스의 복잡함을 줄이고, 함수형 프로그래밍 스타일을 도입해 간결하면서도 명확한 코드 작성을 가능하게 합니다. 이 글에서는 자바 람다에 대한 개념을 다음 순서에 따라 실전 중심으로 정리합니다. 1. 람다 정의: 익명 함수를 표현하는 문법람다(Lambda Expression)는 익명 함수(Anonymous Function) 를 간결하게 표현하는 방식입니다. 즉, 메서드 이름 없이 매개변수, 화살표, 바디로 구성된 함수 정의입니다.(매개변수) -> { 실행문; }예시Runnable r = () -> System.out.println("H..
[Java] 자바 스레드에서 run()은 왜 체크 예외를 던질 수 없을까?
·
Dev Lang/Java
자바 스레드에서 run()은 왜 체크 예외를 던질 수 없을까? 1. 스레드의 시작점은 run() 메서드자바에서 스레드를 생성하고 실행할 수 있는 방식은 대표적으로 두 가지이다.// 방법 1: Thread 상속class MyThread extends Thread { public void run() { // 작업 내용 }}// 방법 2: Runnable 구현class MyRunnable implements Runnable { public void run() { // 작업 내용 }}두 방식 모두 작업의 진입점은 run() 메서드이며, 내부적으로 Thread.start()가 호출되면 run()이 실행된다. 2. run()의 메서드 시그니처public void run..
[Java] ReentrantLock 공식문서 파헤쳐보기
·
Dev Lang/Java
ReentrantLock공식문서를 보고 학습한 내용을 아카이브해보았습니다.공식문서 링크: https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantLock.html#isHeldByCurrentThread-- ReentrantLock (Java Platform SE 8 )Acquires the lock only if it is not held by another thread at the time of invocation. Acquires the lock if it is not held by another thread and returns immediately with the value true, setting the lock..
[Java] 프록시 패턴을 통한 멀티 스레드 환경 조성하기
·
Dev Lang/Java
멀티스레드에서의 동시성멀티스레드 환경에서의 컬렉션 프레임워크들은 공유변수에 대한 값을 보장할 수 있을까?수 많은 스레드의 접근에도 유효한 값을 보장하는지에 대한 궁금증을 해결하기 위해 아래의 예시를 준비했습니다. 단순 컬렉션 구현 코드package thread.collection.simple.list;import static util.ThreadUtils.*;import java.util.Arrays;public class BasicList implements SimpleList { private static final int DEFAULT_CAPACITY = 5; private Object[] elementData; private int size = 0; public BasicList() { elem..
[Java] 제네릭 클래스의 이해와 활용
·
Dev Lang/Java
학습 키워드Generic Class & InterfaceType ParameterType SafetyCode ReusabilityBounded Type ParameterMultiple Type ParametersRaw TypeType Inference 학습 내용1. 제네릭 클래스의 기본 구조와 필요성Java에서 제네릭이 없던 시절의 코드를 보면 다음과 같은 문제점이 있었다.// 제네릭 이전의 코드class OldBox { private Object item; public void setItem(Object item) { this.item = item; } public Object getItem() { return item; }}// 사용 예시OldBox..
개발자 성현
'Dev Lang/Java' 카테고리의 글 목록