분류 전체보기
-
[SOLID] 인터페이스 분리 원칙이란 (Interface Segregation Principle, ISP)공부 2021. 8. 29. 18:21
인터페이스 분리 원칙은 인터페이스를 사용하는 클라이언트 기준으로 분리해야 되는 원칙입니다. 다시 말해서, 클라이언트(자신)이 사용하지 않는 메소드와는 의존 관계를 가지면 안됩니다. 사용하지 않는 인터페이스의 메소드 때문에 영향을 받아 구현을 하면 안되고 영향을 받는다면 인터페이스를 나눠야 하는 원칙입니다. 아래와 같은 예시 코드가 있다고 가정합니다. from abc import ABCMeta, abstractmethod class Vehicle(metaclass=ABCMeta): @abstractmethod def drive(self): pass @abstractmethod def fly(self): pass @abstractmethod def ride(self): pass class Car(Vehicl..
-
[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..
-
[DB] 함수를 사용하지 않고 만 나이 쉽게 계산하기DB 2021. 8. 15. 20:41
만 나이를 계산하려면 생일이 지났는지, 지나지 않았는지에 따라 계산이 달라집니다. 하지만 아래에서 설명하는 수식을 사용하면 아주 쉽게 만 나이를 구할 수 있습니다. floor((현재 연월일 - 생년월일) / 10000) 현재 날짜: 20210815 생년월일1: 20001225 select floor((20210815 - 20001225) / 10000); -- 20 현재 날짜: 20211225 생년월일1: 20001225 select floor((20211225 - 20001225) / 10000); -- 21 위 식이 성립하는 이유는 구하고자 하는 연도 - 생일 연도 를 하게 되면 한국 나이 - 1 의 값이 나오게 됩니다. 여기서 구하고자 하는 월, 일이 생일 월, 일보다 적다면 앞에서 구한 값에서 1..
-
[UML] 클래스 다이어그램 (Class Diagram)공부 2021. 8. 15. 20:04
클래스 다이어그램은 구조 다이어그램으로 클래스 내부 구성요소 및 클래스 간의 관계를 도식화하여 시스템의 특정 모듈이나 일부 및 전체를 구조화 합니다. 개발 하기 전, 클래스 다이어그램을 그리게 되면 시스템 내 클래스 간의 의존성 파악과 팀원들 간 의사소통이 편리합니다. 클래스 다이어그램의 목적에 따라 개념, 명세, 구현 단계로 나눌 수 있습니다. 개념 단계에서는 클래스만 도출하고 관계를 단순화하는 것이 목적입니다. 명세와 구현 단계에서는 개발 직전 설계나 구현 이후 설명 목적으로 사용되고 이 다이어그램을 기반으로 코드로 구현하거나 코드를 기반으로 다이어그램을 그리기 때문에 코드와 연관이 깊습니다. 요소 (element) 클래스 클래스 다이어그램에서 클래스는 이름, 속성(변수), 메소드 순으로 나열합니다...
-
[Python] 데코레이터 만들기언어/파이썬 & 장고 2021. 8. 8. 19:33
파이썬에서 데코레이터란 @staticmethod와 같은 형태로 클래스나 함수 위에 선언하여 사용하는 것을 말합니다. 데코레이터는 기존 함수 내부의 코드를 수정하지 않고 시작과 끝에 추가 기능을 구현할 수 있습니다. class Test: @staticmethod def test(): pass 또한 데코레이터는 1개 이상 추가할 수도 있습니다. from abc import abstractmethod class Test: @staticmethod @abstractmethod def test(): pass 아래에서는 함수와 클래스로 데코레이터를 만드는 방법을 소개합니다. 함수로 데코레이터 만들기 함수로 데코레이터를 만드는 방법은 아래와 같습니다. def deco1(func): def wrapper(*args, ..
-
[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 메소드를 호출하면..
-
[Django] transaction언어/파이썬 & 장고 2021. 7. 24. 18:20
트랜잭션이란 트랜잭션은 DB의 데이터 삽입, 수정 및 삭제를 진행할 때 성공과 실패가 분명하고 상호 독립적이며 일관되게끔 처리하는 기능입니다. 트랜잭션에 대해선 https://brownbears.tistory.com/181 에서 자세하게 설명하고 있습니다. Django의 transaction 장고에서도 transaction을 제공해주고 있습니다. django.db.transaction 파일에 존재하며 사용은 아주 간단합니다. 사용법 설명에 앞서 장고는 auto commit을 기본값으로 제공하고 있습니다. 즉, 코드에 트랜잭션이라고 명시가 안되어 있으면 insert, update와 같은 문장을 바로 DB에 commit을 진행합니다. 장고에서 auto commit을 기본으로 사용하는 이유 만약 기본적으로 a..
-
[Python] typing언어/파이썬 & 장고 2021. 7. 18. 18:29
python은 동적 타입으로 하나의 변수에 여러 타입의 값을 할당할 수 있습니다. 이는 편하기도 하지만 예상치 못한 버그를 발생시킬 수 있는데 3.5부터 지원하는 typing을 사용하면 ide나 mypy와 같은 라이브러리에서 예상하지 않는 타입을 확인할 수 있습니다. (하지만 typing 모듈을 사용한다고 해서 자바와 같이 컴파일 에러는 발생하지 않습니다.) 3.6 버전 부터는 변수에도 typing을 적용할 수 있는데 아래에서 어떻게 사용하는지 설명합니다. 여기서는 파이썬 3.8 버전 기준으로 설명을 합니다. 파이썬 3.9에서는 문법이 약간 변경되었는데 이는 아래에서 간략하게 설명을 하겠습니다. typing 변수 # from typing number: int = 1 name: str = '가나다' 만약 ..
-
[Design Pattern] 스테이트 패턴 (State Pattern)공부/디자인 패턴 2021. 7. 18. 17:14
스테이트 패턴은 상태를 관리하는데 도움을 주는 디자인 패턴입니다. 어떤 행동을 수행할 때, 상태에 맞는 행동을 수행하도록 처리하도록 합니다. 이러한 시스템을 클래스로 분리하고 각 클래스에서 행동에 맞는 수행동작을 구현합니다. 자바의 경우, 캡슐화를 위해 인터페이스를 생성해 시스템의 각 상태를 나타내는 클래스로 구현합니다. 예를 들어, 자판기에서 동전 있음, 동전 없음, 상품 품절, 상품 반환 과 같은 상태를 조건문으로 분기하여 처리하는 것이 아닌 각 상태를 클래스에 캡슐화하여 구현하는 방식입니다. 클래스 다이어그램 State: 시스템의 모든 상태를 제공하는 인터페이스. Context: state를 이용하여 역할을 수행하는 클래스. 현재 시스템의 상태를 나타내는 상태 변수(state)와 실제 시스템의 상태..