본문 바로가기

Java95

[Java] 생성자 패턴 : 점층적 생성자(Telescoping Constroctor), 자바빈즈(Java Beans), 빌더(Builder) 패턴 자바의 생성자 혹은 정적 팩토리 메소드에는 공통적인 제약사항이 있다. 바로 선택할 수 있는 인자가 많을 때 깔끔하게 코드를 작성하기 어렵다는 점이다. 프로그래머들은 전통적으로 이런 상황에 점층적 생성자 패턴(Telescoping constructor pattern)을 즐겨 사용했다. 목차 점층적 생성자 패턴(Telescoping Constructor Pattern) 점층적 생성자 패턴은 생성자의 인자가 점점 많아지는 형태로 코드를 구성하는 방식을 의미한다. 필수 인자만 받는 생성자를 정의하고, 필수 인자에 선택 파라미터를 하나 더 받는 생성자를 생성자, 필수 인자와 선택 인자 두 개를 더 받는 생성자, ... 형태로 모든 선택 인자를 다 받는 생성자까지 만들어나간다. 예제 코드를 보자. (예제는 Effe.. 2023. 11. 17.
[Linux] perf 명령어 사용법 및 예제 - Flame Graph 해석 방법 perf 명령어는 리눅스 커널 프로젝트에서 관리되는 시스템 성능 프로파일링 도구다. perf 명령을 이용해서 특정 프로그램이나 시스템 전체 성능을 분석할 수 있다. perf 명령을 이용해서 성능에 문제를 일으키는 부분이 어디인지를 찾아낼 수 있다. 예를 들어 프로그램의 어떤 함수가 CPU 자원을 많이 소모하고 있는지 알 수 있으며, 코드의 어떤 부분이 메모리 할당을 얼마나 하는지 등을 어셈블리 및 소스코드 레벨로 확인할 수 있다. 커널에서 제공하는 특정 함수가 얼마나 호출되는지도 파악할 수 있다. 목차 perf 설치 perf 명령은 패키지 관리자인 yum을 통해 설치할 수 있다. yum -y install perf 데비안 계열의 리눅스에서는 apt-get을 통해 설치할 수 있다. apt-get insta.. 2023. 11. 8.
블룸필터(Bloom Filter) 개념 소개와 예제 이번 포스트에서는 ‘블룸필터(BloomFilter)’의 개념과 특징을 알아보고 사용 예제를 통해 언제 어떻게 활용할 수 있는지 알아보겠다. 목차 블룸필터(Bloom Filter) HBase, Redis 같은 고성능이 필요한 소프트웨어는 블룸필터(Bloom Filter)라는 자료구조를 사용한다. 블룸필터를 사용하면 불필요한 리소스 소모를 줄일 수 있어 소프트웨어의 전반적인 성능을 끌어 올릴 수 있다. 블룸필터는 집합 내에 특정 원소가 존재하는지를 확인할 수 있는 확률적인 자료구조다. 디스크 입출력이나 네트워크 통신 혹은 스핀락 같은 성능 저하를 유발시킬 수 있는 작업들 앞에 블룸필터를 추가해서 하지 않아도 되는 작업을 건너 뛸 수 있게 해주는 장치다. 블룸필터의 원리 블룸필터의 동작 방식을 그림을 통해 확.. 2023. 6. 1.
[Java] NavigableSet 사용법 및 예제 Java의 NavigableSet 인터페이스는 SortedSet을 상속하는 인터페이스다. Set 인터페이스를 상속한 SortedSet 인터페이스를 상속하고 있기 때문에 NavigableSet 인터페이스를 구현하기 위해서는 Set, SortedSet의 메소드들도 구현해야한다. NavigableSet 이름에서 알 수 있듯이 NavigableSet은 저장되는 엘리먼트들에 Navigation 기능을 더한다. NavigableSet의 JavaDocs를 보면 다음과 같은 설명이 있다. A SortedSet extended with navigation methods reporting closest matches for given search targets. NavigableSet은 SortedSet을 상속하기 때문에.. 2023. 5. 25.
[Java] SortedSet 사용법 및 예제 자바에서 Set은 엘리먼트들의 중복을 제거하기위해 사용된다. 대표적인 구현체로 HashSet이 많이 사용된다. HashSet의 경우 담고 있는 엘리먼트들의 해시 값에 따라 무작위 순서로 순회하게 된다. 반면 SortedSet의 경우 중복을 제거하면서 엘리먼트들의 저장되는 순서를 관리할 수 있다. SortedSet은 이 순서에 따라 엘리먼트들을 순회하게 된다. SortedSet 이름에서 알 수 있듯이 SortedSet은 엘리먼트들을 정렬된 순서로 저장한다. 저장되는 엘리먼트가 Comparable 인터페이스를 구현하고 있다면 compare() 메소드의 로직을 이용하게 되며, SortedSet의 구현체를 생성할 때 Comparator 클래스를 넘겨 엘리먼트들의 대소 비교에 사용할 수 있다. SortedSet은.. 2023. 5. 25.
[Java] NavigableMap 사용법 및 예제 Java NavigableMap 인터페이스는 SortedMap을 상속하는 인터페이스다. Map 인터페이스를 상속한 SortedMap 인터페이스를 상속하고 있기 때문에 Map, SortedMap에 정의되어 있는 메소드를 정의해야한다. NavigableMap NavigableMap은 저장된 Key-Value 엔트리에 Navigation 기능을 더해주고 있다. 즉, SortedMap이므로 Key-Value 엔트리가 정렬된 상태로 저장된다. 여기에 찾고자 하는 Key 값에 가장 가까운 엔트리를 찾는 Navigation 메소드가 추가되었다. NavigableMap의 JavaDocs를 보면 다음과 같이 설명되어 있다. A SortedMap extended with navigation methods returning.. 2023. 5. 25.
[Java] SortedMap 사용법 및 예제 자바에서 Map 인터페이스는 Key와 Value 쌍을 저장하기 위해 사용된다. Map 인터페이스를 상속하여 정의된 SortedMap은 Key와 Value 쌍을 순서를 유지하면서 저장한다. SortedMap Map 인터페이스를 상속하는 SortedMap은 Key-Value 쌍을 정렬된 순서대로 저장한다. Map 인터페이스에서 정의하는 것처럼 Key를 통해 Value를 얻어올 수 있으며, 동시에 정렬된 순서대로 Key-Value 쌍을 순회할 수도 있다. Map에 저장되는 데이터를 순서대로 접근하고 싶은 경우 사용하면 좋다. SortedMap에 저장되는 Key-Value는 Key값의 Natural Order에 맞게 저장된다. Key 클래스가 Comparable 인터페이스를 구현하도록하거나 SortedMap의 .. 2023. 5. 24.
[Java] DelayQueue 사용법 및 예제 자바의 DelayQueue는 java.util.concurrent 패키지에 들어있는 클래스로 AbstractQueue를 상속받고 있으며 BlockingQueue 인터페이스를 구현한다. DelayQueue는 엘리먼트의 딜레이 시간을 기반으로 동작하는 Priority Queue라고 생각하면 된다. 즉 엘리먼트들이 Delay 시간을 기준으로 정렬되어 가장 빨리 딜레이 시간이 끝나는 엘리먼트가 큐의 헤드쪽에 위치한다. 큐에서 엘리먼트를 꺼낼 때, 엘리먼트의 딜레이 시간이 지나지 않았다면 소비할 수 없다. 이후 딜레이 시간이 0보다 작은 숫자가 리턴되면 그 때서야 엘리먼트를 꺼내 쓸 수 있다. DelayQueue 클래스 DelayQueue는 다음과 같은 상속 구조를 가지고 있다. public class Delay.. 2023. 5. 1.
Apple M1 Pro 맥북에 JDK 1.8 설치하기 M1 Pro 맥북에 개발환경을 설치했다. 자바 환경을 설치해야하는데, Oracle JDK는 라이센스 문제가 있어서 사용하지 않는 것으로 가이드되고 있어 OpenJDK를 설치하기로 했다. OpenJDK에도 여러가지 선택지가 있는데 서버환경에서 많이 사용되고 있는 AdoptOpenJDK를 사용하려고 찾아봤더니 애플 실리콘인 M1 Pro의 아키텍처인 arm 아키텍처를 지원하는 JDK는 제공되지 않는 것 같았다. 다른 OpenJDK의 경우 최신 버전은 arm 아키텍처를 지원하지만 내가 써야하는 1.8 버전은 지원되지 않는 경우가 많았다. Azul Zulu 찾아보니 Azul에서 제공하는 Zulu라는 OpenJDK가 있었다. https://www.azul.com/downloads/?package=jdk 로 접속한다.. 2023. 3. 12.