공부
-
[SOLID] 리스코프 원칙 법칙이란 (Liskov Substitution Principle, LSP)공부 2021. 8. 16. 18:43
리스코프 치환 법칙은 SOLID 원칙에서 L에 해당하는 법칙입니다. 해당 법칙은 상위 타입의 객체를 하위 타입의 객체로 치환해도 동작에 문제가 없어야 합니다. 즉, B가 A의 자식일 때, A 타입을 사용하는 부분에서 B로 치환해도 문제없이 동작이 되어야 합니다. 아래에서 정사각형과 직사각형 예를 들어 설명합니다. 정사각형은 직사각형이 될 수 있지만 직사각형은 정사각형이 될 수 없습니다. 즉, 정사각형은 직사각형의 자식이라고 판단한 다음, 아래와 같이 코드를 작성합니다. from dataclasses import dataclass, field @dataclass() class Rectangle: _width: int = field(init=False) _height: int = field(init=Fals..
-
[UML] 클래스 다이어그램 (Class Diagram)공부 2021. 8. 15. 20:04
클래스 다이어그램은 구조 다이어그램으로 클래스 내부 구성요소 및 클래스 간의 관계를 도식화하여 시스템의 특정 모듈이나 일부 및 전체를 구조화 합니다. 개발 하기 전, 클래스 다이어그램을 그리게 되면 시스템 내 클래스 간의 의존성 파악과 팀원들 간 의사소통이 편리합니다. 클래스 다이어그램의 목적에 따라 개념, 명세, 구현 단계로 나눌 수 있습니다. 개념 단계에서는 클래스만 도출하고 관계를 단순화하는 것이 목적입니다. 명세와 구현 단계에서는 개발 직전 설계나 구현 이후 설명 목적으로 사용되고 이 다이어그램을 기반으로 코드로 구현하거나 코드를 기반으로 다이어그램을 그리기 때문에 코드와 연관이 깊습니다. 요소 (element) 클래스 클래스 다이어그램에서 클래스는 이름, 속성(변수), 메소드 순으로 나열합니다...
-
[Design Pattern] 방문자 패턴 (Visitor Pattern)공부/디자인 패턴 2021. 7. 25. 17:30
방문자 패턴은 방문자와 방문 공간을 분리하여 방문 공간이 방문자를 맞이할 때, 이후에 대한 행동을 방문자에게 위임하는 패턴입니다. 비슷한 객체에서 어떤 동작을 해야할 때 방문자 패턴을 사용하면 수행 로직을 분리할 수 있습니다. 즉, 데이터 구조와 연산을 분리하여 구조를 변경하지 않고 새로운 연산을 추가할 수 있습니다. 새로운 연산을 추가하고 싶으면 새로운 방문자를 추가하면 되는 형식입니다. 클래스 다이어그램 Visitor: Eliment를 방문하고 동작을 구현하기 위한 인터페이스 ConcreteVisitor1, 2: Visitor를 상속받아 실제 동작을 구현한 클래스 Element: visitor가 방문하여 수행해야 하는 대상. 구조를 구성하는 인터페이스 ConcreteElementA, B: Elemen..
-
[Design Pattern] 전략 패턴 (Strategy Pattern)공부/디자인 패턴 2021. 7. 24. 20:52
전략 패턴이란 각각의 알고리즘을 교환이 가능하도록 정의, 캡슐화를 한 다음, 서로 교환해서 사용할 수 있는 패턴입니다. 즉, 객체들이 할 수 있는 동작을 각각의 전략으로 만들어 놓고 동적으로 동작을 변경해야 한다면 전략만 변경하여 동작이 바뀌도록 하는 패턴입니다. 이러한 패턴을 사용하면 OCP에 위배되지 않고 시스템이 거대해졌을 때, 메소드의 중복을 해결할 수 있습니다. 클래스 다이어그램 Context: Strategy의 메소드를 호출해서 사용하는 클래스 Strategy: 전략을 사용하기 위한 인터페이스 ConcreteStrategyA, B, C: Strategy 인터페이스를 실제 구현하는 클래스 예시 먼저 아래와 같이 사람과 오리를 나타내는 인터페이스와 클래스가 있다고 합니다. cry 메소드를 호출하면..
-
[Design Pattern] 스테이트 패턴 (State Pattern)공부/디자인 패턴 2021. 7. 18. 17:14
스테이트 패턴은 상태를 관리하는데 도움을 주는 디자인 패턴입니다. 어떤 행동을 수행할 때, 상태에 맞는 행동을 수행하도록 처리하도록 합니다. 이러한 시스템을 클래스로 분리하고 각 클래스에서 행동에 맞는 수행동작을 구현합니다. 자바의 경우, 캡슐화를 위해 인터페이스를 생성해 시스템의 각 상태를 나타내는 클래스로 구현합니다. 예를 들어, 자판기에서 동전 있음, 동전 없음, 상품 품절, 상품 반환 과 같은 상태를 조건문으로 분기하여 처리하는 것이 아닌 각 상태를 클래스에 캡슐화하여 구현하는 방식입니다. 클래스 다이어그램 State: 시스템의 모든 상태를 제공하는 인터페이스. Context: state를 이용하여 역할을 수행하는 클래스. 현재 시스템의 상태를 나타내는 상태 변수(state)와 실제 시스템의 상태..
-
[Design Pattern] 메멘토 패턴 (Memento Pattern)공부/디자인 패턴 2021. 7. 17. 21:11
메멘토 패턴이란 객체의 정보를 저장하고 사용자가 원하는 시점의 데이터를 복원할 수 있도록 하는 패턴입니다. 클래스 다이어그램 Originator: 현재 상태를 저장하고 Memento 객체의 정보를 얻는 클래스 Memento: 상태를 갖고 있는 클래스 Caretaker: Memento 클래스를 순서대로 저장하는 클래스 예제 public class Memento { private final String state; public Memento(String state){ this.state = state; } public String getState(){ return state; } } public class Originator { private String state; public void setState(S..
-
[Design Pattern] 중재자 패턴 (Mediator Pattern)공부/디자인 패턴 2021. 7. 11. 17:00
중재자 패턴은 클래스 간의 복잡한 관계들을 캡슐화하여 하나의 클래스에서 관리하도록 처리하는 패턴입니다. M:N 관계를 해당 패턴을 사용하면 M:1 관계로 만들어 복잡도를 내리므로 유지 보수 및 확장성에 유리합니다. M개의 객체들 사이에 중재자를 추가하여 중재자가 모든 객체들의 통신을 담당하도록 변경하면 중재자 패턴이라 볼 수 있습니다. 이와 같이 진행하면 각 객체들은 서로 알 필요가 없고 중재자 클래스가 관리하므로 느슨한 결합(loose coupling)을 유지할 수 있고 전체적인 흐름을 읽기 편해집니다. 단점으로는 특정 application에 맞춰져서 개발이 되기 때문에 재사용이 어렵습니다. 이와 유사한 패턴으로는 퍼사드 패턴(https://brownbears.tistory.com/507)과 옵저버 패..
-
[Design Pattern] 이터레이터 패턴 (Iterator Pattern)공부/디자인 패턴 2021. 6. 20. 20:18
이터레이터 패턴은 컬렉션의 구현 방법을 노출시키지 않고 그 안에 존재하는 모든 항목에 접근할 수 있도록 하는 패턴입니다. 이터레이터 패턴을 사용하면 컬렉션 내에 구현이 어떤지 몰라도 해당 객체에 접근해 반복 작업을 처리할 수 있습니다. for (int i = 0; i < arr.length < i++) { System.out.println(arr[i]); } 위에서 i는 arr이라는 배열의 위치를 나타내는 변수입니다. 이러한 기능을 추상화하여 일반화 한 것을 이터레이터 패턴이라 합니다. 클래스 다이어그램 iterator: 컬렉션의 요소들을 순서대로 검색하기 위한 인터페이스 ConcreteInterface: iterator 인터페이스 구현체 Aggregate: 여러 요소들로 구성된 컬렉션 인터페이스 Con..
-
[SOLID] 개방 폐쇄 원칙이란 (Open-Closed Principle, OCP)공부 2021. 6. 13. 18:17
개방 폐쇄 원칙은 열림 닫힘 원칙이라고도 불리며다섯 가지 애자일 원칙(SOLID) 중 1개입니다. 해당 원칙은 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 합니다. 즉, 기능을 추가/변경은 가능해야 하지만 이 기능을 사용하는 코드(기존 코드)는 변경하지 않아야 한다는 의미입니다. 만약 새로운 기능을 추가하려고 하는데 기존 코드를 변경해야 된다면 좋지 않은 설계이므로 OCP에 따라 분리를 진행해야 합니다. 아래와 같은 코드가 있다고 가정합니다. from abc import ABCMeta, abstractmethod class Character(metaclass=ABCMeta): def __init__(self, name: str): self.name = name @abstractmethod def se..
-
[SOLID] 단일 책임 원칙이란 (Single Responsibility Principle, SRP)공부 2021. 6. 13. 17:29
단일 책임 원칙이란 클래스는 단 1개의 책임만 가져야 하며 변경되는 이유도 1개여야 한다는 원칙입니다. 다섯 가지 애자일 원칙(SOLID) 중 1개입니다. 만약 한 클래스에 두 가지 기능을 담당하는 이유 때문에 수정이 된다면 이 클래스는 단일 책임 원칙에 위배되므로 두 클래스로 쪼개야 합니다. 이는 클래스 뿐만 아니라 함수형 프로그래밍에도 적용이 됩니다. 하나의 함수에서 담당하는 기능이 두 개 이상이라면 이 함수는 쪼개는 것이 추후 유지보수에 용이해집니다. 팩토리 패턴은 이러한 원칙을 잘 설명하는 디자인 패턴입니다. 아래와 같은 코드가 있다고 가정합니다. from typing import List def data_save(data_list: List[str]): data = '|'.join(data_li..