인사말
파이썬의 기초는 어느정도 숙지가 되었다고 생각이 됩니다. 그런데 다른 사람이 작성해둔 복잡한 코드나 혹은 내가 작성한 코드를 좀 더 나은(다른 사람이나 내가 유지보수하기 쉬운)코드를 설계 및 구현하고 싶어 아래 Design Pattern 강의를 듣는 중입니다. 그 중에서 좀 중요한 내용이나 다시 보면 좋을 것 같은 내용들을 정리하여 블로그에 작성하려고 합니다.
UML 다이어그램
디자인 패턴의 구조를 설명하거나 설계할 때, UML 다이어그램을 기반으로 작성하기 때문에, 기본적인 UML 다이어그램에 대해 정리를 하겠습니다. (본 설명은 draw.io를 이용하여 diagram을 그리며 설명합니다. 실습을 직접해보고 싶으신 분들은 draw.io를 이용하여 웹상에서 편하게 실습 할 수 있습니다.)
1. A Basic Class
위 그림은 UML 다이어그램에서 작성되는 class의 예시이다. field는 멤버변수, method 는 메서드를 나타낸다. 멤버변수와 메서드는 public과 private으로 외부에서는 해당 변수값을 직접접근 하지 못하도록 제어할 수 있는데 이는 현재 UML 다이어그램과 상관이 크게 없는 내용이기 때문에 생략하겠습니다. 궁금하신 분들은 한번 직접 찾아보시는 것도 좋을 것 같습니다.
2. Directed Association(직접 연관)
아래 디자인 패턴 강의에서는 a filled arraw라고 소개되었지만 draw.io에서는 아래와 같은 화살표를 사용하여 표현을 하였습니다.
위의 그림에서 Person 클래스가 Car 클래스 또는 Car 클래스의 객체를 사용하기 때문에 Directed Association입니다. 예를 들어 "Person은 Car 엔진의 시동을 겁니다.(start_engine(void))"와 같이 Person이 Car 클래스의 객체 내 메서드를 사용한다.
설명이 부족한 것 같아 Association과 함께 설명해보겠습니다.
Association은 양방향으로 위의 다이어그램이 양방향이 되려면 Car 또한 Person에 대한 정보를 가지고 있어야합니다. 예를 들어 Car의 주인을 출력하는 함수가 있다면 Person객체에서 이름 변수를 호출할 수 있어야한다.
Directed Association은 Association과 다르게 Car는 Person에 대한 정보가 전혀없고 Person에 접근을 할 수 없는 상태이어야 한다.
3. Extends/Inhrits A Class
Extends(확장) 그리고 Inhrits(상속) 되는 클래스는 빈 화살표로 표현된다.
Car 클래스를 상속하는 BMW m340i는 Car 클래스 내 멤버변수와 메서드를 그대로 상속받는다. 기본적으로 Car가 가질 수 있는 속성 및 기능을 Car 클래스 정의하고 Car를 상속하는 다양한 자동차들을 만들면 각 자동차 객체에서 다시 제 구현할 필요가 없어진다!
4. Interface
interface(implementation)는 점선과 빈 화살표로 구성되어져있다. Iclass (interface)는 다양한 곳에서 활용된다. HAL에서 각 장치의 interface를 정의할 때 주로 사용된다.
interface를 추상클래스로 선언하고 interface를 상속하는 Class A는 interface에서 선언한 method가 무조건 구현되어 있어야한다.
이렇게 구현하는 이유는 예를 들어 안드로이드 OS 임베디드 장치에서 카메라를 사용하고 싶다. 그런데 이 카메라 드라이버를 접근해서 기능을 사용하고 싶은데 그 기능은 모든 카메라별로 다 따로 저장할 수 없다. 그렇기 때문에 android os에서 사용할 수 있는 기능을 interface에 정의하고 그 인터페이스를 통해 카메라를 control하면 해당 기능이 구현된 어떤 camera라도 작동시킬수 있게된다. (이게 정확하게 맞는지는 좀 애매하지만 글을 읽었을때, interface에 대해서 이해를 할 수 있겠끔 작성하였습니다. 문제가 있다고 생각되시면 댓글 부탁드립니다.)
5.Aggregates
Aggregates(집합)은 위와 같이 빈 마름모와 화살표로 이루어져있다. 말그대로 집합관계를 나타내는데, 둘이 필요관계는 아니라는 게 포인트이다. Library는 꼭 Book이 있어야하는 건 아니며 Book 또한 Library에 있어야하는 것은 아니다.
위의 다이어그램은 Library 클래스가 Book을 집계하기 때문에 집합관계를 그렸다.
Association과 Aggregates의 차이가 궁금해서 인터넷을 찾아 보았다. 아래의 링크를 참조하여 확인해보세요.(광고아님ㅋㅋ)
[소프트웨어 공학] Association, Aggregation, Composition 에 대한 설명
Q: Association, Aggregation, Composition 이 세가지의 차이가 무엇인가요? 구현 시 어떻게 적용되는지 설명 해주세요. (질문자: ???) A: Association: 모든 오브젝트가 각자의 라이프사이클을 가지고 있고, 어..
stanleykou.tistory.com
https://medium.com/@2xel/class-diagram%EC%9D%98-%EA%B4%80%EA%B3%84-%EC%97%B0%EA%B4%80-a84db4731e42
Class Diagram의 관계(연관)
Dependency(의존)
medium.com
6.Composition
Composition은 채워진 마름모에 화살표가 그려진 모습이다. ClassA는 ClassB가 무조건 존재해야만 구현이되며 서로 생명주기를 공유한다. 즉 Aggregation는 독립적으로 각 Class가 생명주기를 가지지만 Composition은 서로 생명주기를 공유하며 서로간에 무조건적으로 있어야하는 Class이다.
참조
Design Pattern 강의 참조
https://www.udemy.com/course/python-design-patterns
Python Design Patterns
Design patterns to improve the speed, code reuse, and performance of your Python applications
www.udemy.com