억대 연봉을 위한 인간수업
Published 2023. 3. 19. 21:33
JAVA 디자인 패턴 Develop/Java
반응형

 

디자인 패턴이란?

  •  시스템 개발 시 공통적으로 발생하는 문제점을 해결하기 위한 방법으로, 개발에 대한 템플릿이다.

 

근데 왜 공부해야 하나요?

완성된 코드를 보면 한 줄 한 줄 분석하기엔 그 양이 너무 많아 이해하기 어렵기도 하고, 특정 코드를 왜 이렇게 짜여 있나 전체적인 이해를 하기 위해서 디자인 패턴을 공부해야 한다.

 

디자인 패턴의 종류

1. 생성 패턴

1-1. Factory Pattern

  • 객체 생성을 위해 인터페이스 정의 시 어떤 클래스의 인스턴스를 만들지에 대해 서브 클래스에서 결정하게 만드는 패턴
  • 부모 클래스에 알려지지 않은 구체 클래스를 생성하는 패턴으로, 자식 클래스가 어떤 객체를 생성할지 결정하도록 하는 패턴
  • 객체 생성 코드를 분리해 클라이언트 코드와 결합도를 낮추기 위한 패턴
  • 수정이 일어날 가능성이 큰 부분과 그렇지 않은 부분을 분리하는 게 좋다
  • Spring의 경우 정말 많은 팩토리 패턴을 사용 한다

 

1-2. Builder Pattern

  • 객체를 생성 클래스와 표현 클래스를 분리해 서로 다른 표현을 생성하는 방법을 제공
  • 동일한 프로세스를 거쳐 다양한 구성의 인스턴스를 만드는 방법
  • Java에는 default parameter(기본 매개변수)가 없어서, 생성자의 모든 파라미터를 다 채운 뒤 호출할 수 있다.
  • 그래서 이런 복잡도를 해결하기 위해 사용하는 Java 한정 디자인 패턴

 

1-3. Singleton Pattern

  • 프로세스 내에서 단 한 개만 만들어져야 할 때 사용하는 패턴
  • Java는 전역 변수를 사용할 수 없다. 그래서 객체를 딱 하나만 생성해야 할 때 사용하는 패턴으로 어디에서든 참조할 수 있게 하는 패턴
  • 생성자를 private으로 변경해서 다른 클래스에서 new로 생성할 수 없게 함
  • 클래스 안에 자신의 타입을 갖는 객체를 선언한다
  • static 아닌 변수는 객체가 생성될 때마다 동적공간에 메모리가 할당되지만, static 변수는 메모리가 지정된 정적 공간에 딱 하나만 존재한다 (컴파일 할 때부터)
  • static 메소드는 이미 메모리의 정적 공간에 자리를 차지하고 있으므로 해당 객체를 new로 생성하지 않고 바로 불러서 사용 가능
  • 크롬의 다크모드 같이 딱 하나의 값이 고정돼야 하는 경우 사용

 

2. 구조패턴

2-1.Proxy Pattern

  • 프록시는 대리인이라는 뜻으로 무언가를 대신 처리한다는 의미
  • 어떤 객체를 사용하고자 할 때 직접 객체를 참조하는 게 아니라 대리인을 통해 객체에 접근하는 방식
  • 백엔드에선 객체 선언을 할 때 이 객체의 코드를 변경하지 않고 기능을 부여하기 위해 사용 

 

2-2. Composite Pattern(컴포지트 패턴)

  • 복합 객체나 단일 객체를 동일하게 취급하는 것이 목적인 패턴으로, 합성한 객체들의 집합
  • 객체들의 관계를 트리 구조로 작성하여 전체-부분 계층을 표현하는 패턴
  • 객체의 상위, 하위 체계의 파악이 가능하고 1:1,N:1을 처리하는 데도 유용
  • 컴포지트 패턴은 컴퓨터의 폴더 시스템을 생각하면 된다. 폴더 시스템은 폴더 안에 폴더가 있을 수도 있고, 파일도 있을 수 있으며 구조가 트리 형식이다.

 

2-3. Adapter Pattern

  • 한 클래스의 인터페이스를 사용하려는 다른 인터페이스로 변환할 때 사용
  • 주로 인터페이스 호환성이 맞지 않아 발생하는 문제를 해결하기 위해 사용하며, 같이 쓸 수 없는 클래스들을 연결해서 사용하는 것이 가능하다
  • 기존 코드를 재사용하기 위해 내적, 외적 구조를 변환하는 작업을 처리한다.

 

2-4. Decorator Pattern

  • 객체에 결합을 통해 기능을 동적으로 유연하게 환장할 수 있게 해주는 패턴
  • 데코레이터는 서브 클래스를 만드는 것을 통해 기능을 유연하게 확장할 수 있는 방법 제공
  • 간단하게 용도에 따라 어떤 객체에 기능을 동적으로 추가하는 패턴
  • 클래스를 하나 만들고 오버라이드로 상속을 받는걸 전부 데코레이터 패턴이라 보면 된다.

 

 

3. 행위패턴

3-1. Observer Pattern

  • 객체의 상태 변화를 관찰하는 관찰자들로 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 통지하는 패턴
  • 어떤 객체의 변경 사항이 발생했을 때 이와 연관된 객체들에게 알려주는 패턴
  • 근데 1:1 이 될 수도 있고 1:N이 될 수도 있음
  • 단, 옵저버 패턴은 매우 유명하지만 백엔드에선 사용하지 않는다..!

 

3-2. Strategy Pattern

  • 행위를 클래스로 캡슐화해 동적으로 행위를 자유롭게 바꿀 수 있게 해주는 패턴
  • 전략을 쉽게 바꿀 수 있도록 해주는 디자인 패턴
  • 간단하게 설정을 코드가 아니라 data, 클래스로 만들었다고 생각하면 됨

 

3-3. Template Method Pattern

  • 템플릿 메소드 패턴은 객체지향에서 매우 많이, 자연스럽게 쓰는 패턴
  • 특정 작업을 처리하는 일부분을 서브 클래스로 캡슐화해 전체 구조를 바꾸지 않으면서 특정 단계에서 수행하는 내용을 바꾸는 패턴
  • 알고리즘의 구조를 메소드에 정의하고, 하위 클래스에서 알고리즘 구조 변경 없이 재정의하는 패턴

장점

  1. 코드의 중복을 줄일 수 ㅇ
  2. 자식 클래스의 역할을 줄여 핵심 로직의 관리가 쉬움
  3. 코드를 객체 지향적으로 구성 가능

단점

  1. 추상 메소드가 너무 많아지면 클래스 관리가 복잡해진다.
  2. 클래스 간의 관계와 코드가 꼬여버릴 염려(복잡성 증대)가 있다.

 

 

 

 

 

 

 

 

 

반응형
profile

억대 연봉을 위한 인간수업

@회뜨는참치

이 글이 당신에게 조금이라도 도움이 된다면 좋겠습니다.