---
description: 루비 재밌구먼!
---

# 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. 다음 학습 계획

* 루비 공부
