본문 바로가기

자바32

[Java] 생성자 패턴 : 점층적 생성자(Telescoping Constroctor), 자바빈즈(Java Beans), 빌더(Builder) 패턴 자바의 생성자 혹은 정적 팩토리 메소드에는 공통적인 제약사항이 있다. 바로 선택할 수 있는 인자가 많을 때 깔끔하게 코드를 작성하기 어렵다는 점이다. 프로그래머들은 전통적으로 이런 상황에 점층적 생성자 패턴(Telescoping constructor pattern)을 즐겨 사용했다. 목차 점층적 생성자 패턴(Telescoping Constructor Pattern) 점층적 생성자 패턴은 생성자의 인자가 점점 많아지는 형태로 코드를 구성하는 방식을 의미한다. 필수 인자만 받는 생성자를 정의하고, 필수 인자에 선택 파라미터를 하나 더 받는 생성자를 생성자, 필수 인자와 선택 인자 두 개를 더 받는 생성자, ... 형태로 모든 선택 인자를 다 받는 생성자까지 만들어나간다. 예제 코드를 보자. (예제는 Effe.. 2023. 11. 17.
[Java] DelayQueue 사용법 및 예제 자바의 DelayQueue는 java.util.concurrent 패키지에 들어있는 클래스로 AbstractQueue를 상속받고 있으며 BlockingQueue 인터페이스를 구현한다. DelayQueue는 엘리먼트의 딜레이 시간을 기반으로 동작하는 Priority Queue라고 생각하면 된다. 즉 엘리먼트들이 Delay 시간을 기준으로 정렬되어 가장 빨리 딜레이 시간이 끝나는 엘리먼트가 큐의 헤드쪽에 위치한다. 큐에서 엘리먼트를 꺼낼 때, 엘리먼트의 딜레이 시간이 지나지 않았다면 소비할 수 없다. 이후 딜레이 시간이 0보다 작은 숫자가 리턴되면 그 때서야 엘리먼트를 꺼내 쓸 수 있다. DelayQueue 클래스 DelayQueue는 다음과 같은 상속 구조를 가지고 있다. public class Delay.. 2023. 5. 1.
[Java] Java Reflection 소개 및 사용법, 예제 자바 리플렉션(Java Reflection)은 구체적인 클래스의 타입을 알지 못하는 상황에서그 클래스에 구현되어 있는 메소드와 필드 등의 정보, 즉 클래스의 구조를 확인할 수 있도록 자바가 제공해주는 API다. 리플렉션은 자바에서 제공해주는 API이기 때문에 별도의 jar 파일을 포함하거나 Maven 의존성을 추가하지 않아도 사용할 수 있다. 일반적으로 자바 리플렉션은 많이 사용되지는 않는다. 다만 프레임워크(Frame Work) 소프트웨어를 작성하거나 IDE 같은 소프트웨어를 작성하는 경우 사용자가 나중에 어떤 타입의 클래스를 사용할지 소프트웨어를 작성하는 당시에는 알지 못하는 경우가 많이 있다. 이 때, 런타임에 사용자가 넘겨준 클래스의 정보를 분석해서 동작할 수 있도록 리플렉션을 이용해 코드를 작성.. 2022. 8. 12.
[Java] 메모리 가시성(Visibility) 소스코드의 특정 블럭을 동기화시키고자 할 때, 항상 메모리 가시성(Memory Visibility) 문제가 발생한다. 특정 변수의 값을 사용하고 있을 때 다른 스레드가 그 변수의 값에 접근하지 못하도록 막아야 하는 ‘상호배제’도 중요하지만 값을 수정한 다음 동기화 블록을 빠져나가고 나면 다른 스레드가 변경된 값을 즉시 사용할 수 있어야 하는 ‘가시성(Visibility)’도 중요하다. 메모리 가시성(Memory Visibility) 싱글 스레드 환경에서는 프로그램의 코드가 특정 변수에 값을 수정한 다음 다시 그 변수의 값에 접근해보면 이전에 수정한 값을 다시 가져올 수 있다. 멀티 스레드 환경에서는 반드시 수정한 값을 읽는 것이 보장되지는 않는다. 공유 변수에 대해서 어떤 스레드가 값을 수정했을 때, 그.. 2022. 5. 15.
[Java] 스레드 안전성(Thread Safety) 이전 포스트에서 자바는 멀티 스레드를 지원하여 여러 작업들을 동시에 실행할 수 있다고 했다. (링크 : [Java] 자바 병렬 프로그래밍 - 멀티 스레드의 장단점) 요즘 출시되는 CPU들은 기본적으로 여러개의 코어를 탑재하고 있다. 따라서 멀티 스레드들은 동시에 다른 코어에서 병렬적으로 실행될 수 있다. 문제는 이 스레드들이 동시에 같은 데이터에 접근할 때 발생한다. 스레드 안전(Thread-Safe) 조금 따분한 주제일 수도 있지만 '스레드 안전(Thread-safe)'에 대해서 정리를 하고 넘어가야 한다. 자바 클래스는 어떻게 동작해야하는지에 대한 '클래스 명세(Class Specification)'를 가지고 있다. 잘 정의된 클래스 명세는 객체의 상태를 제약하는 '불변조건(Invariants)'와 .. 2022. 3. 31.
[Java] 스레드 그룹(Thread Group) JVM에서 생성되는 스레드들은 모두 어떤 스레드 그룹(Thread Group)에 속해 있다. 스레드 그룹은 연관되어 있는 스레드들을 묶어서 관리하기 위해 사용된다. JVM이 시작되면 system 스레드 그룹이 생성된다. GC를 담당하는 Finalizer 스레드를 비롯하여 JVM 운영에 필요한 몇 가지 스레드들이 생성되어 system 그룹에 포함된다. 이후 system 스레드 그룹의 하위 그룹으로 main 스레드 그룹이 생성되고, main 메서드를 실행하는 main 스레드가 포함된다. 새로운 스레드를 생성할 때, 스레드 그룹을 지정할 수 있다. 만약 스레드가 포함될 스레드 그룹을 지정하지 않았다면 스레드를 생성하는 스레드가 포함된 스레드 그룹에 기본적으로 속하게 된다. 스레드 그룹 확인 특정 스레드가 어떤.. 2022. 2. 26.
[Java] 데몬 스레드(Daemon Thread) 의미와 예제 자바에서 스레드는 일반 스레드와 데몬(Daemon) 스레드로 구분할 수 있다. 일반 스레드는 보통 우리가 아는 스레드의 개념이다. 그렇다면 데몬 스레드는 어떤 스레드이며, 일반 스레드와 어떤 점이 다른지 알아보자. 데몬 스레드(Daemon Thread) 데몬 스레드(Daemon Thread)는 우선 순위가 낮은 스레드로 백그라운드에서 사용자의 애플리케이션을 보조하는 역할을 수행하는 스레드다. 대표적인 데몬 스레드로는 JVM에 생성된 객체들의 메모리 공간을 회수하는 GarbageCollection을 수행하는 스레드가 있다. 데몬 스레드가 일반 스레드와 비교해서 가장 크게 다른 점은 프로그램이 종료할 경우에 발생한다. 사용자의 애플리케이션이 종료될 때, 사용자가 생성한 모든 일반 스레드의 수행이 모두 종료되.. 2022. 2. 14.
[Java] 프리마커 템플릿 언어(FTL, Freemarker Template Language) 문법 자바 템플릿 엔진(Java Template Engine)인 프리마커(Freemarker)는 FTL(Freemarker Template Language)라는 언어를 통해 템플릿을 작성할 수 있도록 한다. FTL에는 간단한 데이터 치환뿐만 아니라 조건문이나 반복문 같은 다양한 문법과 기능이 구현되어 있다. 따라서 FTL 문법을 잘 알고 있으면 효율적으로 템플릿을 작성할 수 있다. FTL의 모든 문법이나 정확한 기능에 대해서는 Freemarker 매뉴얼을 참고하도록 하자. 이 포스트에서는 자주 사용하는 FTL 문법과 기능을 소개하고 간단한 사용법을 예제를 통해 설명하겠다. assign 템플릿 작성시 변수를 사용하고 싶을 때, assign 디렉티브를 사용할 수 있다. 예를 들어 this code block as.. 2021. 7. 15.
[Java] 프리마커(Freemarker) - 자바 템플릿 엔진(Java Template Engine) 프리마커는 아파치 오픈소스로 공개되어 있는 자바 템플릿 엔진(Java Template Engine)이다. 템플릿 엔진(Template Engine)이란? 템플릿 엔진(Template Engine)이란 데이터 모델에서 정보를 얻어 템플릿 양식에 맞게 문서를 만들어주는 소프트웨어를 말한다. 템플릿 엔진의 사용자는 템플릿 정의 언어를 이용해서 문서화할 템플릿을 생성하고 템플릿 엔진에 입력한 다음 데이터 모델을 차례로 템플릿 엔진에 입력하여 문서를 만들어낸다. 템플릿 엔진 사용의 대표적인 예는 '웹 템플릿 엔진(Web template engine)'이다. 웹 페이지의 전체적인 아웃라인을 템플릿으로 만들어놓고, 페이지에 보여줄 상세한 데이터를 이용해 구체적인 HTML 문서를 만들어주는 형태로 템플릿 엔진이 사용된.. 2021. 7. 14.