파이썬 디자인패턴 스터디

1장. 디자인패턴 개요

객체지향 프로그래밍 : ‘파이썬의 모든것은 객체다.’

  1. 객체란? (object)
    • 프로그램 내의 개체(Entity)를 나타낸다.
    • 개체는 다른 개체와 상호작용을 하며 목적을 달성한다.
    • ex) Person, car -> 객체
      person은 car을 타고 원하는 위치로 이동한다.
  2. 클래스 (class)
    • 클래스는 속성과 행동을 포함하는 객체를 정의한다.
      속성은 데이터의 변수이고 함수는 특정 행동을 지정후 수행한다.
  • 클래스에는 객체의 초기 상태를 설정하는 생성자가 있다. (ex. self.name)
  • 클래스는 일종의 템플릿으로 쉽게 재사용 할 수 있다.
  1. 메소드(Method)
    • 객체의 행위를 나타낸다. -> 함수
    • 속성(변수)를 조작하고 작업을 수행한다.

예제

class Person(object):  ## 클래스 정의
    def __init__(self, name, age):  ## 생성자 정의
        self.name = name  ##변수선언
        self.age = age
    def get_person(self,): ##함수 생성
        return "<person (%s, %s)>" % (self.name, self.age)

p = Person('John', 32)
print('Type of Object:', type(p), 'Memory Address:', id(p))
결과: Type of Object: <class '__main__.Person'> Memory Address: 2535860481160

객체지향 프로그래밍의 주요 기능 -> 5가지

  1. 캡슐화 (Encapsulation)
    • 객체의 기능과 상태정보를 외부로부터 은닉한다.
    • 클라이언트는 객체의 내부 구조 및 상태를 직접 수정할 수 없고 대신 수정을 요청한다.
      요청의 종류에 따라 객체는 get과 set같은 특수 함수를 사용해 내부 상태를 변경한다.
  • 파이썬에는 public과 private, protected(C++, JAVA)같은 캡슐화에 필요한 접근 제어 키워드가
    없기 때문에 캡슐화를 지원하지 않는다. 함수나 변수 앞에 _를 붙여 접근을 제어 할 수는 있다.
  1. 다형성 (Polymorphism)
    • 다형성에는 두가지 의미가 있다.
      • 객체는 전달 인자에 따라 다른 메소드를 호풀한다.
      • 동일한 인터페이스를 여러 형식의 객체들이 공유한다.
    • 파이썬은 다형성을 지원하는 언어이다. 예를들어 + 연산자는 두 정수를 더하거나
      문자열을 합칠 때 모두 사용할 수 있다.
  2. 상속(Inheritance)
  • 상속이란 클래스의 기능이 부모 클래스로부터 파생되는 것을 일컫는다.
  • 부모 클래스에 정의된 함수를 재사용할 수 있고, 소프트웨어의 기본 구현을 확장시킬 수 있다.
  • 상속은 여러 클래스 객체의 상호 작용을 기반으로 계층을 형성한다. 파이썬은 다중상속을 지원한다. ```python class Person: def greeting(self): print(‘안녕하세요.’)

class Student(Person): def study(self): print(‘공부하기’)

james = Student() james.greeting() # 안녕하세요.: 기반 클래스 Person의 메서드 호출 james.study() # 공부하기: 파생 클래스 Student에 추가한 study 메서드

결과: 안녕하세요. 공부하기.

4. 추상화(Abstraction)
- 클라이언트가 클래스 객체를 생성하고 인터페이스에 정의된 함수를 호출할 수 있는 인터페이스를 제공한다.
- 클라이언트는 클래스의 복잡한 내부 구현에 대한 이해없이 간편하게 인터페이스를 사용할 수 있다.

````python
class Adder:
    def __init__(self):
        self.sum = 0
    def add(self, value):
        self.sum += value

acc = Adder()
for i in range(10):
    acc.add(i)
print(acc.sum)
결과 : 45
  1. 컴포지션(Composition)
    • 객체나 클래스를 더 복잡한 자료 구조나 모듈로 묶는 행위이다.
    • 컴포지션을 통해 특정 객체는 다른 모듈의 함수를 호출할 수 있다.
      즉 상속없이 외부 기능을 사용할 수 있다.
class Person(object):
    def greeting(self):
        print('안녕하세요.')


class Student(object):
    def study(self):
        print('공부하기.')
        Person().greeting()


object = Student()
object.study()
결과 : 공부하기.
       안녕하세요.

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

  1. 개방-폐쇄 원칙 (Open Closed Principle)

    클래스와 객체, 메소드 모두 확장엔 개방적이고 수정에는 폐쇄적이어야 한다는 원칙이다.
    클래스 또는 객체의 기능을 확장할 때 기본 클래스 자체를 수정하지 않아도 되도록 클래스와 모듈을
    설계해야 한다. 클래스 확장만으로 새로운 기능을 구현할 수 있어야 한다.

  • 장점
    • 기존 클래스를 변경하지 않기 때문에 문제가 발생할 가능성이 낮다.
    • 기존 버전과의 호환성 유지가 수월하다.
  1. 의존 반전 원칙 (Dependency Inversion Principle)
    상위 모듈은 하위 모듈에 의존적이지 않아야 한다는 원칙이다.
    가능한 모두 기존클래스에 의존해야 한다. 기존 클래스가 하위 클래스에 의존하는 상황은 바람직하지 않다. 의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다는 변화하기 어려운 것, 거의 변화가 없는 것에 의존하라는 것이다. 한마디로 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺으라는 것이다.
  • 장점
    • 모듈간의 낮은 상호 의존도는 시스템 복잡도를 줄여준다.
    • 종속 모듈 사이에 명확한 추상화 계층이 있기 때문에 모듈간의 종속관계를 쉽게 알 수 있다.
  1. 인터페이스 분리 원칙(Interface Segregation Principle)
    클라이언트는 불필요한 인터페이스에 의존하지 말야야 한다는 원칙이다.
    이 원칙은 효율적인 인터페이스 작성을 유도한다. 개발자는 반드시 해당 기능과 관련있는 메소드만을 작성해야한다. 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다.
  • 장점
    • 인터페이스에 꼭 필요한 메소드만 포함하는 가벼운 인터페이스를 작성할 수 있다.
    • 인터페이스에 불필요한 메소드가 포함되는 것을 방지한다.
  1. 단일 책임 원칙 (Single Responsiblity Principle)
    클래스는 하나의 책임만을 가져야 한다는 원칙
    클래스를 구현할 때 한가지 기능에 중점을 두어야 한다. 두 가지 이상의 기능이 필요하면 클래스를 나눠서 사용해야 한다.
  • 장점
    • 어떤 기능을 수정할 때 특정 클래스만 변경하면 된다.
    • 한개의 클래스에 여러 기능이 있는 경우 종속된 클래스도 변경돼야 한다. 이러한 상황을 방지할수 있다.
  1. 리스코프 치환 원칙 (Liskov Substitution Principle)
    상속받는 클래스는 기본 클래스의 역할을 완전히 치환할 수 있어야 한다는 원칙이다.
    쉽게 말하면 자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있다는 원칙이다 부모 클래스가 들어갈 자리에 자식 클래스를 넣어도 잘 작동해야 한다.

디자인 패턴의 개념

디자인패턴은 소프트웨어 설계 단계에서 흔히 발생하는 여러 문제의 해결책으로써 총 23개의 디자인 패턴으로 이루어져 있다. 주로 자바를 기반으로 한다.
디자인 패턴은 언어에 독립적이여서 모든 프로그래밍 언어에 적용할 수 있다.

디자인패턴의 장점

  • 여러 프로젝트에서 재사용될 수 있다.
  • 설계 문제를 해결할 수 있다.
  • 오랜 시간에 걸쳐 유효성이 입증됐다.
  • 신뢰할 수 있는 솔루션이다.

디자인 패턴의 분류

23개의 디자인 패턴을 총 3개의 범주로 분류를 한다.

  • 생성패턴
  • 구조패턴
  • 행위패턴
  1. 생성패턴이란?
    • 객체생성에 관련된 패턴이다.
    • 객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공한다. (코드와 객체의 클래스는 서로 독립적이다. )
  2. 구조패턴이란?
    • 클래스와 객체를 더 큰 구조를 만드는 패턴이다.
    • 구조가 단순해지고 클래스와 객체 간의 상호관계를 파악할 수 있다.
    • 클래스 상속과 컴포지션에 의존한다.
  3. 행위패턴이란?
    • 객체들의 상호작용을 패턴화 한것이다.
    • 한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하는지, 또 그렇게 하면서도 객체 사이의 결합도를 최소화하는 것에 중점을 둔다.

DP

Leave a comment