개발자 노트

Yield에 대하여 부제 : 함수형 프로그래밍 본문

컴퓨터 언어/Ruby

Yield에 대하여 부제 : 함수형 프로그래밍

jurogrammer 2020. 7. 22. 22:19

출처

Yield...? 뭐냐

ruby를 처음보면 '뭐야 ㅋㅋㅋ 완전 파이썬이네'싶은 마음에 쉽게 쉽게 배워갔습니다. 그러다가 루비 심볼이라는 새로운 개념을 만나고, 이를 넘어서 yield를 만나는 순간 벙찌게 되었습니다. '도대체 어디다가 써먹는거지?'

어떻게 작동하는지는 알겠습니다.

  1. 메소드 안에 yield를 작성한다
  2. 나중에 이를 사용하기 위해 메소드를 invoke하고, 그 안에 코드 블럭을 넣는다.
  3. 그러면 메소드가 동작하다가 yield부분에 코드 블럭이 들어가고, 코드 블럭이 실행된다음 나머지 메소드 명령이 실행됩니다.
    • yield는 함수처럼 변수를 넣어 줄 수도 있고, 리턴 값을 건네줄 수도 있습니다.

그런데 왜 이런식으로 코드를 작성하는 건가요...? 그냥 yield부분에 private으로 선언한 함수를 실행해주면 되는 것 아닌가요?! 하는 의문이 생겼습니다.

그리고 이것저것 인터넷 검색을 통해서 한가지 키워드를 마주치게 되었습니다.

함수형 프로그래밍-순수함수

이 주제와 매우 맞닿아있었습니다.

자바스크립트에서 함수를 변수로 받고, 함수를 return값으로 출력하고 그리고 루비에서 yield는 이 패러다임에 속해있던 겁니다.

추후에 이를 따로 다뤄보겠습니다. 여튼 yield 설명에서 가장 핵심적인 요소는 순수함수여야 한다는 것입니다.

순수함수란 외부의 변화에 영향받지 않고 동일한 인자를 받으면 반드시 동일한 결과가 나오는 함수를 일컫습니다. (한편으로 이는 기대한 값이 나오기 때문에 멀티 쓰레드 환경에서 유용하게 쓰인다 하네요)

[코드 1]

def sum(a,b):
    return a+b

이는 리턴값이 전적으로 인자인 a,b에 의존하고 있기 때문에 순수함수입니다.

[코드 2]

c = 1
def sum(a,b):
    return a+b+c

이 함수의 리턴 값은 sum의 인자 a,b포함하여 외부 변수인 c에 영향을 받으로 이 함수는 순수함수가 아닙니다.

그렇다면 순수함수는 yield와 어떤 연관성이 있을까요?

yield의 정체

그래서 함수형 프로그래밍의 패러다임에서는 함수는 순수함수여야 합니다. 그런데 함수의 주요 로직은 그대로 둔 채 일부 로직을 첨가하여 함수를 재사용하고 싶을 때가 있습니다. 다른 방식으로 재사용한다는 것은 내부 값이 변경될 수 있다는 것을 의미하고 이는 순수함수에 벗어납니다.

따라서 내부 로직에 대한 변경은 해당 메소드 사용시 작성하도록 양보(yield)하는 것이죠. 이렇게 하면 이 메소드는 private로 특정 메소드를 실행하여 로직을 재사용하는 것에 비해 외부 변경에 대한 위험을 없앨 수 있습니다! 즉, input에 대해 반드시 기대하는 값이 나올 수 있다는 겁니다.

이런 관점에서 받아들인다면 yield의 용어, 그리고 왜 사용하는지에 대해 이해할 수 있으리라 봅니다.

...

이번 글은 설명이 매우 부족했던 것 같습니다. yield에 대한 글은 쓰고 싶고... 그런데 회사갔다오면 9시, 10시되고... 부족한 공부를 조금하면 금방 잠잘 시간이 되버립니다. 그래서 제 욕심에 후다닥 썻네요. 흐음... 부족한 글은 나중에 보완하는 식으로 덧붙여보겠습니다.

반응형

'컴퓨터 언어 > Ruby' 카테고리의 다른 글

ActiveRecord 고찰  (0) 2021.02.19
Comments