라벨이 Implicit class인 게시물 표시

[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개인 c