[Scala] implicit keyword (3) - Implicit parameter

implicit keyword의 3번째 사용법은 implicit parameter와 implicit value를 선언하는 것이다. implicit parameter는 함수를 호출할 때 인자를 생략할 수 있도록 해준다. 정확히는 함수를 호출할 때 인자를 생략하면 자동으로 그 인자를 채워서 실행시켜준다. 이때 무엇으로 채워주는지를 정하는 규칙은 2가지가 있다. 1)

첫 번째 규칙은 함수가 호출된 scope에서 prefix 없이 접근할 수 있는 implicit parameter와 같은 타입의 변수 중에 implicit label이 붙은 변수를 사용하는 것이다. 이 규칙에는 2가지 타입의 변수가 해당한다. 하나는 implicit parameter이고, 다른 하나는 해당 스코프에 선언된 implicit modifier가 붙은 local 변수이다. 이때 함수가 호출된 스코프에서 해당하는 규칙에 적용되는 변수가 2개 이상 있으면 "ambiguous implicit values"라는 메시지와 함께 컴파일 에러를 발생시킨다. 여기서 주의해야 할 점은 반드시 implicit parameter와 같은 타입의 변수여야 한다는 것이다. 설령 implicit converter로 변환 가능한 변수가 있어도 이는 implicit parameter로 넘어가지 않는다.

두 번째 규칙은 companion object에 정의된 변수 중 implicit parameter와 같은 타입으로 선언된 implicit label이 붙은 변수를 사용하는 것이다. 이는 첫 번째 규칙에 해당하는 변수가 없을 때 사용되고, 첫 번째 규칙과 마찬가지로 두 번째 규칙에 해당하는 변수가 2개 이상 있으면 "ambiguous implicit values"라는 메시지와 함께 컴파일 에러를 발생시킨다. implicit converter를 적용하지 않는 것도 첫 번째 규칙과 같다.

Scala library에서 implicit parameter를 잘 활용하는 대표적인 예는 Future class다. Future class의 method들은 언제나 자신이 실행될 ExecutionContext를 필요로 한다. 원래대로라면 함수를 호출할 때마다 ExecutionContext를 넘겨야 한다. 하지만 이를 implicit parameter로 선언하여 함수를 호출할 때 명시적으로 ExecutionContext를 넘기지 않아도 되도록 하였다.

이는 boilerplate 코드를 간단하게 만든다는 장점도 있다. 하지만 다른 무엇보다도 서로 다른 symbol을 가지는 Option이나 List의 list comprehension method들2)과 같은 look and feel을 가지게 해준다는 장점이 크다. 같은 look and feel을 가지는 것이 단순히 감성적인 문제 때문에 좋은 게 아니다. Scala는 list comprehension method들에 대해서 for comprehension3)을 사용할 수 있게 해주기 때문에 좋은 것이다.


1) https://www.scala-lang.org/old/node/114

2) map, flatMap, filter 등...

3) https://www.scala-lang.org/old/node/111 for comprehension도 Scala의 중요 feature 중 하나이기 때문에 후에 따로 설명하도록 하겠다.


댓글

이 블로그의 인기 게시물

[C++] enum class - 안전하고 쓰기 쉬운 enum

RAII는 무엇인가

Log Aggregator 비교 - Scribe, Flume, Fluentd, logstash

[Python] cache 데코레이터로 최적화하기

[Web] SpeechSynthesis - TTS API