들어가며
이번 포스트에서는 디자인 패턴에 대해서 알아보겠습니다.
글이 길어 패턴의 자세한 내용은 다음 포스트에서 다룹니다.
디자인 패턴이란?
소프트웨어 설계에서 자주 발생하는 문제들을 해결하기 위한 일반적인 해결책입니다.
개발자들이 반복적으로 발생하는 설계 문제들을 해결하기 위해 미리 만들어 놓은 청사진과 같다고 생각하면 됩니다.
에초에 디자인 - 설계 라는 의미로 사용되니까요.
이전에 포스팅한 내용들과도 연관되어 설명해볼 수 있습니다.
자바란? 객체지향을 잘 하기 위한 언어
이런 자바를 잘 만들기 위한 도구 : OOP의 4대 특성 , 캡슐화 , 상속, 추상화 , 다형성
그리고 이런 도구를 잘 다루기 위한 사용법 : SOLID - 단일 책임, 오픈 클로즈 , 리스코프 치환 , 인터페이스 분리 , 의존 역전 원칙
그리고 이런 사용법을 활용 할 수 있는 레시피 : 디자인 패턴
이렇게 정리해보면 연결 관계가 보입니다.
디자인 패턴을 비유해보면 마치 음식의 레시피 와도 같습니다.
예로 떡볶이를 만든다고 가정하면 앞서 다양한 사람들이 떡볶이를 만들기 위해 수많은 레시피를 만들었고, 이 중 좋은 레시피만 남겨 많은 사람들이 사용합니다.
디자인 패턴도 앞서 다양한 개발자들의 수많은 수행 착오 끝에 어떤 문제점을 해결하는 방법을 정리해둔 것이라고 말할 수 있습니다.
디자인 패턴은 정말 다양해서 우선 종류부터 구분하고 시작해보겠습니다.
디자인 패턴의 종류
- 생성 패턴: 객체 생성 방식을 정의하는 패턴입니다.
- 구조 패턴: 객체 간의 관계를 정의하는 패턴입니다.
- 행동 패턴: 객체 간의 상호 작용 방식을 정의하는 패턴입니다.
디자인 패턴을 자바에 적용해보면 결국 객체 지향을 하는 방법 중 일부를 사용하는데
상속 , 인터페이스 , 합성 을 이용합니다.
합성이란 , 객체를 속성으로 사용하는 것을 말합니다.
따라서 각 패턴마다 유사한 점이 많이 보이는데요.
일단 개념적인 부분을 정리해보겠습니다.
생성패턴
객체 생성 방식을 정의하는 디자인 패턴입니다.
이는 객체 생성 과정을 추상화 하여 코드의 재사용성, 유지 관리성, 확장성을 향상시키는 데 도움을 줍니다.
우리가 앞서 다루었던 인터페이스 또한 추상화와 관련이 있죠
- 싱글톤 패턴: 시스템 전체에서 유일한 객체를 생성해야 하는 경우 사용합니다. 예를 들어, 데이터베이스 연결 객체, 로그 관리 객체 등에 활용될 수 있습니다.
- 팩토리 메서드 패턴: 구체적인 객체 생성 방식을 캡슐화하고 클라이언트 코드에서 분리해야 하는 경우 사용합니다. 예를 들어, 데이터베이스 연결 객체, 문서 처리 객체 등을 생성하는 데 활용될 수 있습니다.
- 추상 팩토리 패턴: 객체 생성에 대한 인터페이스를 제공하고, 플랫폼 또는 환경에 따라 구체적인 객체 생성 방식을 변경할 수 있도록 하는 패턴입니다. 예를 들어, 운영 체제에 따라 GUI 컴포넌트를 생성하는 데 활용될 수 있습니다.
- 빌더 패턴: 복잡한 객체를 단계별로 생성해야 하는 경우 사용합니다. 예를 들어, 문서, 메시지, 쿼리 등을 단계별로 구성하여 생성하는 데 활용될 수 있습니다.
- 프로토타입 패턴: 기존 객체를 복제하여 새로운 객체를 생성해야 하는 경우 사용합니다. 예를 들어, 게임 캐릭터, 문서 템플릿 등을 복제하여 새로운 객체를 생성하는 데 활용될 수 있습니다.
구조 패턴
구조 패턴은 클래스와 객체를 조합하여 더 큰 구조를 만드는 데 사용하는 디자인 패턴입니다.
- 어댑터 패턴: 서로 다른 인터페이스를 가진 객체들을 연결하여 함께 사용할 수 있도록 하는 패턴입니다. 예를 들어, 다른 API를 사용하는 두 라이브러리를 함께 사용해야 하는 경우 어댑터 패턴을 사용할 수 있습니다.
- 브릿지 패턴: 추상화와 구현을 분리하여 추상화 부분을 변경하지 않고 구현 부분을 변경할 수 있도록 하는 패턴입니다. 예를 들어, GUI 컴포넌트의 외관과 기능을 분리하여 외관만 변경하면서 기능은 유지할 수 있습니다.
- 컴포지트 패턴: 0개 이상의 객체를 묶어 하나의 객체처럼 사용할 수 있도록 하는 패턴입니다. 예를 들어, 메뉴 트리를 구성하는 데 컴포지트 패턴을 사용할 수 있습니다.
- 데코레이터 패턴: 기존 객체의 기능을 추가하거나 변경하지 않고 새로운 기능을 추가할 수 있도록 하는 패턴입니다. 예를 들어, 로그 기능을 추가하거나 테마를 변경하는 데 데코레이터 패턴을 사용할 수 있습니다.
- 퍼사드 패턴: 복잡한 시스템의 인터페이스를 단순화하여 사용하기 쉽게 만드는 패턴입니다. 예를 들어, 여러 API를 사용하는 시스템을 하나의 간단한 인터페이스로 제공하는 데 퍼사드 패턴을 사용할 수 있습니다.
- 프록시 패턴: 실제 객체에 대한 접근을 제어하고, 접근 비용을 줄이고, 보안을 강화하는 데 사용하는 패턴입니다. 예를 들어, 원격 객체에 대한 접근을 제어하거나 이미지를 로딩하는 데 프록시 패턴을 사용할 수 있습니다.
행위패턴
행위 패턴은 객체 간의 상호 작용 방식을 정의하는 디자인 패턴입니다.
객체들이 서로 어떻게 통신하고 협력 하는지를 정의합니다.
- 옵저버 패턴: 객체의 상태 변화를 관찰하고 관찰자에게 알리는 패턴입니다. 예를 들어, GUI 컴포넌트의 상태 변화를 관찰하거나, 데이터베이스의 변화를 관찰하는 데 활용될 수 있습니다.
- 이터레이터 패턴: 컬렉션의 항목을 순회하는 방법을 추상화하여 컬렉션 구현 방식에 의존하지 않고 순회할 수 있도록 하는 패턴입니다. 예를 들어, 리스트, 배열, 맵 등의 항목을 순회하는 데 활용될 수 있습니다.
- 메멘토 패턴: 객체의 상태를 저장하고 이전 상태로 복원할 수 있도록 하는 패턴입니다. 예를 들어, 문서 편집 작업에서 이전 버전으로 복원하거나, 게임에서 이전 상태로 복원하는 데 활용될 수 있습니다.
- 전략 패턴: 알고리즘을 객체로 표현하여 알고리즘을 쉽게 변경하고 확장할 수 있도록 하는 패턴입니다. 예를 들어, 정렬 알고리즘, 검색 알고리즘 등을 변경하는 데 활용될 수 있습니다.
- 템플릿 메서드 패턴: 알고리즘의 뼈대를 정의하고, 일부 부분은 하위 클래스에서 구현하도록 하는 패턴입니다. 예를 들어, 데이터 처리 과정, GUI 컴포넌트의 렌더링 과정 등에 활용될 수 있습니다.
이렇게 많은 패턴들이 존재하는데요.
제가 부족한 것이기도 하지만 저는 각 패턴에 대해 개략적으로만 생각하고 있는 것 같습니다.
보통 코딩을 하다 문제가 생기면 어떤 식으로 해결해볼까 접근할 때 관련된 내용을 읽어보고
선택을 하는데요.
정처기 시험을 준비하면서 한번 외운 경험이 있긴 한데 몇 주 지나니 또 기억이 안나더 라구요 ㅋㅋ
어쨋든 외우려고 하는 것보다는 아 이럴때 이런거 있었는데 라고 생각하는 수준으로 알아두시면
좀 더 도움이 되지 않을까 싶습니다.
'JAVA' 카테고리의 다른 글
JAVA - 객체지향에서의 디자인패턴 (0) | 2024.06.04 |
---|---|
JAVA String 에 대하여 (1) | 2024.06.04 |
JAVA - SOLID에 대하여 (0) | 2024.06.03 |
JAVA-어노테이션에 대하여 (0) | 2024.06.03 |
JAVA - 결합도에 대하여 (0) | 2024.06.03 |