IMCAT.DEV
로그인 가입
Java 중급 디자인패턴

Java 기본적인 디자인 패턴 (Singleton, Factory)

Java 기본적인 디자인 패턴 (Singleton, Factory) — 중급

기본적인 디자인 패턴 (Singleton, Factory)

1. 도입 (왜 배워야 하는가)

디자인 패턴은 소프트웨어 개발에서 발생할 수 있는 일반적인 문제를 해결하기 위한 반복 가능한 솔루션입니다. 특히, Singleton과 Factory 패턴은 객체 지향 프로그래밍에서 매우 중요한 패턴으로, 효율적인 코드 구조와 재사용성을 제공합니다. 이러한 패턴을 이해하지 못하면 코드의 중복, 유지보수의 어려움, 성능 저하와 같은 문제에 직면할 수 있습니다. 예를 들어, 객체를 여러 번 생성해야 할 상황에서 Singleton 패턴을 사용하지 않으면 리소스 낭비가 발생할 수 있습니다.

2. 핵심 개념 설명

Singleton 패턴

Singleton 패턴은 특정 클래스의 인스턴스가 오직 하나만 존재하도록 보장하는 패턴입니다. 이 패턴은 전역 상태를 관리해야 할 때 유용합니다.

  • 비유: 한 집에 하나의 냉장고만 있다고 생각해보세요. 여러 개의 냉장고가 필요하지 않기 때문에, 하나만 만들어서 사용합니다.
  • Factory 패턴

    Factory 패턴은 객체 생성 로직을 클라이언트 코드에서 분리하여, 객체의 생성 방식을 캡슐화하는 패턴입니다. 이 패턴을 사용하면 코드의 유연성이 증가하고, 객체 생성 과정의 변경이 클라이언트 코드에 영향을 미치지 않습니다.

  • 비유: 레스토랑에서 음식을 주문할 때, 요리사가 요리를 만드는 대신 주문을 받아서 요리를 만드는 역할을 하는 주방장이 있습니다. 주방장은 메뉴에 따라 적절한 요리를 만들어냅니다.
  • 디자인 패턴정의사용 예
    Singleton하나의 인스턴스만 허용설정 관리 클래스
    Factory객체 생성 로직 캡슐화다양한 유형의 도형 생성

    3. 기본 코드 예제

    Singleton 패턴

    public class Singleton {
        private static Singleton instance;
    
        private Singleton() {
            // private constructor to prevent instantiation
        }
    
        public static Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }

    실행 결과: 없음 (인스턴스를 생성하기 위해 메서드를 호출해야 함)

  • private static Singleton instance;: Singleton 클래스의 유일한 인스턴스를 저장할 정적 변수를 선언합니다.
  • private Singleton() {}: 외부에서 인스턴스를 생성하지 못하도록 생성자를 private으로 선언합니다.
  • public static Singleton getInstance(): 인스턴스가 없는 경우에만 새로 생성하고, 이미 존재하면 그 인스턴스를 반환합니다.
  • Factory 패턴

    interface Shape {
        void draw();
    }
    
    class Circle implements Shape {
        public void draw() {
            System.out.println("Circle drawn");
        }
    }
    
    class Square implements Shape {
        public void draw() {
            System.out.println("Square drawn");
        }
    }
    
    class ShapeFactory {
        public Shape getShape(String shapeType) {
            if (shapeType == null) {
                return null;
            }
            if (shapeType.equalsIgnoreCase("CIRCLE")) {
                return new Circle();
            } else if (shapeType.equalsIgnoreCase("SQUARE")) {
                return new Square();
            }
            return null;
        }
    }

    실행 결과: 없음 (ShapeFactory를 통해 Shape 객체를 생성해야 함)

  • interface Shape: 도형을 정의하는 인터페이스입니다.
  • Circle과 Square: Shape 인터페이스를 구현한 클래스들입니다.
  • ShapeFactory: 도형 객체를 생성하는 메서드를 포함한 클래스입니다.
  • 4. 실전 활용 예제

    Singleton 예제: 설정 관리 클래스

    쇼핑몰 애플리케이션에서 전역적으로 사용되는 설정을 저장하는 클래스가 필요할 때, Singleton 패턴을 사용하여 설정 클래스의 인스턴스가 하나만 존재하도록 구현할 수 있습니다.

    Factory 예제: 도형 그리기

    그래픽 디자인 프로그램에서 사용자가 선택한 도형을 그리기 위해 Factory 패턴을 활용하면, 사용자가 선택한 도형(예: Circle, Square)에 따라 적절한 객체를 생성하여 그릴 수 있습니다.

    5. 흔한 실수와 주의사항

    Singleton

  • 잘못된 코드:
  • public class Singleton {
        private static Singleton instance = new Singleton();
    
        private Singleton() {}
    
        public static Singleton getInstance() {
            return instance;
        }
    }
  • 문제: 멀티쓰레드 환경에서 안전하지 않음. 여러 스레드가 동시에 접근할 경우 인스턴스가 여러 개 생성될 수 있음.
  • 올바른 코드: 위에서 설명한 Singleton 패턴을 사용하여 인스턴스 생성 시점을 지연시켜야 함.
  • Factory

  • 잘못된 코드:
  • Shape shape = new Circle();  // 직접 객체를 생성
  • 문제: 객체 생성 로직이 클라이언트 코드에 노출되어 유연성이 떨어짐.
  • 올바른 코드: ShapeFactory를 사용하여 객체를 생성해야 함.
  • 6. 정리

  • Singleton 패턴은 클래스의 인스턴스를 하나만 생성하게 해주는 패턴입니다.
  • Factory 패턴은 객체 생성을 클라이언트 코드에서 분리하여 유연성을 높이는 패턴입니다.
  • 디자인 패턴은 소프트웨어 개발에서 유지보수성을 높이고 코드 재사용성을 증가시킵니다.
  • 다음에 학습하면 좋은 주제: Observer 패턴, Strategy 패턴, Decorator 패턴.