# 20201214(월)

## 2020-12-14

### 1. 학습 날짜

* 2020-12-14

### 2. 학습 시간

* 09:00 \~ 12:00, 19:00 \~ 23:30

### 3. 학습 범위 및 주제

* 루비

### 4. 학습 목표

* 루비 학습

### 5. 과제 제출

* x

### 6. 상세 학습 내용

* 루비
  * 지난 몇일동안 학습하던 루비를 정리했다.
  * 가장 핵심이 되는 부분을 적어보자면 역시 블록이다.
  * 루비에서의 블록은 중괄호나 `do end`로 둘러싸인 코드 덩어리다. 이 블록은 익명 메써드의 일종이다.
  * 익명 메써드라는 것은 이름이 없다는 것. 즉 변수화되지 못했다는 것을 의미한다. 그러므로 익명 메써드 처럼 사용될 때는 임시적으로 사용되는 메써드라고 생각할 수 있다.
  * 익명 메써드의 일종이라고 했는데, 블록은 객체로서 존재할 수 있다. 바로 `Proc`다. `Proc`을 객체로서 만들면 메써드의 인자로도 넣을 수 있다. 만약 넣기를 원한다면 메서드를 정의할 때 마지막 인자를 `&`로 선언하고 넣으면 된다. 엠퍼센드를 넣는다는 의미는 블록을 인자로서 넣겠다는 의미다.
  * `Proc`에 블록이 담긴다는 것을 알았다. 그러면 어떻게 `Proc`를 만들 것인가?
  * 두 가지 방법이 있다. 첫 번째는 `Proc.new` 이고 두 번째는 `lambda` 이다.
  * 두 방법의 결과물은 비슷하지만 무언가 조금은 다르다고 한다. 아직 이 부분은 학습하지 않았으므로 패스하겠다.
  * `lambda`는 `-> {}` 로 축약해서 사용할 수 있다.
  * 루비에는 컬렉션이라는 것이 존재한다. 이 컬렉션은 `C++`의 컨테이너라고 생각하면 된다. 즉 하나의 커다란 집합이 있고 그 내부에 다수의 원소가 존재하는 것. 배열, 해시를 생각하면 된다.
  * 그리고 컬렉션들은 반복자를 가지고 있다. 바로 이 반복자가 블록을 사용하는 주체다.
  * 반복자에는 `each`, `map`, `collect`, `reject`, `select` 등 여러 종류가 있다
  * `map` 과 같은 메써드는 컬렉션을 return 하는 특징을 갖는다. 이렇게 컬렉션을 `return` 하는 메써드는 변수화하지 않은 상태에서 또 다시 반복자를 호출하고 블록을 사용할 수 있는데 이를 메써드 체인이라고 부른다.
  * 루비의 컬렉션들은 `C++` 과는 다르게 컬렉션 자신이 반복자를 갖는다.
    * 이 말의 의미를 쉽게 이해하기 위해서는 `C++`의 `Iterator`를 생각해보자. `Iterator`는 외부에 존재하는 클래스고 컨테이너들은 이 `Iterator`을 가져다가 사용하는 개념이다. 즉 자신이 직접 구현한게 아닌 있는 것을 `include`해서 사용하는 것.
    * 이와는 다르게 루비의 컨테이너인 컬렉션은 본인이 직접 반복자를 갖는다.
    * `C++`에서 생각해보면 `Iterator`만을 가지고 여러 작업을 했었다. 즉 반복자를 컨테이너와 별개로 사용함으로 여러 이득을 볼 수 있었다는 것. 그렇다면 루비에서는 반복자를 따로 사용함으로써 얻을 수 있는 장점을 버려야 한다는건가?
    * 아니다. 루비에는 열거자 라는 개념이 존재한다. 이 열거자 또한 하나의 객체다. 따라서 열거자는 자신의 메서드를 갖는다.
  * 열거자는 이미 존재하는 컬렉션으로부터 생성할 수도 있지만, 명시적으로 블록을 넘겨 열거자를 생성할 수도 있다.
    * 즉 우리가 직접 만들 수도 있다는 것이다. 이때 만들 수 있는 특이한것은 `무한한 시퀀스`를 갖는 열거자다.
    * 대부분의 경우 무한의 반복에 빠지는 건 우리가 원한지 않는 상황일 가능성이 높다. 따라서 무한한 시퀀스를 갖는 열거자를 만드는 건 조심해야 한다.
    * 무한한 시퀀스에서 `count`, `select` 를 사용했을 때 주로 무한 시퀀스에 빠진다. 따라서 이런 무한 시퀀스에 빠질 수 있는 위험을 갖고 있는 메써드를 따로 정의하자.
  * 게으른 열거자
    * 게으른 열거자를 사용하면 무한한 시퀀스의 문제를 손쉽게 해결할 수 있다. 이 녀석은 반복의 제한을 걸지 않으면 무한 시퀀스에 빠질 수 있는 메서드 자체가 실행되지 않는다.

### 7. 오늘 학습 내용에 대한 개인적인 총평

* 오랜만에 `markdown`을 사용해서 정리해봤다. 난 분명 루비가 배우기 정말 쉽다고 들었는데ㅋㅋㅋ 왜이러 어려울까?

### 8. 다음 학습 계획

* 루비 공부


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://simian114.gitbook.io/blog/undefined-1/diary/2020/12/20201214.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
