JAVA 95

[아이템 48] 스트림 병렬화는 주의해서 적용하라

자바의 동시성 프로그래밍 주류 언어 중에서 자바는 항상 동시성 프로그래밍 측면에서 선두를 달려왔습니다. 첫 릴리즈 된 1996년부터 쓰레드, 동기화, wait()/notify() 메서드 지원 자바 5 버전부터 동시성 컬렉션인 java.util.concurrent 라이브러리와 Executor 프레임워크 지원 자바 7 버전부터 고성능 병렬 분해(parallel decom-position) 프레임워크인 fork-join 패키지 추가 자바 8 버전부터 parallel 메서드만 한 번 호출하면 파이프라인을 병렬 실행할 수 있는 Stream 지원 이처럼 자바로 동시성 프로그램을 작성하기가 점점 쉬워지고 있으나 이를 올바르고 빠르게 작성하는 일은 여전히 어려운 작업입니다. 동시성 프로그래밍을 할 때는 안전성과 응답 ..

JAVA/Effective Java 2024.03.06

[Java] synchronized, wait() & notify(), volatile, Deadlock

개요 앞선 게시물을 읽고 오시는 것을 추천드립니다! https://jaimemin.tistory.com/2392 [Java] 동기화 개념 1. 싱글 쓰레드 vs 멀티 쓰레드 프로세스는 오직 한 개의 쓰레드로만 구성하는 싱글 쓰레드 프로세스와 하나 이상의 쓰레드로 구성하는 멀티 쓰레드 프로세스로 구분할 수 있습니다,. 멀티 쓰레 jaimemin.tistory.com https://jaimemin.tistory.com/2406 [Java] 동기화 기법 개요 앞선 게시물인 [Java] 동기화 개요를 읽고 해당 게시물을 읽는 것을 추천드립니다. 1. 뮤택스 (Mutual Exclusion) 공유 자원에 대한 경쟁 상태를 방지하고 동시성 제어를 위한 락 메커니즘 쓰레드 jaimemin.tistory.com Syn..

JAVA/RxJava 2024.03.05

[아이템 47] 반환 타입으로는 스트림보다 컬렉션이 낫다

다양한 선형 자료구조를 반환하는 메서드가 많이 있으며, 해당 메서드의 반환 타입은 다음 중 하나였습니다. Collection, Set, 혹은 List와 같은 컬렉션 인터페이스 Iterable 인터페이스 String[]과 같은 배열 1. Collection 인터페이스 기본적으로 컬렉션 인터페이스를 반환 타입으로 채택 2. Iterable 인터페이스 for-each 문에서만 쓰이거나 반환된 원소 시퀀스가 contains(Object)와 같은 일부 Collection 메서드를 구현할 수 없을 경우 사용 3. 배열 반환 원소들이 primitive 타입이거나 성능에 민감할 경우 이처럼 메서드의 반환 타입을 선택할 때는 명확한 기준이 있었습니다. 하지만 자바 8 버전부터 등장한 스트림에 의해 선택하는 기준이 다소 ..

JAVA/Effective Java 2024.03.05

[Java] 동기화 기법

개요 앞선 게시물인 [Java] 동기화 개요를 읽고 해당 게시물을 읽는 것을 추천드립니다. 1. 뮤택스 (Mutual Exclusion) 공유 자원에 대한 경쟁 상태를 방지하고 동시성 제어를 위한 락 메커니즘 쓰레드가 임계 영역에서 Mutex 객체의 flag를 소유해 락을 획득하면 다른 쓰레드가 접근할 수 없으며 Mutex 객체 flag가 해제 즉, 락이 해제되어야지만 타 쓰레드가 임계 영역에 접근 가능 정리하자면 Mutex 락을 가진 오직 한 개의 쓰레드만이 임계 영역에 진입할 수 있으며 락을 획득한 쓰레드만이 락 해제 가능 코드 부연 설명 임계 영역을 점유하고 있는 쓰레드가 없을 경우 lock은 false lock이 false인 상태에서 쓰레드가 임계 영역에 접근하고자 acquired() 메서드를 호..

JAVA/RxJava 2024.03.04

[아이템 46] 스트림에서는 부작용 없는 함수를 사용하라

스트림의 패러다임 스트림이 제공하는 표현력, 속도, 병렬성을 얻으려면 API는 말할 것도 없고 해당 패러다임까지 함께 받아들여야 합니다. 스트림 패러다임의 핵심은 계산을 일련의 변환으로 재구성하는 것 각 변환의 단계는 오직 이전 단계의 결과만이 결과에 영향을 주는 순수한 함수여야 함 즉, 다른 가변 상태를 참조하지 않으면서 함수 스스로도 다른 상태를 변경하면 안 됨 1. 스트림 패러다임을 이해하지 못한 채 사용한 예 위 코드는 텍스트 파일에서 단어별 수를 세어 빈도표로 만드는 일을 수행하지만 문제가 있는 코드입니다. 스트림 코드를 가장한 반복적 코드 위 스트림 파이프라인은 forEach 종단 연산에서 sideEffect map의 상태를 변경 forEach를 사용하는 것은 스트림을 사용하는 것이 아닌 단순..

JAVA/Effective Java 2024.03.03

[아이템 45] 스트림은 주의해서 사용하라

스트림 API 1. 개념 다량의 데이터 처리 작업을 돕고자 자바 8+ 버전부터 추가된 기능 스트림은 데이터 원소의 유한 혹은 무한 시퀀스를 뜻함 스트림 파이프라인은 이 원소들로 수행하는 연산 단계를 표현하는 개념 스트림의 원소들은 어디로부터든 올 수 있으며 대표적으로 컬렉션, 배열, 파일, 정규표현식 패턴 매처, 난수 생성기, 혹은 다른 스트림이 있음 스트림 안의 데이터 원소들은 객체 참조나 기본 타입 값 기본 타입 값은 int, long, double 지원 스트림 API는 메서드 연쇄를 지원하는 fluent API 파이프라인 하나를 구성하는 모든 호출을 연결하여 단 하나의 표현식으로 완성 가능 파아프라인 여러 개를 연결해 표현식 하나로 만들 수 있음 기본적으로 스트림 파이프라인은 순차적으로 수행 파이프..

JAVA/Effective Java 2024.03.02

[아이템 44] 표준 함수형 인터페이스를 사용하라

자바가 람다를 지원하면서 API 작성 스타일이 변경되었습니다. 상위 클래스의 기본 메서드를 재정의해 원하는 동작을 구현하는 템플릿 메서드 패턴보다 함수 객체를 받는 정적 팩토리나 생성자를 제공하는 스타일을 권장 이에 따라 저자는 함수 객체를 매개변수로 받는 생성자와 메서드를 더 많이 만들어야 한다고 주장합니다. LinkedHashMap Collections 라이브러리에서 제공하는 LinkedHashMap를 보면 노드를 삽입한 후 removeEldestEntry() 메서드를 호출해 캐시에서 가장 오래된 데이터를 지울 것인지에 대한 여부를 확인합니다. removeEldestEntry()는 protected 메서드로 사용하는 쪽에서 재정의해줘야 합니다. 1. removeEldestEntry() 메서드를 재정의..

JAVA/Effective Java 2024.03.02

[아이템 43] 람다보다는 메서드 참조를 사용하라

메서드 참조 메서드 참조는 특정 메서드를 참조하여 매개변수와 리턴 타입을 알아낸 뒤, 람다식의 불필요한 부분을 제거하여 코드를 간결하게 만드는 기법입니다. 이를 통해 가독성을 향상하고 람다 표현식보다 더 간결한 코드를 작성할 수 있습니다. 람다식이 단 하나의 메서드를 호출한 경우에 해당 람다식에서 불필요한 매개변수를 없앨 수 있으며 이때 형식은 `클래스명::메서드명`의 형태로 작성해 간결한 메서드 참조로 변경할 수 있습니다. 메서드 참조 예시 Map 인터페이스의 merge 메서드를 예제 코드를 작성하겠습니다. merge 메서드 설명 전달받은 key가 map 내 존재하지 않는다면 value 값을 (key, value) 쌍으로 저장 전달받은 key가 map 내 존재한다면 value 값을 BiFunction의..

JAVA/Effective Java 2024.03.02

[아이템 42] 익명 클래스보다는 람다를 사용하라

예전 자바에서 함수 타입을 표현하기 위해 추상 메서드를 하나만 담는 인터페이스를 사용했으며 해당 인터페이스의 인스턴스는 특정 함수 혹은 동작을 나타나내는 사용 했습니다. JDK 1.1 등장 이후 이러한 함수 객체를 만드는 주요 수단이 아이템 24에서 간단히 다룬 익명 클래스였습니다. 익명 클래스 아이템 24에서 다룬 내용을 복습하자면 다음과 같습니다. 익명 클래스는 바깥 클래스의 멤버가 아님 멤버와 달리 쓰이는 시점과 동시에 인스턴스가 생성됨 비정적인 문맥에서 사용될 때만 바깥 클래스의 인스턴스를 참조 가능 정적 팩토리 메서드를 구현할 때 익명 클래스 사용 자바에서 람다를 사용하기 전에 주로 사용되었으며 람다가 지원되는 자바 8+ 버전부터는 거의 사용되지 않음 람다 표현식은 단일 추상 메서드(SAM, S..

JAVA/Effective Java 2024.03.02

[아이템 41] 정의하려는 것이 타입이라면 마커 인터페이스를 사용하라

마커 인터페이스 아무 메서드도 담고 있지 않고, 단지 자신을 구현하는 클래스가 특정 속성을 가짐을 표시해 주는 인터페이스 ex) Serializable 아무런 메서드도 없지만 자신을 구현한 클래스의 인스턴스는 ObjectOutputStream을 통해 쓸 수 있다 즉, 직렬화할 수 있다고 알려줌 마커 인터페이스 vs 마커 어노테이션 1. 마커 인터페이스 장점 마커 어노테이션과 달리 마커 인터페이스를 구현한 클래스의 인스턴스를 구분하는 타입으로 사용 가능 컴파일 시점에 오류 발견 가능 마커 어노테이션에 비해 적용 대상을 더 정밀하게 지정 가능 적용 대상을 @Target(ElementType.TYPE)으로 선언한 어노테이션은 모든 타입(클래스, 인터페이스, Enum 타입, 어노테이션)에 달 수 있지만 부착할 ..

JAVA/Effective Java 2024.02.29