파이썬 디자인패턴 스터디
1장. 디자인패턴 개요
객체지향 프로그래밍 : ‘파이썬의 모든것은 객체다.’
- 객체란? (object)
- 프로그램 내의 개체(Entity)를 나타낸다.
- 개체는 다른 개체와 상호작용을 하며 목적을 달성한다.
- ex) Person, car -> 객체
person은 car을 타고 원하는 위치로 이동한다.
- 클래스 (class)
- 클래스는 속성과 행동을 포함하는 객체를 정의한다.
속성은 데이터의 변수이고 함수는 특정 행동을 지정후 수행한다.
- 클래스는 속성과 행동을 포함하는 객체를 정의한다.
- 클래스에는 객체의 초기 상태를 설정하는 생성자가 있다. (ex. self.name)
- 클래스는 일종의 템플릿으로 쉽게 재사용 할 수 있다.
- 메소드(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가지
- 캡슐화 (Encapsulation)
- 객체의 기능과 상태정보를 외부로부터 은닉한다.
- 클라이언트는 객체의 내부 구조 및 상태를 직접 수정할 수 없고 대신 수정을 요청한다.
요청의 종류에 따라 객체는 get과 set같은 특수 함수를 사용해 내부 상태를 변경한다.
- 파이썬에는 public과 private, protected(C++, JAVA)같은 캡슐화에 필요한 접근 제어 키워드가
없기 때문에 캡슐화를 지원하지 않는다. 함수나 변수 앞에 _를 붙여 접근을 제어 할 수는 있다.
- 다형성 (Polymorphism)
- 다형성에는 두가지 의미가 있다.
- 객체는 전달 인자에 따라 다른 메소드를 호풀한다.
- 동일한 인터페이스를 여러 형식의 객체들이 공유한다.
- 파이썬은 다형성을 지원하는 언어이다. 예를들어 + 연산자는 두 정수를 더하거나
문자열을 합칠 때 모두 사용할 수 있다.
- 다형성에는 두가지 의미가 있다.
- 상속(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
- 컴포지션(Composition)
- 객체나 클래스를 더 복잡한 자료 구조나 모듈로 묶는 행위이다.
- 컴포지션을 통해 특정 객체는 다른 모듈의 함수를 호출할 수 있다.
즉 상속없이 외부 기능을 사용할 수 있다.
class Person(object):
def greeting(self):
print('안녕하세요.')
class Student(object):
def study(self):
print('공부하기.')
Person().greeting()
object = Student()
object.study()
결과 : 공부하기.
안녕하세요.
객체지향 디자인의 기본 원칙
-
개방-폐쇄 원칙 (Open Closed Principle)
클래스와 객체, 메소드 모두 확장엔 개방적이고 수정에는 폐쇄적이어야 한다는 원칙이다.
클래스 또는 객체의 기능을 확장할 때 기본 클래스 자체를 수정하지 않아도 되도록 클래스와 모듈을
설계해야 한다. 클래스 확장만으로 새로운 기능을 구현할 수 있어야 한다.
- 장점
- 기존 클래스를 변경하지 않기 때문에 문제가 발생할 가능성이 낮다.
- 기존 버전과의 호환성 유지가 수월하다.
- 의존 반전 원칙 (Dependency Inversion Principle)
상위 모듈은 하위 모듈에 의존적이지 않아야 한다는 원칙이다.
가능한 모두 기존클래스에 의존해야 한다. 기존 클래스가 하위 클래스에 의존하는 상황은 바람직하지 않다. 의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다는 변화하기 어려운 것, 거의 변화가 없는 것에 의존하라는 것이다. 한마디로 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺으라는 것이다.
- 장점
- 모듈간의 낮은 상호 의존도는 시스템 복잡도를 줄여준다.
- 종속 모듈 사이에 명확한 추상화 계층이 있기 때문에 모듈간의 종속관계를 쉽게 알 수 있다.
- 인터페이스 분리 원칙(Interface Segregation Principle)
클라이언트는 불필요한 인터페이스에 의존하지 말야야 한다는 원칙이다.
이 원칙은 효율적인 인터페이스 작성을 유도한다. 개발자는 반드시 해당 기능과 관련있는 메소드만을 작성해야한다. 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다.
- 장점
- 인터페이스에 꼭 필요한 메소드만 포함하는 가벼운 인터페이스를 작성할 수 있다.
- 인터페이스에 불필요한 메소드가 포함되는 것을 방지한다.
- 단일 책임 원칙 (Single Responsiblity Principle)
클래스는 하나의 책임만을 가져야 한다는 원칙
클래스를 구현할 때 한가지 기능에 중점을 두어야 한다. 두 가지 이상의 기능이 필요하면 클래스를 나눠서 사용해야 한다.
- 장점
- 어떤 기능을 수정할 때 특정 클래스만 변경하면 된다.
- 한개의 클래스에 여러 기능이 있는 경우 종속된 클래스도 변경돼야 한다. 이러한 상황을 방지할수 있다.
- 리스코프 치환 원칙 (Liskov Substitution Principle)
상속받는 클래스는 기본 클래스의 역할을 완전히 치환할 수 있어야 한다는 원칙이다.
쉽게 말하면 자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있다는 원칙이다 부모 클래스가 들어갈 자리에 자식 클래스를 넣어도 잘 작동해야 한다.
디자인 패턴의 개념
디자인패턴은 소프트웨어 설계 단계에서 흔히 발생하는 여러 문제의 해결책으로써 총 23개의 디자인 패턴으로
이루어져 있다. 주로 자바를 기반으로 한다.
디자인 패턴은 언어에 독립적이여서 모든 프로그래밍 언어에 적용할 수 있다.
디자인패턴의 장점
- 여러 프로젝트에서 재사용될 수 있다.
- 설계 문제를 해결할 수 있다.
- 오랜 시간에 걸쳐 유효성이 입증됐다.
- 신뢰할 수 있는 솔루션이다.
디자인 패턴의 분류
23개의 디자인 패턴을 총 3개의 범주로 분류를 한다.
- 생성패턴
- 구조패턴
- 행위패턴
- 생성패턴이란?
- 객체생성에 관련된 패턴이다.
- 객체의 생성과 조합을 캡슐화해 특정 객체가 생성되거나 변경되어도 프로그램 구조에 영향을 크게 받지 않도록 유연성을 제공한다. (코드와 객체의 클래스는 서로 독립적이다. )
- 구조패턴이란?
- 클래스와 객체를 더 큰 구조를 만드는 패턴이다.
- 구조가 단순해지고 클래스와 객체 간의 상호관계를 파악할 수 있다.
- 클래스 상속과 컴포지션에 의존한다.
- 행위패턴이란?
- 객체들의 상호작용을 패턴화 한것이다.
- 한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하는지, 또 그렇게 하면서도 객체 사이의 결합도를 최소화하는 것에 중점을 둔다.
Leave a comment