디자인 패턴 개요

  10 Nov 2020


디자인 패턴 개요

객체지향 프로그래밍의 이해

파이썬의 모든 것은 객체다

-> 파이썬의 클래스 인스턴스와 변수는 개별적인 메모리 공간에 저장된다.

객체

  • 객체는 속성과 함수로 구성
  • 개체는 다른 개체와 상호작용하며 목적을 달성함

클래스

  • 속성과 행동을 포함하는 객체를 정의
  • 클래스에는 초시상태를 설정하는 생성자가 있음

메소드

  • 객체의 행위를 나타냄
  • 속성을 조작하고 작업을 수행함

객체지향 프로그래밍의 주요 기능

  1. 캡슐화
    • 객체의 기능과 샅애 정보를 외부로부터 은닉
    • 객체의 내부 구조 및 상태를 직접 수정은 할 수 없고, get/set 같은 특수 함수를 사용해 내부 상태 변경
    • 파이썬에는 public / private / protected라는 개념이 없음
    • 함수나 변수앞에 __(던더)를 붙여 접근을 제어함
  2. 다형성
    • 두 가지 의미 : [오버로딩]
      • 객체는 함수 인자에 따라 다른 기능을 함
      • 동일한 인터페이스를 여러 형식의 객체들이 공유함
  3. 상속
    • 클래스의 기능이 부모 클래스로부터 파생되는 것을 일컫는다
    • 부모 클래스에서 정의된 함수를 재사용할 수 있음
    • 어플리케이션의 기본 기능을 확장함
    • 상속은 여러 클래스의 객체 상호작용을 기반으로 계층을 형성함
  4. 추상화
    • 클라이언트가 클래스 객체를 생성하고 인터페이스에 정의된 함수를 호출할 수 있는 인터페이스를 제공
    • 클라이언트는 내부 구현(로작)에 이해없이 인터페이스를 이용 가능
  5. 컴포지션
    • 객체나 클래스를 더 복잡한 자료구조나 모듈로 묶는 행위
    • 특정 객체는 다른 모듈의 함수를 호출할 수 있음
    • 상속 없이 외부 기능을 사용 가능
      • A 클래스를 B 클래스에 포함시킴

객체지향 디자인의 기본 원칙

  1. 개방-폐쇄 원칙
    • 클래스, 객체, 메소드 모두 확장엔 개방적이고 수정엔 폐쇄적이어야 한다
    • 기본 클래스를 수정하지 않기 때문에 실수가 줄어듬
    • 기존 코드의 호환성을 보장
  2. 제어 반전 원칙
    • 상위 모듈은 하위 모듈에 의존적이지 않아야 한다
    • 세부 구현이 추상화에 의존해야 함
    • 모듈간 낮은 상호 의존도는 시스템 복잡도를 줄임
    • 관련 모듈을 연결하는 추상화 계층 덕분에 모듈 간 상호관계를 쉽게 관리할 수 있음
  3. 인터페이스 분리 원칙
    • 불필요한 인터페이스에 의존하지 않아야 한다
    • 인터페이스에 특화된 메소드만 있는 가벼운 인터페이스를 작성하게 됨
    • 의도하지 앟ㄴ은 메소드로 인터페이스가 채워지지 않도록 함
  4. 단일 책임 원칙
    • 클래스는 하나의 책임만을 가져야 한다
    • 특정 기능을 수정할 때 관련 클래스외에는 건드릴 필요가 없음
    • 한개의 클래스에 여러 기능이 있다면 관련된 모든 클래스를 수정해야하는 상황이 발생할 수 있음
  5. 치환 원칙
    • 상속받은 클래스는 기본 클래스의 역할을 완전히 치환할 수 있어야 함

디자인 패턴의 종류와 맥락에 대한 이해

디자인 패턴 용어

  • 스니펫 : 특수한 목적을 위한 코드
    • DB 연결
  • 디자인 : 문제에 대한 해결책
  • 스탠다드 : 문제를 해결하는 대표적인 방식
    • 포괄적이며 현재 상황에 적합한 방식
  • 패턴 : 유효성이 검증된 효율적이고 확장가능한 해결책

동적 프로그래밍 언어 패턴

파이썬의 동적인 특성

  • 자료형과 클래스는 런타임 객체이다
  • 변수형은 런타임에 변경될 수 없음
  • 동적 언어는 클래스 제한 측면에서 더 유동적임
  • 파이썬은 다형성이 언어에 구현되어있음
    • private / protected 같은 키워드가 없고 변수는 기본적으로 public이다

생성과 구조, 행위 패턴

생성 패턴

  • 객체가 생성되는 방식을 중시함
  • 객체 생성 관련 상세 로직을 숨김
  • 싱글톤 패턴은 생성 패턴의 한 종류임

구조 패턴

  • 클래스와 객체를 더 큰 결과물로 합칠 수 있는 구조로 설계함
  • 구조를 간결화하고 클래스와 객체 간의 상호관계를 파악할 수 있음
  • 클래스 상속과 컴포지션을 중시
  • 어댑터 패턴은 구조 패턴의 한 종류임

행위 패턴

  • 객체 간의 상호작용과 책임을 중시함
  • 상호작용하지만 느슨하게 결합되어야 함
  • 옵저버 패턴은 행위 패턴의 한 종류임

참고자료

파이썬 디자인 패턴 2/e : [다지안 패턴을 사용해 소프트웨어 설계 문제 해결하기]

...