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