[Scala] implicit keyword (2) - Implicit class

Scala에서 implicit keyword를 사용하는 또 다른 예제는 Implicit class이다. Implicit class는 이미 존재하는 class에 새로운 함수를 추가하여 확장하기 위해서 사용된다. 정확히 말하면 원래 있던 클래스 자체를 바꾸지는 않고, class를 implicit conversion해서 호출할 수 있는 함수를 추가할 수 있게 해준다.

Standard library에 있는 implicit class의 대표적인 예는 Duration class들이다.

위의 예제에서 보듯이 DurationIntDurationDouble이라는 implicit class가 각각 IntDouble을 확장시켜서 seconds/milliseconds/nanoseconds 같은 method를 추가해서 Duration 객체를 만들 수 있게 해준다.

이 설명을 보면 지난 글에서 설명해줬던 implicit converter가 해줄 수 있는 일과 크게 다르지 않아 보인다. 사실 Implicit class는 implicit converter의 syntactic sugar에 불과하다. 내부적으로 implicit class로 정의된 classclass의 이름과 같은 implicit converter를 같은 scope에 추가한다. 즉, 아래와 같이 정의된 implicit class는 다음과 같이 변환된다.

내부적으로 implicit converter에 해당하는 함수를 정의하는 것이기 때문에 몇 가지 제약사항이 있다. 첫 번째 제약사항으로 implicit classtrait이나 classobject 안에 정의되어야 한다. 이는 함수의 정의가 trait이나 classobject 안에 정의되어야 하기 때문이다. 그래서 보통 implicit class들package object 안에 정의된다.

두 번째 제약사항은 non-implicit인 parameter가 반드시 1개인 constructor를 가지고 있어야 하는 것이다. implici parameter1)는 여러 개 가질 수 있으니 그 외에 넘기고 싶은 인자가 있으면 implicit parameter로 넘겨야 한다.

세 번째 제약사항은 implicit class가 선언되는 scope 안에 implicit class와 같은 이름의 무언가가 있을 수 없다는 것이다. 이것도 내부적으로 implicit converter에 해당하는 함수가 만들어지기 때문이다. 이 때문에 내부적으로 class와 같은 이름의 object를 만드는 case classimplicit class가 될 수 없다.


1) implicit parameter에 대해서는 다음 글에서 설명하도록 하겠다.


댓글

이 블로그의 인기 게시물

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

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

RAII는 무엇인가

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

[Web] SpeechSynthesis - TTS API