Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion 디자인패턴/MVC패턴.md

This file was deleted.

Binary file added 디자인패턴/image/ArrayList와배열.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
30 changes: 30 additions & 0 deletions 디자인패턴/노출모듈_패턴.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# 노출 모듈 패턴

- namespace가 없는 문제를 해결하기 위해 고안됨
- private, public 같은 접근 제어자를 만드는 패턴
- private은 클래스에 정의된 함수에서 접근 가능하지만 자식 클래스와 외부 클래스에서 접근 불가능한 범위
- public은 클래스에 정의된 함수에서 접근 가능하며 자식 클래스와 외부클래스에서 접근 가능한 범위
- 왜? 전역 범위에서 실행되는 프로그램은 내부 어플리케이션과 종속된 라이브러리 코드의 데이터들로 인해 충돌이 발생할 수 있기 때문

> 여러 설명을 찾아봤으나 자바스크립트를 위해 고안된 것으로 보이며 예시 코드도 책에 나와있는 것과 동일함

장점

- 개발자에게 깔끔한 접근 방법을 제공
- private 데이터 제공
- 전역 변수를 덜 더럽힘
- 클로저를 통해 함수와 변수를 지역화
- 스크립트 문법이 더 일관성 있음
- 명시적으로 public 메소드와 변수를 제공해 명시성을 높임

단점

- private 메소드 접근할 방법이 없음 (이런 메소드에 - 대한 테스트의 어려움을 이야기하기도 하지만 함수 무결성을 고려할 때 공개된 메소드만 테스트 하는게 맞음. 관련 없지만 기록용으로.)
- private 메소드에 대해 함수 확장하는데 어려움이 있음
- private 메소드를 참조하는 public 메소드를 수정하기 어려움

---

[출처1](https://velog.io/@narangke3/%EB%85%B8%EC%B6%9C%EB%AA%A8%EB%93%88-%ED%8C%A8%ED%84%B4)

[출처2](https://smilejsu.tistory.com/1976)
48 changes: 48 additions & 0 deletions 디자인패턴/이터레이터_패턴.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# 반복자 패턴

서로 다른 구조를 가지고 있는 Container에 대해서 접근하기 위해서 interface를 통일시키고 싶을 때 사용하는 패턴

내부 구현 방법을 외부로 노출하지 않으면서 집합체에 있는 모든 항목 접근 가능해짐

## 서로 다른 구조의 Container란?

- 속성과 기능을 함께 캡슐화함으로써 데이터를 담고 있는 객체
- 예를 들어 Hashset, Map, ArrayList, 배열, 리스트, 튜플, 세트, 딕셔너리 등(자바와 파이썬 섞음)

## 반복자 패턴 구조

![alt text](https://github.com/zzolab/Computer_Science_Study/blob/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4_%EC%9D%B4%ED%84%B0%EB%A0%88%EC%9D%B4%ED%84%B0_%EB%85%B8%EC%B6%9C%EB%AA%A8%EB%93%88_%ED%8C%A8%ED%84%B4/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4/image/Iterator%20Pattern%20Structure.png?raw=true)

Aggregate : 공통된 인터페이스. 클라이언트와 객체 컬렉션의 구현이 분리됨

ConcreteAggregate : 객체 컬렉션 들어 있음. 그 컬렉션을 Iterator로 리턴하는 메소드 구현

Iterator : 컬렉션에 들어있는 원소에 돌아가면서 접근할 수 있게 해 주는 메소드 제공

ConcreteIterator : 반복 작업 중에 현재 위치 관리하는 일

## 컬렉션의 요소에 접근 차이 예시

![alt text](https://github.com/zzolab/Computer_Science_Study/blob/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4_%EC%9D%B4%ED%84%B0%EB%A0%88%EC%9D%B4%ED%84%B0_%EB%85%B8%EC%B6%9C%EB%AA%A8%EB%93%88_%ED%8C%A8%ED%84%B4/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4/image/ArrayList%EC%99%80%EB%B0%B0%EC%97%B4.jpeg?raw=true)

- 위 사진에서 ArrayList는 get 메소드를 사용하여 요소에 접근하지만 배열에서는 인덱스로 접근하는 차이가 보인다
- 그러나 Iterator를 사용하면 hasNext를 통해 다음 요소가 있는지, 그리고 next를 통해 다음 요소로 접근하도록 할 수 있다
- 이는 기본적으로 SOLID에서 SRP: Single Responsibility Principle와 관련된 것이다. Iterator는 순환 관련된 것을 책임지고 있다

## Python에서의 Iterator 패턴

- 파이썬에서는 for loop를 통해서 컬렉션의 각 요소를 순환할 수 있다. 내부적으로 Iterator 패턴을 활용했다. 아래 링크를 보면 어떻게 패턴을 적용시켰는지 나온다.
- [파이썬 반복자 패턴](https://python-patterns.guide/gang-of-four/iterator/)
- [PEP 234 – Iterators](https://peps.python.org/pep-0234/)

## Python에서 커스텀 Container 만들기

1. 기존 Container를 상속하여 생성
2. collections.abc
- 각 컨테이너 타입에 필요한 일반적인 메서드를 모두 제공하는 추상 기반 클래스들을 정의하고, 필수로 정의해야할 메서드들을 알려준다

[출처1 : container만드는 법 블로그](https://hidekuma.github.io/pythonic/pythonic-create-custom-container/)

[출처2 : conllections.abc 공식문서](https://docs.python.org/3/library/collections.abc.html)

- 이런 custom container를 만들 때도 Iterator 디자인 패턴 적용할 수 있지 않을까 생각이 든다