300x250
✍️ 팩토리 메서드 패턴, 패턴 소개 팩토리 메서드 패턴이 해결하려는 문제는, 인스턴스를 생성하는 책임을 구체적인 클래스가 아닌 추상적인 인터페이스의 메서드로 감싸는 것이다. 스토리 텔링으로 이해해 보자. 여기 거북선"만" 만드는 공장인 ShipFactory 클래스가 있다. 이 공장은 거북선만 만들 계획으로 세워진 공장으로 배를 제작하는 static orderShip 메서드는 오직 거북선을 만들기 위해 작성했던 메서드였다. 그런데 얼마 후 사업이 너무 잘 돼서 공장에서 토끼선도 만들 계획이 생겼다. 이제는 orderShip 메서드는 더 이상 거북선만이 아닌 토끼선도 만들 수 있어야 한다. 가장 쉽고 단순한 방법으로, orderShip 메서드 내에서 주문한 배의 이름이 토끼선이라면 거북선과 다른 토끼 로고..
✍️ Runtime, 자바에서 찾아보는 싱글톤 패턴 자바 라이브러리에 들어있는 Runtime의 인스턴스는 싱글톤 패턴으로 제공된다. 아래와 같이 new를 통해선 Runtime의 인스턴스를 절대 만들 수 없다. public class App { public static void main(String[] args) { Runtime runtime = new Runtime(); } } Runtime의 인스턴스는 getRuntime 메서드를 통해서 가져올 수 있다. public class App { public static void main(String[] args) { Runtime runtime = Runtime.getRuntime(); } } 실제로 Runtime 클래스를 타고 가면 이른 초기화 (eage..
✍️ 안전하고 단순한 싱글톤, 열거형 멀티 쓰레드에서 안전하게 싱글톤 패턴을 구현하는 여러 방법들이 존재하고 inner static class 생성 방식은 권장하는 방법 중 하나이다. 하지만 리플렉션에 대응할 수 없다는 단점을 가지고 있다. 만약 리플렉션까지 대응하고 싶다면 열거형을 사용해 싱글톤을 구현할 수 있다. 놀랍게도 열거형을 사용하면 아래 코드가 싱글톤의 전부다. public enum Settings{ INSTANCE; } 열거형은 얼마든지 멤버 변수와 메서드도 정의할 수 있다. public enum Settings{ INSTANCE; private int value = 3; public int getValue() { return value; } } public class App { public..
✍️ 싱글톤을 깨트리는 방법 자바에서 허용하는 문법을 이용하면 싱글톤을 깨트릴 수 있다. 아래 코드에서 몇 가지 자바 문법을 사용하면 settings1과 settings2의 비교 결과가 false가 될 수 있다. public class Settings { private Settings() { } private static class SettingsHolder { private static final Settings INSTANCE = new Settings(); } public static Settings getInstance() { return SettingsHolder.INSTANCE; } } public class App { public static void main(String[] args) { ..
✍️ 멀티 쓰레드에서 안전하지 않은 Singleton Thread A가 if의 조건을 통과하고 new를 하기 전에 Thread B가 if문을 검사한다면 Thread A와 B 모두 인스턴스를 생성하게 된다. 🍊 멀티 쓰레드에서 안전한 싱글톤 패턴 1, synchronized synchronized 키워드를 사용해서 메서드를 동기화하는 방법으로, 한 번에 하나의 쓰레드만 메서드를 통과하게 된다. public static synchronized Settings getInstance() { if (instance == null) { instance = new Settings(); } return instance; } 간단하고 쉬운 방법이지만 단점으로 동기화 처리로 인해 성능의 이슈가 생길 수 있다. 동기화 메커..
✍️ Singleton, 인스턴스를 하나만 제공하는 클래스 싱글톤 패턴은 두 가지 목적이 있다. 1. 클래스의 인스턴스를 오직 하나만 제공한다. 2. 하나만 존재하는 인스턴스의 전역적인 접근점을 제공한다. 예를 들어 어떤 소프트웨어의 환경설정은 오직 한 개만 존재해야 한다. 가령 게임의 환경설정이 여러 개일 때 혼란을 야기할 뿐이다. 🍊 Singleton, 가장 단순한 구현 App 클래스에서 Settings 클래스의 인스턴스를 얼마든지 new를 통해 만들 수 있다. public class Settings { } public class App { public static void main(String[] args) { Settings settings1 = new Settings(); Settings set..