본문 바로가기
프로그래밍/Ruby

[Ruby/루비] 코드 블록과 yield

by 별준 2020. 7. 31.

코드 블록은 이름이 없는 함수를 뜻하며, 코드 블록을 어떤 함수나 메서드에 매개변수로 전달할 수 있습니다.

아래를 살펴봅시다.

이전에 숫자 3은 Integer 객체라고 배웠고, times는 Integer에 정의된 메서드입니다. 

times 메서드는 다음에 오는 코드 블록을 넘겨 받아 주어진 내용은 숫자만큼 반복합니다. 

코드 블록은 { } 중괄호를 사용하거나 아래와 같이 do/end를 사용해서 만들 수도 있습니다.

times를 두 번 호출해보았는데, 메서드는 소괄호가 있어도 되고, 없어도 됩니다.

 

흔히 코드 블록이 한 줄로 표현이 되면 중괄호를 사용하고, 한 줄이 넘어가면 do/end를 사용합니다. 

코드 블록은 하나 혹은 그 이상의 매개변수를 받아들일 수 있습니다.

위 코드는 루비에게 배열 안에 있는 모든 항목에 대해서 어떤 작업을 수행하라고 말하고 있습니다. 타 언어와는 다르게 매우 짧은 문법만으로 루비는 배열의 요소에 순차적으로 방문(iterate)하고, 내용은 출력할 수 있습니다.

each 메서드는 Array 객체에 정의된 메서드로 각각의 요소에 순차적으로 방문하면서 작업을 수행합니다. times와 마찬가지로 코드 블록을 매개변수로 받아서 실행됩니다.

코드 블록 안에 있는 { |a| puts a } 가 수행되는 작업이며, 해당 코드의 의미는 배열의 각 요소를 출력하라는 것이죠.

 

다음은 Integer 객체의 메서드인 times를 사용자 정의 버전으로 구현한 것입니다.

위 코드는 기존 Integer 클래스에 새로운 메서드를 추가합니다. my_times 메서드는 주어진 횟수만큼 루프를 형성하여 yield와 함께 코드 블록을 실행합니다. 

여기서 yield라는 키워드가 나오는데, yield를 사용하면 블록 내의 코드를 실행할 수 있습니다.

- 기존에 존재하는 Integer 클래스에 새로운 메서드를 추가하였는데, 추가하기 전 메서드 목록과 추가를 하고나서의 메서드 목록을 비교해보았습니다.

my_times 메서드 추가 전; my_times 메서드는 존재하지 않는다.
my_times 메서드 추가 후; 두 번째 줄에 :my_times가 추가된 것을 볼 수 있다.

 

또한, 코드 블록은 매개변수로 사용될 수도 있습니다.

위와 같은 방법은 실행할 수 있는 코드를 데이터처럼 주고받을 수 있도록 해줍니다. 단순히 값이나 주소값을 매개변수로 주는 것이 아닌, 실행문(ex. 조건에 따라)을 매개변수로 전달할 수 있다는 것입니다. 

 

 

+) 코드블록에서 메서드의 입력 값을 표현할 수도 있습니다.

코드 블록에서 입력값을 받기 위해서는 | name, age |와 같이 | | 을 사용하며, my_func 메서드의 yield("Junstar", 29)는 코드 블록을 호출하면서 코드 블록에게 값을 전달합니다.

 

 

마지막으로 앞으로 살펴볼 코드가 복잡해지고, 콘솔에서 작업하는 것이 불편하기 때문에 파일에 저장하여 실행하는 방식으로 진행을 하도록 하겠습니다. 루비 코드 파일은 .rb 확장자를 가지며 실행하는 방법은 아래와 같습니다. 저는 D 드라이버에 example.rb 파일을 만들고 아래와 같이 입력하여 실행했습니다.

1
puts 'Hello, World'
cs

결과

루비를 실행할 수 있는 다양한 개발환경이 있겠지만, 당장 필요하지 않기 때문에 저는 Notepad로 편집했고, 나중에 필요하다면 다른 툴을 사용해보도록 하겠습니다.

댓글