자바 디자인 패턴 – 예제 튜토리얼

소개

디자인 패턴은 소프트웨어 개발자들 사이에서 매우 인기가 있습니다. 디자인 패턴은 공통 소프트웨어 문제에 대한 잘 정의된 해결책입니다.

디자인 패턴 사용의 일부 이점은 다음과 같습니다:

  1. 디자인 패턴은 이미 정의되어 있으며 반복적인 문제 해결에 대한 산업 표준 접근을 제공하므로, 디자인 패턴을 현명하게 사용하면 시간을 절약할 수 있습니다. 우리의 Java 기반 프로젝트에서 사용할 수 있는 많은 Java 디자인 패턴이 있습니다.
  2. 디자인 패턴 사용은 재사용 가능성을 촉진하며 더 강력하고 유지보수가 용이한 코드로 이어집니다. 이는 소프트웨어 제품의 총 소유 비용(TCO)을 줄이는 데 도움이 됩니다.
  3. 디자인 패턴이 이미 정의되어 있기 때문에 코드를 이해하고 디버그하기 쉽습니다. 이로 인해 빠른 개발이 가능하며 새로운 팀 멤버들도 쉽게 이해할 수 있습니다.

Java 디자인 패턴은 생성, 구조, 및 행동 디자인 패턴으로 나뉩니다.

이 기사는 모든 Java 디자인 패턴 기사에 대한 색인 역할을 합니다.

생성 디자인 패턴

창조적인 디자인 패턴은 특정 상황에서 Object를 최상의 방법으로 인스턴스화하는 솔루션을 제공합니다.

1. 싱글톤 패턴

싱글톤 패턴은 Class의 인스턴스화를 제한하고 Java 가상 머신에서 클래스의 인스턴스가 하나만 존재하도록 보장합니다. 싱글톤 패턴의 구현은 항상 개발자들 사이에서 논란이 되었습니다.

2. 팩토리 패턴

팩토리 디자인 패턴은 수퍼클래스에 여러 개의 서브클래스가 있는 경우, 입력에 따라 서브클래스 중 하나를 반환해야 할 때 사용됩니다. 이 패턴은 클라이언트 프로그램의 클래스 인스턴스화 책임을 팩토리 클래스로 옮깁니다. 팩토리 클래스에 싱글톤 패턴을 적용하거나 팩토리 메서드를 static으로 만들 수 있습니다.

3. 추상 팩토리 패턴

추상 팩토리 패턴은 팩토리 패턴과 유사하며 팩토리의 팩토리입니다. Java에서 팩토리 디자인 패턴에 익숙하다면 입력에 따라 다른 하위 클래스를 반환하는 단일 팩토리 클래스가 있음을 알 수 있습니다. 그리고 팩토리 클래스는 이를 달성하기 위해 if-else 또는 switch 문을 사용합니다. 추상 팩토리 패턴에서는 if-else 블록을 제거하고 각 하위 클래스에 대한 팩토리 클래스가 있고 그런 다음 입력 팩토리 클래스에 따라 하위 클래스를 반환하는 추상 팩토리 클래스가 있습니다.

참고: 추상 팩토리 패턴에 대해 더 알아보세요.

4. 빌더 패턴

빌더 패턴은 객체에 많은 속성이 포함되어 있는 경우 팩토리 및 추상 팩토리 디자인 패턴의 일부 문제를 해결하기 위해 도입되었습니다. 이 패턴은 선택적 매개변수의 많은 수와 일관되지 않은 상태 문제를 해결하고 객체를 단계적으로 구축하고 실제로 최종 Object를 반환하는 방법을 제공합니다.

참고: 빌더 패턴에 대해 더 알아보세요.

5. 프로토타입 패턴

프로토타입 패턴은 Object 생성이 비용이 많이 들고 많은 시간과 자원이 필요할 때, 그리고 이미 비슷한 Object가 있는 경우에 사용됩니다. 따라서 이 패턴은 원본 Object를 새로운 Object로 복사한 다음 필요에 따라 수정하는 메커니즘을 제공합니다. 이 패턴은 Java 클론을 사용하여 Object를 복사합니다. 프로토타입 디자인 패턴은 복사하는 Object가 복사 기능을 제공해야 한다고 규정합니다. 다른 클래스에서는 이 작업을 수행해서는 안 됩니다. 그러나 객체 속성의 얕은 복사 또는 깊은 복사를 사용할지 여부는 요구 사항 및 설계 결정에 따라 달라집니다.

참고: 프로토타입 패턴에 대해 더 알아보세요.

구조적 디자인 패턴

구조 디자인 패턴은 Class 구조를 만드는 다양한 방법을 제공합니다(예: 상속과 구성을 사용하여 작은 Object에서 큰 Object를 만드는 것).

1. 어댑터 패턴

어댑터 디자인 패턴은 구조적 디자인 패턴 중 하나로, 두 가지 관련 없는 인터페이스가 함께 작동할 수 있도록 사용됩니다. 이러한 관련 없는 인터페이스를 결합하는 객체를 어댑터라고합니다.

참고: 어댑터 패턴에 대해 더 알아보기 어댑터 패턴.

2. 복합체 패턴

복합체 패턴은 부분-전체 계층구조를 나타내어야 할 때 사용됩니다. 구조를 만들어야 할 때 구조 내의 객체를 동일하게 처리해야 하는 경우, 복합체 디자인 패턴을 적용할 수 있습니다.

참고: 복합체 패턴에 대해 더 알아보기 복합체 패턴.

3. 프록시 패턴

프록시 패턴은 다른 Object에 대한 액세스를 제어하기 위한 자리 표시자를 제공합니다. 이 패턴은 기능에 대한 제어된 액세스를 제공하고자 할 때 사용됩니다.

참고: 프록시 패턴에 대해 더 알아보세요.

4. 플라이웨이트 패턴

플라이웨이트 디자인 패턴은 많은 ClassObject를 생성해야 할 때 사용됩니다. 모든 Object가 메모리 공간을 소비하는데, 이는 저메모리 장치(예: 모바일 장치 또는 임베디드 시스템)에서 중요할 수 있습니다. 플라이웨이트 디자인 패턴은 메모리 부하를 줄이기 위해 Object를 공유함으로써 적용할 수 있습니다.

자바에서의 문자열 풀(String pool) 구현은 플라이웨이트 패턴 구현의 좋은 예입니다.

참고: 플라이웨이트 패턴에 대해 더 알아보세요.

5. 퍼사드 패턴

퍼사드 패턴은 클라이언트 응용 프로그램이 시스템과 쉽게 상호 작용할 수 있도록 돕는 데 사용됩니다.

참고: 퍼사드 패턴에 대해 더 알아보세요.

6. 브리지 패턴

인터페이스 및 구현에서 인터페이스 계층 구조가 있는 경우, 브리지 디자인 패턴은 인터페이스를 구현에서 분리하고 클라이언트 프로그램으로부터 구현 세부 사항을 숨기는 데 사용됩니다. 브리지 디자인 패턴의 구현은 상속보다 구성을 선호하는 개념을 따릅니다.

참고: 브리지 패턴에 대해 더 알아보세요.

7. 데코레이터 패턴

데코레이터 디자인 패턴은 객체의 기능을 런타임에 수정하는 데 사용됩니다. 동시에, 동일한 클래스의 다른 인스턴스에는 영향을 미치지 않으므로 개별 객체는 수정된 동작을 얻게 됩니다. 데코레이터 디자인 패턴은 구조적인 디자인 패턴 중 하나이며 (어댑터 패턴, 브리지 패턴 또는 컴포지트 패턴과 같은), 추상 클래스나 인터페이스와 구성을 사용하여 구현합니다. 우리는 상속이나 구성을 사용하여 객체의 동작을 확장할 수 있지만, 이는 컴파일 타임에 수행되며 클래스의 모든 인스턴스에 적용됩니다. 런타임에서 기존 동작을 추가하거나 제거할 수는 없습니다. 이때 데코레이터 패턴이 유용합니다.

참고: 데코레이터 패턴에 대해 더 알아보세요.

행위 디자인 패턴

행위 패턴은 객체 간의 상호 작용을 개선하고 느슨한 결합과 유연성을 제공하는 솔루션을 제공합니다.

1. 템플릿 메소드 패턴

템플릿 메소드 패턴은 행위 디자인 패턴으로, 메소드 스텁을 만들고 일부 구현 단계를 서브클래스로 연기하는 데 사용됩니다. 템플릿 메소드는 알고리즘을 실행하는 단계를 정의하며, 모든 서브클래스 또는 일부 서브클래스에 대해 일반적 일 수 있는 기본 구현을 제공할 수 있습니다.

참고: 템플릿 메소드 패턴에 대해 더 알아보기.

2. 중재자 패턴

중재자 디자인 패턴은 시스템 내에서 서로 다른 객체 간에 중앙 집중식 통신 매개체를 제공하는 데 사용됩니다. 객체가 직접 상호 작용하는 경우 시스템 구성 요소가 서로 강하게 결합되어 있어 유지 보수 비용이 높아지고 쉽게 확장할 수 없게됩니다. 중재자 패턴은 객체 간 통신을 위해 중재자를 제공하고 객체 간의 느슨한 결합을 구현하는 데 초점을 맞춥니다. 중재자는 객체 간의 라우터 역할을하며 통신 방법을 제공하기 위한 자체 로직을 가질 수 있습니다.

참고: 중재자 패턴에 대해 더 알아보기.

3. 책임 연쇄 패턴

책임 연쇄 패턴은 클라이언트로부터의 요청이 처리되기 위해 객체 체인에 전달되는 소프트웨어 설계에서 느슨한 결합을 달성하는 데 사용됩니다. 그런 다음 체인의 객체는 요청을 처리할 사람을 결정하고 해당 요청이 다음 객체로 전달되어야 하는지 여부를 결정합니다.

우리는 try-catch 블록 코드에서 여러 catch 블록을 가질 수 있다는 것을 알고 있습니다. 여기서 각 catch 블록은 특정 예외를 처리하는 프로세서의 한 종류입니다. 따라서 try 블록에서 예외가 발생하면 첫 번째 catch 블록으로 전송되어 처리됩니다. catch 블록이 처리할 수 없는 경우, 해당 요청을 체인의 다음 Object(즉, 다음 catch 블록)으로 전달합니다. 심지어 마지막 catch 블록도 처리할 수 없는 경우, 예외는 체인 바깥으로 호출 프로그램에게 throw됩니다.

참고: 책임 연쇄 패턴에 대해 더 알아보세요.

4. 관찰자 패턴

Observer 디자인 패턴은 Object의 상태에 관심이 있고 언제든지 변경이 있을 때 알림을 받고 싶을 때 유용합니다. Observer 패턴에서 다른 Object의 상태를 감시하는 Objectobserver라고 하며 감시되는 Objectsubject라고 합니다.

Java는 java.util.Observable 클래스와 java.util.Observer 인터페이스를 통해 Observer 패턴을 구현하기 위한 내장 플랫폼을 제공합니다. 그러나 구현이 제한적이고 Java에서 클래스에 다중 상속을 제공하지 않기 때문에 Observer 패턴을 구현하기 위해 클래스를 확장하는 것은 대부분의 경우에 권장되지 않습니다. Java Message Service (JMS)는 중재자 패턴과 함께 Observer 패턴을 사용하여 애플리케이션이 다른 애플리케이션에 데이터를 구독하고 발행할 수 있도록 합니다.

참고: Observer 패턴에 대해 더 알아보세요.

5. 전략 패턴

전략 패턴은 특정 작업에 대해 여러 알고리즘이 있는 경우에 사용되며 클라이언트는 런타임에 사용할 실제 구현을 결정합니다. 전략 패턴은 또한 정책 패턴으로 알려져 있습니다. 여러 알고리즘을 정의하고 클라이언트 애플리케이션이 사용할 알고리즘을 매개변수로 전달하도록 합니다.

이 패턴의 최고의 예는 Collections.sort() 메소드로, Comparator 매개변수를 사용합니다. Comparator 인터페이스의 다양한 구현에 따라 객체들은 다른 방식으로 정렬됩니다.

참고: 전략 패턴에 대해 더 알아보세요.

6. 커맨드 패턴

커맨드 패턴은 요청-응답 모델에서 느슨한 결합을 구현하기 위해 사용됩니다. 이 패턴에서 요청은 호출자로 전송되고, 호출자는 캡슐화된 커맨드 객체에게 전달합니다. 커맨드 객체는 요청을 특정 동작을 수행하기 위해 수신자의 적절한 메소드에 전달합니다.

참고: 커맨드 패턴에 대해 더 알아보세요.

7. 상태 패턴

상태 디자인 패턴은 내부 상태에 따라 객체의 동작이 변경될 때 사용됩니다. 객체의 상태에 따라 동작을 변경해야 할 때, 객체에 상태 변수를 가질 수 있고 상태에 따라 다른 동작을 수행하기 위해 if-else 조건 블록을 사용할 수 있습니다. 상태 패턴은 이를 위해 컨텍스트와 상태 구현을 통해 체계적이고 느슨하게 결합된 방식을 제공하는 데 사용됩니다.

참고: 상태 패턴에 대해 더 알아보세요.

8. 방문자 패턴

방문자 패턴은 유사한 종류의 객체 그룹에 대해 작업을 수행해야 할 때 사용됩니다. 방문자 패턴을 사용하면 객체에서 작업 논리를 다른 클래스로 이동할 수 있습니다.

참고: 방문자 패턴에 대해 더 알아보세요.

9. 해석자 패턴

해석자 패턴은 언어의 문법적 표현을 정의하고 이 문법을 처리하는 해석자를 제공하는 데 사용됩니다.

10. 반복자 패턴

반복자 패턴은 행동 패턴 중 하나로, 객체 그룹을 횡단하는 표준 방법을 제공하는 데 사용됩니다. 반복자 패턴은 Java Collection Framework에서 널리 사용되며 반복자 인터페이스는 Collection을 횡단하기 위한 메서드를 제공합니다. 이 패턴은 우리의 요구에 따라 다양한 종류의 반복자를 제공하는 데도 사용됩니다. 반복자 패턴은 Collection을 횡단하는 실제 구현을 숨기고 클라이언트 프로그램이 반복자 메서드를 사용하도록 합니다.

참고: 반복자 패턴에 대해 더 알아보세요.

11. 메멘토 패턴

메멘토 디자인 패턴은 객체의 상태를 저장하고 나중에 복원하고 싶을 때 사용됩니다. 이 패턴은 객체의 저장된 상태 데이터가 Object 외부에서 접근할 수 없도록 구현하는 데 사용됩니다. 이는 저장된 상태 데이터의 무결성을 보호합니다.

Memento 패턴은 두 개의 Objectoriginatorcaretaker로 구현됩니다. 원본은 저장 및 복원해야 하는 Object이며, 내부 클래스를 사용하여 Object의 상태를 저장합니다. 내부 클래스는 “Memento”라고 불리며, 다른 객체에서 접근할 수 없도록 private로 지정됩니다.

기타 디자인 패턴

강의 네 디자인 패턴에 속하지 않는 많은 디자인 패턴이 있습니다. 이제 이러한 인기 있는 디자인 패턴 중 일부를 살펴보겠습니다.

1. DAO 디자인 패턴

데이터 액세스 객체 (DAO) 디자인 패턴은 데이터 지속성 로직을 별도의 레이어로 분리하는 데 사용됩니다. DAO는 데이터베이스와 함께 작동하는 시스템을 설계할 때 매우 인기 있는 패턴입니다. 아이디어는 서비스 레이어를 데이터 액세스 레이어와 분리하여 응용 프로그램에서 로직을 분리하는 것입니다.

참고: DAO 패턴에 대해 자세히 알아보세요.

2. 의존성 주입 패턴

의존성 주입 패턴을 사용하면 하드 코딩된 의존성을 제거하여 응용 프로그램을 느슨하게 결합되고 확장 가능하며 유지보수 가능하게 만들 수 있습니다. 우리는 Java에서 의존성 주입을 구현하여 의존성 해결을 컴파일 시간에서 실행 시간으로 이동할 수 있습니다. Spring 프레임워크는 의존성 주입의 원리에 기반하고 있습니다.

참고: 의존성 주입 패턴에 대해 더 알아보세요.

3. MVC 패턴

모델-뷰-컨트롤러 (MVC) 패턴은 웹 애플리케이션을 만들기 위한 가장 오래된 아키텍처 패턴 중 하나입니다.

결론

이 글은 Java 디자인 패턴을 요약한 것입니다.

GitHub 저장소에서 Java 디자인 패턴 예제 코드를 확인할 수 있습니다.

계속해서 학습을 진행하고 더 많은 Java 자습서를 참고하세요.

Source:
https://www.digitalocean.com/community/tutorials/java-design-patterns-example-tutorial