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

  • 루비 공부

Last updated