디자인 패턴 개요
객체지향 프로그래밍의 이해
파이썬의 모든 것은 객체다
-> 파이썬의 클래스 인스턴스와 변수는 개별적인 메모리 공간에 저장된다.
객체
- 객체는 속성과 함수로 구성
- 개체는 다른 개체와 상호작용하며 목적을 달성함
클래스
- 속성과 행동을 포함하는 객체를 정의
- 클래스에는 초시상태를 설정하는 생성자가 있음
메소드
- 객체의 행위를 나타냄
- 속성을 조작하고 작업을 수행함
객체지향 프로그래밍의 주요 기능
- 캡슐화
- 객체의 기능과 샅애 정보를 외부로부터 은닉
- 객체의 내부 구조 및 상태를 직접 수정은 할 수 없고, get/set 같은 특수 함수를 사용해 내부 상태 변경
- 파이썬에는 public / private / protected라는 개념이 없음
- 함수나 변수앞에 __(던더)를 붙여 접근을 제어함
- 다형성
- 두 가지 의미 : [오버로딩]
- 객체는 함수 인자에 따라 다른 기능을 함
- 동일한 인터페이스를 여러 형식의 객체들이 공유함
- 두 가지 의미 : [오버로딩]
- 상속
- 클래스의 기능이 부모 클래스로부터 파생되는 것을 일컫는다
- 부모 클래스에서 정의된 함수를 재사용할 수 있음
- 어플리케이션의 기본 기능을 확장함
- 상속은 여러 클래스의 객체 상호작용을 기반으로 계층을 형성함
- 추상화
- 클라이언트가 클래스 객체를 생성하고 인터페이스에 정의된 함수를 호출할 수 있는 인터페이스를 제공
- 클라이언트는 내부 구현(로작)에 이해없이 인터페이스를 이용 가능
- 컴포지션
- 객체나 클래스를 더 복잡한 자료구조나 모듈로 묶는 행위
- 특정 객체는 다른 모듈의 함수를 호출할 수 있음
- 상속 없이 외부 기능을 사용 가능
- A 클래스를 B 클래스에 포함시킴
객체지향 디자인의 기본 원칙
- 개방-폐쇄 원칙
- 클래스, 객체, 메소드 모두 확장엔 개방적이고 수정엔 폐쇄적이어야 한다
- 기본 클래스를 수정하지 않기 때문에 실수가 줄어듬
- 기존 코드의 호환성을 보장
- 제어 반전 원칙
- 상위 모듈은 하위 모듈에 의존적이지 않아야 한다
- 세부 구현이 추상화에 의존해야 함
- 모듈간 낮은 상호 의존도는 시스템 복잡도를 줄임
- 관련 모듈을 연결하는 추상화 계층 덕분에 모듈 간 상호관계를 쉽게 관리할 수 있음
- 인터페이스 분리 원칙
- 불필요한 인터페이스에 의존하지 않아야 한다
- 인터페이스에 특화된 메소드만 있는 가벼운 인터페이스를 작성하게 됨
- 의도하지 앟ㄴ은 메소드로 인터페이스가 채워지지 않도록 함
- 단일 책임 원칙
- 클래스는 하나의 책임만을 가져야 한다
- 특정 기능을 수정할 때 관련 클래스외에는 건드릴 필요가 없음
- 한개의 클래스에 여러 기능이 있다면 관련된 모든 클래스를 수정해야하는 상황이 발생할 수 있음
- 치환 원칙
- 상속받은 클래스는 기본 클래스의 역할을 완전히 치환할 수 있어야 함
디자인 패턴의 종류와 맥락에 대한 이해
디자인 패턴 용어
- 스니펫 : 특수한 목적을 위한 코드
- DB 연결
- 디자인 : 문제에 대한 해결책
- 스탠다드 : 문제를 해결하는 대표적인 방식
- 포괄적이며 현재 상황에 적합한 방식
- 패턴 : 유효성이 검증된 효율적이고 확장가능한 해결책
동적 프로그래밍 언어 패턴
파이썬의 동적인 특성
- 자료형과 클래스는 런타임 객체이다
- 변수형은 런타임에 변경될 수 없음
- 동적 언어는 클래스 제한 측면에서 더 유동적임
- 파이썬은 다형성이 언어에 구현되어있음
- private / protected 같은 키워드가 없고 변수는 기본적으로 public이다
생성과 구조, 행위 패턴
생성 패턴
- 객체가 생성되는 방식을 중시함
- 객체 생성 관련 상세 로직을 숨김
- 싱글톤 패턴은 생성 패턴의 한 종류임
구조 패턴
- 클래스와 객체를 더 큰 결과물로 합칠 수 있는 구조로 설계함
- 구조를 간결화하고 클래스와 객체 간의 상호관계를 파악할 수 있음
- 클래스 상속과 컴포지션을 중시
- 어댑터 패턴은 구조 패턴의 한 종류임
행위 패턴
- 객체 간의 상호작용과 책임을 중시함
- 상호작용하지만 느슨하게 결합되어야 함
- 옵저버 패턴은 행위 패턴의 한 종류임
참고자료
파이썬 디자인 패턴 2/e : [다지안 패턴을 사용해 소프트웨어 설계 문제 해결하기]