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