반응형
 

디자인 패턴: 개념과 활용

소프트웨어 개발에서 **디자인 패턴(Design Pattern)**은 자주 발생하는 문제에 대한 반복 가능하고 검증된 해결책을 제공합니다. 디자인 패턴은 코드의 유지보수성, 확장성, 재사용성을 높이는 데 중요한 역할을 합니다. 이 글에서는 디자인 패턴의 개념, 주요 종류, 그리고 자바(Java)에서의 활용 방법과 예제를 살펴보겠습니다.


디자인 패턴이란?

디자인 패턴은 소프트웨어 설계에서 반복적으로 사용되는 최적의 해결책을 캡슐화한 것입니다. 이는 특정 문제를 해결하기 위해 구조화된 방식으로 설계되어 있어, 코드를 간결하고 일관성 있게 유지할 수 있습니다.

디자인 패턴의 특징:
  1. 일반화된 솔루션: 특정 상황에 맞게 적용할 수 있는 추상적인 개념.
  2. 언어 독립적: 특정 프로그래밍 언어에 종속되지 않음.
  3. 협업 향상: 팀 내의 공통된 설계 언어로 사용 가능.

디자인 패턴의 주요 종류

디자인 패턴은 일반적으로 생성 패턴, 구조 패턴, 행위 패턴의 세 가지 그룹으로 나뉩니다.

1. 생성 패턴 (Creational Patterns)
  • 객체 생성 메커니즘을 제공하여 객체 생성 과정을 캡슐화.
  • 예: 싱글톤(Singleton), 팩토리(Factory), 빌더(Builder), 프로토타입(Prototype).
2. 구조 패턴 (Structural Patterns)
  • 클래스와 객체를 구성하여 큰 구조를 형성.
  • 예: 어댑터(Adapter), 브리지(Bridge), 데코레이터(Decorator), 프록시(Proxy).
3. 행위 패턴 (Behavioral Patterns)
  • 객체 간의 상호작용과 책임 분배를 정의.
  • 예: 옵저버(Observer), 전략(Strategy), 커맨드(Command), 템플릿 메서드(Template Method).

자바에서의 디자인 패턴 활용 예시

1. 싱글톤 패턴 (Singleton Pattern)

싱글톤 패턴은 클래스의 인스턴스가 하나만 존재하도록 보장합니다. 주로 설정 클래스, 로깅, 데이터베이스 연결에 사용됩니다.

예제:
public class Singleton {
    private static Singleton instance;

    private Singleton() {
    // private 생성자
	}

	public static Singleton getInstance() {
        if (instance == null) {
	        instance = new Singleton();
        }
        return instance;
    }
}

public class Main {
    public static void main(String[] args) {
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();

        System.out.println(s1 == s2); // true
	}
}
2. 팩토리 패턴 (Factory Pattern)

팩토리 패턴은 객체 생성 로직을 별도의 팩토리 클래스에 위임합니다.

예제:
interface Animal {
	void speak();
}

class Dog implements Animal {
    public void speak() {
	    System.out.println("멍멍!");
    }
}

class Cat implements Animal {
    public void speak() {
	    System.out.println("야옹!");
    }
}

class AnimalFactory {
    public static Animal getAnimal(String type) {
        if ("dog".equalsIgnoreCase(type)) {
	        return new Dog();
        } else if ("cat".equalsIgnoreCase(type)) {
	        return new Cat();
        }
        return null;
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = AnimalFactory.getAnimal("dog");
        animal.speak();
    }
}
3. 옵저버 패턴 (Observer Pattern)

옵저버 패턴은 한 객체의 상태 변화가 다른 객체에 자동으로 통보되도록 설계합니다.

예제:
import java.util.ArrayList;
import java.util.List;

interface Observer {
	void update(String message);
}

class Subscriber implements Observer {
    private String name;

    public Subscriber(String name) {
	    this.name = name;
    }

    public void update(String message) {
	    System.out.println(name + " received: " + message);
    }
}

class Publisher {
    private List<Observer> observers = new ArrayList<>();

    public void subscribe(Observer observer) {
	    observers.add(observer);
    }

    public void notifyObservers(String message) {
        for (Observer observer : observers) {
	        observer.update(message);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Publisher publisher = new Publisher();

        Observer sub1 = new Subscriber("Subscriber 1");
        Observer sub2 = new Subscriber("Subscriber 2");

        publisher.subscribe(sub1);
        publisher.subscribe(sub2);

        publisher.notifyObservers("새 소식이 도착했습니다!");
    }
}
출력 결과:
 
Subscriber 1 received: 새 소식이 도착했습니다!
Subscriber 2 received: 새 소식이 도착했습니다!

마치며

디자인 패턴은 자바 개발에서 구조적이고 효율적인 코드를 작성하는 데 필수적인 도구입니다. 각 패턴의 특징과 사용 사례를 이해하면 문제 해결 능력을 크게 향상시킬 수 있습니다. 다양한 패턴을 프로젝트에 적용해 보고, 상황에 맞는 설계를 통해 더 나은 소프트웨어를 만들어 보세요!

 
반응형

+ Recent posts