[Scala] implicit keyword (2) - Implicit class
Scala에서 implicit
keyword를 사용하는 또 다른 예제는 Implicit class이다. Implicit class는 이미 존재하는 class에 새로운 함수를 추가하여 확장하기 위해서 사용된다. 정확히 말하면 원래 있던 클래스 자체를 바꾸지는 않고, class를 implicit conversion해서 호출할 수 있는 함수를 추가할 수 있게 해준다.
Standard library에 있는 implicit class
의 대표적인 예는 Duration class들이다.
위의 예제에서 보듯이 DurationInt
와 DurationDouble
이라는 implicit class
가 각각 Int
와 Double
을 확장시켜서 seconds
/milliseconds
/nanoseconds
같은 method를 추가해서 Duration
객체를 만들 수 있게 해준다.
이 설명을 보면 지난 글에서 설명해줬던 implicit converter가 해줄 수 있는 일과 크게 다르지 않아 보인다. 사실 Implicit class는 implicit converter의 syntactic sugar에 불과하다. 내부적으로 implicit class
로 정의된 class
는 class
의 이름과 같은 implicit converter를 같은 scope에 추가한다. 즉, 아래와 같이 정의된 implicit class
는 다음과 같이 변환된다.
내부적으로 implicit converter에 해당하는 함수를 정의하는 것이기 때문에 몇 가지 제약사항이 있다. 첫 번째 제약사항으로 implicit class
는 trait
이나 class나 object
안에 정의되어야 한다. 이는 함수의 정의가 trait
이나 class
나 object
안에 정의되어야 하기 때문이다. 그래서 보통 implicit class들
은 package object 안에 정의된다.
두 번째 제약사항은 non-implicit인 parameter가 반드시 1개인 constructor를 가지고 있어야 하는 것이다. implici parameter1)는 여러 개 가질 수 있으니 그 외에 넘기고 싶은 인자가 있으면 implicit parameter로 넘겨야 한다.
세 번째 제약사항은 implicit class
가 선언되는 scope 안에 implicit class
와 같은 이름의 무언가가 있을 수 없다는 것이다. 이것도 내부적으로 implicit converter에 해당하는 함수가 만들어지기 때문이다. 이 때문에 내부적으로 class
와 같은 이름의 object
를 만드는 case class
는 implicit class
가 될 수 없다.
1) implicit parameter에 대해서는 다음 글에서 설명하도록 하겠다.
댓글
댓글 쓰기