> For the complete documentation index, see [llms.txt](https://injun-woo30000.gitbook.io/growth-log/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://injun-woo30000.gitbook.io/growth-log/daily-review/2021/april/2021-04-16-fri.md).

# 2021-04-16(Fri)

| 항목         | 내용                 |
| ---------- | ------------------ |
| 학습 날짜      | 2021-04-16(금)      |
| 학습 시간      | 09:00\~23:00       |
| 학습 범위 및 주제 | 디자인 패턴, Rails      |
| 학습 목표      | rspec을 이용하여 TDD한다. |
| 동료 학습 방법   | -                  |

## 상세 학습 내용

### 옵저버 패턴

한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의한다.

#### 자바 내장 옵저버 패턴 사용

java.util.Observer 인터페이스와 java.util.Observable 클래스를 사용할 수 있음.

* 자바 내장 옵저버 패턴은 푸시 방식, 풀 방식 모두 사용가능.

java.util.Observer 인터페이스를 구현하고 java.util.Observable 객체의 addObserver() 메소드를 호출하면 옵저버 목록에 추가가 되고 deleteObserver()를 호출하면 옵저버 목록에서 제거가 된다.

연락을 돌리는 방법은 java.util.Observable를 상속받는 주제 클래스에서 `setChanged()` 메소드를 호출해서 객체의 상태가 바뀌었다는 것을 알린 후 `notifyObservers()` 또는 `notifyObserver(Object arg)` 메소드를 호출하면 된다. (인자값을 넣어주는 메소드는 푸시방식으로 쓰임.)

옵저버 객체가 연락을 받는 방법은 `update(Observable o, Object arg)` 메소드를 구현하기만 하면 된다. `Observable o` 에는 연락을 보내는 주제 객체가 인자로 전달이 되고 `Object arg` 에는 `notifyObservers(Object arg)` 메소드에서 인자로 전달된 데이터 객체가 넘어온다.

#### 자바 내장 옵저버 패턴의 단점과 한계

1. Observable은 클래스다. 따라서 재사용성에 제약이 생긴다.
   * 따라서 서브 클래스를 만들어야 한다는 점이 문제다. 이미 다른 슈퍼 클래스를 확장하고 있는 클래스에 Observable의 기능을 추가할 수 없기 때문이다. 그래서 재사용성에 제약이 생긴다.
2. Observable 클래스의 핵심 메소드를 외부에서 호출할 수 없다.
   * Observervable API를 살펴보면, `setChanged()` 메소드가 protected로 선언되어 있따.
   * Observable의 서버클래스에서만 `setChanged()`를 호출할 수 있다. 결국 직접 어떤 클래스를 만드록, Observable의 서브클래스를 인스턴스 변수로 사용하는 방법도 쓸 수 없다. 이런 디자인은 상속보다는 구성을 사용한다는 디자인 원칙에도 위배된다.

### 정규표현식

문법 정리

#### Groups and ranges

| Chracter | 뜻                        |
| -------- | ------------------------ |
| `\|`     | 또는                       |
| `()`     | 그룹                       |
| `[]`     | 문자셋, 괄호 안의 어떤 문자든        |
| `[^]`    | 부정 문자셋, 괄호안의 어떤 문자가 아닐 때 |
| `(?:)`   | 찾지만 기억하지는 않음             |

#### Quantifiers

| Character   | 뜻                         |
| ----------- | ------------------------- |
| `?`         | 없거나 있거나 (zero or one)     |
| `*`         | 없거나 있거나 많거나(zero or more) |
| `+`         | 하나 또는 많이 (one or more)    |
| `{n}`       | n번 반복                     |
| `{min,}`    | 최소                        |
| `{min,max}` | 최소, 그리고 최대                |

#### Boundary-type

| Chracter | 뜻         |
| -------- | --------- |
| `\b`     | 단어 경계     |
| `\B`     | 단어 경계가 아님 |
| `^`      | 문장의 시작    |
| `$`      | 문장의 끝     |

#### Character classes

| Chracter | 뜻                |
| -------- | ---------------- |
| `\`      | 특수 문자가 아닌 문자     |
| `.`      | 어떤 글자(줄바꿈 문자 제외) |
| `\d`     | digit 숫자         |
| `\D`     | digit 숫자 아님      |
| `\w`     | word 문자          |
| `\W`     | word 문자 아님       |
| `\s`     | space 공백         |
| `\S`     | space 공백 아님      |

[연습용 사이트](https://regexr.com/5ml92)

## 학습 내용에 대한 개인적인 총평

TDD 연습이 참 재밌다. 라이브 코딩에서는 시간이 많이 걸려서 하기 힘들 수도 있겠는데, 아직 테스트 작성이 미숙한가보다.

## 다음 학습 계획

* Rails로 로그인 기능 구현하기
