본문 바로가기

Language16

[Java] Stream 과 Optional 의 map, flatMap 출처 Java 의 Stream API 는 컬렉션 데이터를 효율적으로 처리하기 위한 도구로 이때 자주 사용되는 map 과 flatMap 메소드는 각각 변환과 스트림 평면화를 담당합니다. 비슷하게 Optional 클래스도 map 과 flatMap 메소드를 제공하는데 Optional 은 null 처리를 깔끔하게 하기 위한 도구로 map 과 flatMap 을 사용하면 더 안전하고 직관적으로 데이터를 다룰 수 있습니다.Streammap()map 은 Stream API 가 제공하는 중간 연산 메소드로 각각의 엘리멘트에 접근하여 특정 작업을 수행하고 그 결과를 새로운 스트림으로 반환합니다.데이터를 변환하고자 할 때 매우 유용하게 사용됩니다. 아래 예제를 통해 Member 객체 리스트에서 이름만 추출해 리스트로 변환하.. 2024. 9. 6.
[Java] Thread Pool 이전 글에서 스레드에 대해 알아보았습니다. 스레드는 병렬 처리를 가능하게 하여 여러 작업을 동시에 실행할 수 있게 해주지만 사실 스레드를 직접 생성하고 해제하는 것은 상당히 복잡함을 요구합니다. 자원: 스레드 생성 시 운영체제는 스레드에 필요한 메모리와 다른 자원을 할당해야함.시간: 스레드를 생성하고 해제하는 작업은 시간 소모적이기 때문에 이로 인한 오버헤드가 발생할 수 있음. 관리: 스레드를 직접 관리하는 것은 동시성 문제, 스케줄링, 예외 처리등 다양한 문제들이 복잡하게 엮여 있기 때문에 오류가 발생하기 쉬움. 즉 위와 같은 문제들로 인해 요청이 빠르게 많이 들어 오고 가는 실제 운영 환경에서 지속적으로 스레드를 생성하게 되면 어느 순간 응답이 불가능한 상태에 빠지게 됩니다. 이런 상황 속에서 조.. 2024. 7. 18.
[Java] Thread Thread출처프로세스는 할당받은 자원을 소유하는 일종의 컨테이너로 OS 에 의해 스케줄링 되어 할당됩니다. 프로세스는 방대한 크기를 가지기 때문에 정해진 시간에 처리가 불가능하므로 단위를 나누게 되는데 그 나누어지는 단위가 경량 프로세스(light process)인 스레드입니다.하나의 프로세스는 여러 스레드를 포함할 수 있으며 멀티 스레딩(Multi Threading) 기능을 통해 여러 스레드들을 동시에 실행하여 메모리와 같은 해당 프로세스의 리소스를 공유합니다. 여러 스레드들이 프로세스의 자원을 공유한다는 것은 프로세스 내에서 생성된 모든 스레드가 동일한 메모리 공간과 시스템 자원들을 함께 사용할 수 있음을 의미합니다.기본적으로 프로세스는 OS 에서 할당한 자체 리소스를 처리하기 위해 생성, 삭제 및.. 2024. 6. 30.
[Java] Native Method 얼마 전 Java 의 Thread 클래스 소스 코드를 들여다보던 중 native 키워드가 붙어 있는 메소드들을 발견했습니다. 특이한 점이 native 키워드를 포함하고 있는 메소드들은 그 구현체를 찾아볼 수 없었는데 도대체 이 메소드들은 어떻게 작동하는 것인지에 대한 궁금증이 생겼습니다. 따라서 이번 포스팅에서는 Java 의 Native Method 에 대해 알아 보도록 하겠습니다.JNI위에서 소개한 native 메소드를 알아 보기 전에 먼저 Java Native Interface(JNI)에 대해 알아야 합니다.출처JNI 는 Java 프로그램이 다른 언어로 작성된 프로그램과 상호 작용할 수 있게 해주는 인터페이스로 C 와 C++ 로 작성된 프로그램과의 상호작용을 위해 사용됩니다. 즉 JNI 는 C, C+.. 2024. 6. 15.
[Java] 동기화 동기화 WAS 에서는 많은 사용자의 동시 요청을 처리하기 위해 수십 ~ 수백 개의 쓰레드를 사용합니다. 두 개 이상의 쓰레드가 같은 자원을 이용할 때는 필연적으로 쓰레드 간의 경합이 발생하고 경우에 따라서는 Dead Lock 이 발생할 수 있습니다. 따라서 여러 쓰레드가 공유 자원을 사용할 때 정합성을 보장하려면 동기화 장치로 한 번에 하나의 쓰레드만 공유 자원에 접근할 수 있어야합니다. Java 에서는 Monitor 를 이용해 쓰레드를 동기화합니다. 모든 객체는 하나의 Monitor 를 소유하고 있으며 하나의 쓰레드만이 이를 획득할 수 있습니다. 특정 쓰레드가 소유한 Monitor 를 획득하기 위해서는 Monitor 소유권을 해제할 때까지 Wait Queue 에서 대기해야 합니다. Mutal Exclu.. 2024. 3. 13.
[Java] 데이터 병렬 처리(Java 8) Java 8 자바 8은 스트림 객체와 람다 표현식과 같은 Feature들을 기반으로 함수형 프로그래밍 스타일을 지원합니다. 병렬 스트림은 스트림 API를 기반으로 하여 작성되어 훨씬 편리하게 사용할 수 있으며 람다 표현식 및 함수형 인터페이스를 활용하여 코드를 간결하게 작성할 수 있습니다. 자바에서 지원해주는 병렬 스트림에 대해서 알아 보겠습니다. 병렬 스트림 출처 병렬 스트림은 내부적으로 스트림의 요소를 여러 청크(chunk)로 Fork/Join 프레임워크를 사용하여 분할하고 이 청크들을 각각의 스레드에서 병렬로 처리하는 방식으로 동작합니다. 여러 청크로 분할하여 각 스레드가 독립적으로 작업을 수행하고 그 결과를 나중에 모아서 최종 결과를 생성함으로써 멀티코어 프로세서를 활용하여 작업을 효율적으로 분산.. 2024. 1. 8.
[Java] 데이터 병렬 처리(Java 5, 7) 병렬 처리 병렬 처리(Parallel Operation)란 멀티 코어 환경에서 하나의 큰 작업을 여러 개의 작은 작업으로 나누어 각각의 코어가 병렬적으로 작업을 처리하는 것을 의미합니다. 기존의 직렬 처리(Sequential Processing)에서는 작업이 순차적으로 진행되어 한 번에 하나의 작업만 처리할 수 있었지만 병렬 처리는 여러 작업을 동시에 실행함으로써 전체적인 성능을 향상시킬 수 있습니다. 동시성(Concurrency)과 병렬성(Parallelism) 출처 동시성은 한 번에 많은 일을 처리하는 것이고 병렬성은 많은 일을 동시에 수행하는 것 입니다. -롭 파이크(Robert Pike)- 동시성 동시성은 여러 작업이 시간의 흐름 상에서 서로 겹치게 실행되는 개념입니다. 즉 동시성이란 독립적인 작.. 2023. 12. 31.
[Library] Assertions Assertions Assertions 는 Java 언어를 위한 라이브러리로 런타임 시점에 JDK 타입 검증 기능을 제공합니다. AssertJ에 영감을 받아 제작했습니다. 2023년 11월 27일 기준 Maven Central Repository 에 1.0.0 버전으로 배포 되어 있습니다. 시작하기 Maven io.github.ones1kk assertions 1.0.0 Gradle implementation group: 'io.github', name: 'assertions', version: '1.0.0' Gradle(short) implementation 'io.github.ones1kk:assertions:1.0.0' 먼저 위와 같이 Maven, Gradle 두 가지 Build Tool을 통해 A.. 2023. 11. 27.
[Java] JPMS(Java 9 Platform Module System) JPMS(Java 9 Platform Module System) 출처 JPMS는 Java 애플리케이션의 구조화와 관리를 개선하기 위해 Java 9부터 도입된 시스템입니다. 모듈 시스템은 기존의 패키지 시스템을 보완하고 애플리케이션의 더 나은 모듈화를 가능하게 합니다. 즉 모듈 시스템은 패키지보다 높은 레벨의 집계를 추가할 수 있으며 서로 관련된 패키지 및 리소스(이미지, XML 파일 등)를 한 곳에 묶어 지칭하기 위한 재사용 가능한 고유 명칭을 의미합니다. JDK는 모놀리틱(Monolithic) 라이브러리 대신 약 90개의 플랫폼 모듈로 구성됩니다. 또한 모듈에는 이름이 있으며 관련 코드 및 기타 리소스를 그룹화하고 모듈 디스크립터(module descriptor)로 설명됩니다. 모듈 디스크립터는 mod.. 2023. 10. 23.