컨텍스트 추상화
컨텍스트 추상화 (Contextual Abstractions)
어떤 상황에서는 메서드 호출의 반복적으로 여겨지는 파라미터 몇 개를 생략할 수 있어요. 그런 파라미터를 *컨텍스트 파라미터(Context Parameters)*라고 불러요. 메서드 호출을 둘러싼 컨텍스트에서 컴파일러가 추론해 주기 때문이죠.
예를 들어 주소 리스트를 두 기준—도시 이름, 그리고 거리 이름—으로 정렬하는 프로그램을 생각해 볼게요.
val addresses: List[Address] = ...
addresses.sortBy(address => (address.city, address.street))
sortBy 메서드는 각 주소마다 다른 주소와 비교할 값을 반환하는 함수를 받아요. 이 경우에는 도시 이름과 거리 이름을 담은 쌍(pair)을 반환하는 함수를 넘겼어요.
여기서 우리는 무엇을 비교할지만 지정했지, 어떻게 비교를 수행할지는 지정하지 않았어요. 정렬 알고리즘은 어떻게 String 쌍들을 비교하는 방법을 알까요?
실은 sortBy 메서드가 컴파일러가 추론하는 두 번째 파라미터—컨텍스트 파라미터—를 받아요. 위 예시에서 이 파라미터가 보이지 않는 이유는 컴파일러가 공급해 주기 때문이에요.
이 두 번째 파라미터가 *비교 방법(how to compare)*을 구현해요. 우리는 String들이 일반적으로 사전순(lexicographic order)으로 비교된다는 걸 알기 때문에, 이를 생략하는 게 편리해요.
하지만 명시적으로 넘길 수도 있어요.
addresses.sortBy(address => (address.city, address.street))(using Ordering.Tuple2(Ordering.String, Ordering.String))
Scala 3에서 sortBy의 인자 리스트에 있는 using은 컨텍스트 파라미터를 명시적으로 넘긴다는 뜻이고, 모호함을 피하게 해줘요.
이 경우 Ordering.Tuple2(Ordering.String, Ordering.String) 인스턴스는 정확히 컴파일러가 그렇지 않아도 추론했을 바로 그 인스턴스예요. 다른 말로, 두 예시는 같은 프로그램을 만들어 내요.
*컨텍스트 추상화는 코드 반복을 피하는 데 쓰여요. 개발자가 확장 가능하면서도 동시에 간결한 코드 조각을 작성하도록 도와주죠.
출처: Scala 3 Book
본문
이번 장은 "맛보기(A Taste of Scala)" 부분의 일부로, 컨텍스트 추상화가 어떤 문제를 해결하는지 느낌을 잡는 데 초점을 맞춰요. 위 예시처럼 반복적인 파라미터를 생략하는 기본 아이디어를 이해했다면, 이제 이 책의 컨텍스트 추상화 챕터에서 확장 메서드, 컨텍스트 파라미터, given 인스턴스, 타입 클래스 등을 더 깊이 다룰 준비가 된 거예요.