generated from muhandojeon/study-template
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
116 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
## 7.1 생성패턴 | ||
|
||
## 7.2 생성자 패턴 | ||
|
||
자바스크립트의 클래스는 객체 템플릿을 정희하고 캡슐화, 상속을 구현할 수 있도록 하였다. | ||
|
||
클래스는 아래와 같은 특징을 가지고있습니다. | ||
|
||
- 초기화 하는 `construcot()` 메서드를 가지고 있어야한다. | ||
- new 키워드를 통해 생성자를 호출할 수 있다. | ||
- this 키워드는 새로 생성된 해당 객체를 가르킨다. | ||
|
||
예제에는 `Car`라는 생성자로 객체를 생성하는데, 이때 객체를 생성할 때 마다 공통적인 함수 `ex) toString()`과 같은 함수를 새로 정의한다 <- Car유형의 인스턴스는 하나의 `toString()`을 공유해야하므로, 효과적이지 않은 방법 | ||
==> 프로토타입을 가진 생성자 | ||
|
||
> 자바스크립트의 프로토타입 객체는 함수나 클래스 등 특정 객체의 모든 인스턴스 내에 **공통 메서드를 쉽게 정의**할 수 있도록 합니다. | ||
## 7.3 모듈 패턴 | ||
|
||
### 7.3.1 객체 리터럴 | ||
|
||
중괄호({}) 안에서 키와 값을 쉼표로 구분하여 객체를 정의하는 방법 | ||
ex) const obj = { key : value } | ||
|
||
선언시 new 연산자를 필요로하지 않는다. | ||
코드를 캡슐화하여 깔끔하고 체계적으로 정리할 수 있다. | ||
|
||
> [레베카 머피가 작성한 글](https://github.com/rmurphey/rmurphey/blob/master/public/blog/using-objects-to-organize-your-code.md) | ||
### 7.3.2 모듈 패턴 | ||
|
||
전통적인 소프트웨어 엔지니어링 분야에서 **클래스의 캡슐화를 위해 처음 고안** 되었다. | ||
|
||
모듈패턴은 클로저를 활용해 `비공개` 상태와 구성을 캡슐화한다. | ||
=> 공개 및 비공개 메서드와 변수를 묶어 전역 스코프로의 유출을 방지, 다른 개발자의 인터페이스와 충돌을 예방 | ||
|
||
ES2019 이전의 자바스크립트에서는 접근제한자(#)을 지원하지 않아, `비공개`라는 개념이 존재하지않았다. | ||
-> 함수 스코프를 이용해 비공개 개념을 규현 (모듈 패턴에서는 클로저를 이용) | ||
-> 하지만 반환되는 객체에 포함된 메서드는 공개됨 | ||
-> 반환된 객체에 포함된 변수도 비공개하려면 `WeakMap()`을 사용하면 된다. | ||
|
||
export : 모듈 외부에서 모듈 기능에 대한 액세스를 제공 | ||
import : 모듈에서 내보낸 바인딩을 가져올 수 있도록 함 | ||
|
||
모듈 패턴의 변형 | ||
|
||
- Mixin 가져오기 변형 <- 주로 사용하는거? | ||
- 내보내기 변형 | ||
|
||
장점 | ||
|
||
- 자바스크립트 관점에서 볼 때 모듈패턴은 캡슐화 개념보다, 객체 지향 프로그래밍 지식을 가진 초보 개발자가 이해하기 쉽다 (ex, mixin 가져오기) | ||
- 비공개를 지원한다. - export 를 이용해 바깥으로 노출한 값들만 접근할 수 있다. - -> 전역 스코프 오염을방지할 수 있다. | ||
단점 | ||
- 공개와 비공개 멤버를 서로 다르게 접근해야한다. | ||
- 자동화 단위 테스트에서 비공개 멤버는 제외된다. | ||
|
||
### 7.3.4 WeakMap을 이용한 최신 모듈 패턴 | ||
|
||
WeakMap은 기본적으로키가 약하게 유지되는 맵이다. | ||
<- 참조되지 않은 키는 가비지컬렉션의 대상이 된다. | ||
|
||
## 7.4 노출 모듈 패턴 | ||
|
||
배경 : 공개 변수나 메서드에 접근하기 위해 가져온 메인 객체의 이름을 반복해서 사용해야한다는 점에 답답함을 느껴 생겨남 | ||
|
||
> 모든 함수와 변수를 비공개 스코프에 정의하고, 공개하고 싶은 부분만 포인터를 통해 비공개 요소에 접근할 수 있게 해주는 익명 객체를 반환하는 패턴 | ||
장점 | ||
|
||
- 코드의 일관성 유지 | ||
- 모듈의 가장 아래에 위치한 공개 객체를 더 알아보기 쉽게 바꾸어 가독성 향상 | ||
단점 | ||
- 비공개 함수를 참조하는 공개 함수를 수정할 수 없다는 점 | ||
- 비공개 변수를 참조하는 공개 객체 멤버 또한 수정 불가능 | ||
|
||
> 기존 모듈 패턴보다 취약할 수 있다. | ||
## 7.5 싱글톤 패턴 | ||
|
||
클래스의 **인스턴스가 오직 하나만 존재하도**록 제한하는 패턴 | ||
**전역에서 접근** 및 공유해야하는 단 하나의 객체가 필요할 때 유용 | ||
|
||
!싱글톤 패턴은 정적 클래스나 객체와는 다르게 초기화를 지연시킬 수 있다. (초기화 시점에 필요한 특정 정보가 유효하지 않을 수도 있기 때문) | ||
|
||
단점 | ||
|
||
- 싱글톤임을 파악하는 것이 힘들다 | ||
- 테스트 하기힘들다 | ||
|
||
## 7.6 프로토타입 패턴 | ||
|
||
이미 존재하는 객체를 복제해 만든 템플릿을 기반으로 새 객체를 생성하는 패턴 | ||
프로토타입 패턴은 프로토타입의 상속을 기반으로 한다. | ||
|
||
- 프로토타입 상속은 클래스처럼 따로 정의되는 것이 아니라, 이미 존재하는 다른 객체를 복제하여 새로운 객체를 만들어낸다. | ||
- 다른 언어의 기능을 따라하지 않고, 자바스크립트만이 가진 고유의 방식으로 작업 가능 | ||
- 객체 내에 함수를 정의할 때 복사본이 아닌 참조로 생성되어, ㅁ모든 자식 객체가 동일한 함수를 가리킨다 <- 성능 이점 | ||
|
||
## 7.7 팩토리 패턴 | ||
|
||
팩토리 패턴은 객체를 생성하는 생성패턴의 하나, | ||
다른 패턴과 달리 생성자를 필요로하지 않지만, 필요한 타입의 팩토리 객체를 생성하는 다른 방법을 제공 | ||
|
||
> 동적인 요소나 애플리케이션 구조에 깊게 의지하는 등의 상황 처럼 **객체 생성 과정이 복잡할 때 유용** | ||
### 7.7.2 팩토리 패턴을 사용하면 안되는 상황 | ||
|
||
`객체 생성 인터페이스 제공`이 작업중인 라이브러리나 프레임워크의 설계 목표가 아니라면 차라리 생성자를 사용하는것이 좋다. | ||
|
||
팩토리 패턴은 객체 생성과정을 인터페이스 뒤에 추상화 하기 때문에 객체 생성 과정이 복잡하다면, 단위 테스트의 복잡성도 증가시킬 수 있다. | ||
|
||
### 7.7.3 추상 팩토리 패턴 | ||
|
||
같은 목표를 가진 각각의 팩토리들을 하나의 그룹으로 캡슐화 하는 패턴 | ||
객체가 어떻게 생성되는지에 대한 세부사항을 알 필요없이 객체를 사용할 수 있도록 함 |