본문 바로가기

전체 글56

[ch.09] Optional을 사용한 null 처리 null 참조의 문제null 참조는 단순히 `값이 없는 상태`가 아니다.실제 타입과 관계없이 `어떠한 객체 참조와도 호환되는 일반화된 타입`이다.값이 할당되지 않을 경우 기본값으로 null을 갖게 되며, null 참조에 접근하면 NullPointException이 발생한다.null을 처리하지 않으면 해당 스레드는 중단된다.표면적으로 null 값을 처리할 수 있더라도, 올바른 결과를 보장하기 위해선 반드시 null 여부를 확인해야 한다. 어떠한 객체 참조와도 호환되기 때문에 구체적인 타입이 없어도 모든 타입을 대표할 수 있다. -> `타입 모호성` null 처리 방법Optional을 사용해 쉽게 null 처리가 가능하지만 코드 전체에서 null을 관리하기 위한 완벽한 해결책은 아니다.   Optional .. 2024. 6. 27.
[ch.08] 스트림을 활용한 병렬 데이터 처리 동시성 & 병렬성1. 동시성여러 작업이 중복되는 시간 동안 한정된 리소스에 대한 경쟁을 하면서 실행되는 것을 의미실제로 작업이 동시에 실행되지는 않지만 단일 CPU 코어에서는 작업 간 전환이 빨라 동시에 실행되는 것처럼 보인다.동시성은 I/O 작업을 처리할 때 효율적인데, I/O 요청 후 응답까지의 대기 시간(CPU 대기 시간) 중에 다른 작업을 처리할 수 있기 때문이다.하지만 여러 작업을 동시에 수행하므로 `경합 상태`, `데드락`, `기아` 등의 동기화 문제가 발생할 수 있다.2. 병렬성중첩된 작업들을 관리하는 것이 아닌, 작업들이 `동시에 실행`되는 것에 중점을 둔다.여러 개의 CPU 코어를 사용할 수 있는 경우 각각의 작업들은 서로 다른 코어에서 병렬로 실행될 수 있다.병렬성은 CPU 바운드 작업.. 2024. 6. 20.
[ch.07] 스트림 사용 원시 스트림자바에서 제네릭은 객체 기반 타입에서만 작동한다.Stream는 int와 같은 기본값 시퀀스에 사용될 수 없다.자바는 원시 타임과 그에 상응하는 객체 타입 간의 자동변환(AutoBoxing)을 지원한다.Stream longStream = Stream.of(5L, 23L, 42L); 오토 박싱의 문제1. 원시 타입의 값을 객체로 변환할 때 오버헤드가 발생스트림 파이프라인에서 래퍼 타입의 지속적인 생성으로 인해 오버헤드가 누적될 수 있다.2. null 값의 존재 가능성원시 타입을 객체로 바로 변환할 때는 null이 생기지 않는다.파이프라인 내의 특정 연산에서 래퍼 타입을 처리해야 한다면 null 값이 반환될 가능성이 있다.일반적으로 원시 스트림을 사용하는 경우는 최적화를 위해 대규모 데이터를 병렬 .. 2024. 6. 16.
[ch.06] 스트림을 이용한 데이터 처리 데이터 소스를 일관되고 선언적인 방식으로 처리할 수 있게 해주는 API스트림은 데이터의 흐름을 추상화한 개념으로, 데이터를 필터링, 매핑 등의 작업을 수행할 수 있게 해 준다.데이터 처리에 대한 선언적이고 지연 평가된 접근법을 제공한다. 1. 반복을 통한 데이터 처리모든 데이터 처리는 파이프라인 방식으로 작동하는데, DB에서 조회한 데이터를 컬렉션 자료 구조에 넣거나 필터링, 변환 같은 다양한 작업들을 거쳐 결과를 제공한다.public static void main(String[] args) { List list = Arrays.asList("apple", "banana", "apricot", "orange"); List newList = new ArrayList(); for (Strin.. 2024. 6. 6.
[ch.05] 레코드 레코드는 간단한 구문으로 다양한 형태의 데이터를 집계할 수 있는 기능을 가진다. 데이터 집계란 특정 목적을 위해 데이터를 모으고 구조화하는 것을 의미한다.대표적으로 튜플이 있다. 튜플여러 값을 하나의 묶음으로 저장할 수 있는 자료형1. 구조적 튜플데이터의 순서와 개수를 기준으로 정의데이터의 타입과 순서에만 의존하므로 인덱스를 통해서만 접근이 가능하다.// Java는 기본적으로 튜플 제공 x, 외부 라이브러리나 레코드를 통해 유사한 구조를 만들 수 있다.//org.apache.commons.lang3.tuple.Pair 라이브러리를 사용한 구조적 튜플 예제public class TupleExample { public static void main(String[] args) { Pair p.. 2024. 6. 1.
[ch.04] 가변성 & 불변성 가변성자바에서는 객체의 상태를 가변 형태로 캡슐화한다.객체의 필드를 private 으로 선언하여 외부에서 직접 접근하지 못하도록 한다.대신, getter와 setter 등을 통해 객체 내부에 접근하고 변경할 수 있도록 캡슐화한 것이다.가변 상태를 다루는 자바 객체들이 있는데 이들은 컴포넌트 간의 재사용성을 향상시키기 위해 상태값을 캡슐화하도록 설계되었다.POJO /  JavaBean  1. POJO특별한 제한이나 요구 사항 없이 단순한 자바 객체를 의미한다.비즈니스 로직 상태를 캡슐화하는 것이 목적이며, 불변성을 갖도록 설계할 수 있다.가변 상태를 가진 객체 지향적인 컨텍스트에서 유연하게 작동하도록 필드에 getter와 setter를 제공한다.public class Person { private S.. 2024. 5. 23.