본문 바로가기

Language/Java13

[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.
[Java] Enumeration Enumeration 출처 Enum은 고유한 값의 집합을 나타내는 자료형으로 클래스와 비슷한 구조로 선언되며 상수를 정의하고 관리하는데 사용됩니다. 즉 Enum은 변수를 미리 정의하여 상수 집합이 될 수 있도록 해주는 특별한 데이터 유형입니다. Enum이 도입된 Java 5 버전 이전에는 상수를 관리하기 위해 final static 변수를 사용하는 것이 일반적이었습니다. Enum은 이러한 상수 관리를 보다 쉽고 효율적으로 사용할 수 있도록 기능을 제공합니다. 등장 배경 Enum이 등장하기 이전에는 상수를 정의할 때 주로 다음과 같은 방법을 사용했습니다. interface Day { int MONDAY = 1; int TUESDAY = 2; int WEDNESDAY = 3; int THURSDAY = 4;.. 2023. 9. 4.
[Java] 가비지 컬렉션(Garbage Collection) Garbage Collection GC는 자바의 메모리 관리를 자동화하는 메커니즘으로 명시적으로 메모리를 할당하거나 해제하지 않아도 동적으로 사용하지 않는 객체들을 인식하고 제거하는 프로세스입니다. GC의 자동 메모리 관리로 인해 프로그래머들은 메모리 누수 문제, 메모리 관리 등과 같은 문제에서 벗어나 오로지 개발에만 집중 할 수 있게 되었습니다. 하지만 GC는 일시적으로 메모리에 대한 가비지를 수집할 때까지 GC 스레드를 제외한 모든 스레드를 중지하는 Stop the world 이벤트를 진행하는데 이는 오버헤드가 발생돼 프로그램의 응답성이 떨어지는 문제점이 있습니다. GC가 오히려 자주 실행되면 프로그램의 실행 시간이 증가되어 성능상의 이슈가 발생합니다. 따라서 실시간으로 제어하는 것이 중요한 프로그램.. 2023. 8. 21.
[Java] JVM(Java Virtual Machine) JVM 자바(Java) 언어의 실행 환경인 JVM(Java Virtual Machine)은 자바 바이트코드를 실행하는 가상 컴퓨터입니다. JVM은 말 그대로 가상 기계, 즉 가상의 컴퓨터를 물리적 컴퓨터의 메모리 안에 하나 더 구축합니다. 가상이긴 하지만 새로운 가상 컴퓨터를 구축하다보니 더 많은 물리적 CPU 자원과 메모리를 소비하기 때문에 당시 프로그래밍 언어들과 속도를 비교했을 때는 많이 느렸습니다. 하지만 하드웨어의 발전, 하드웨어 구성 요소의 가격 하락, 최적화된 알고리즘으로 개발된 API와 JVM으로 인해 현재는 자바의 성능이 느린 것을 체감하기는 힘듭니다. 자바의 가상 세계는 현실 세계에서 컴퓨터의 물리적인 하드웨어와 운영체제 그리고 그 위에서 구동될 소프트웨어를 가지는 구조를 모방하여 구성.. 2023. 8. 7.