제거됨: 약한 합치

제거됨: 약한 합치 (Weak Conformance)

타입 호환성 검사나 타입 집합의 최소 상한(least upper bound)을 계산할 때 Scala 2가 쓰던 약한 합치(weak conformance) 관계가 Scala 3에서 제거됐어요. 이 관계가 무엇이고 왜 빠졌는지 볼게요.

출처: Scala 3 Reference

본문

몇몇 상황에서 Scala는 타입 호환성을 검사하거나 타입 집합의 최소 상한을 계산할 때 약한 합치 관계를 사용했어요. 약한 합치의 주된 동기는 다음과 같은 표현식이 List[Double] 타입을 갖게 하려는 거였어요:

List(1.0, math.sqrt(3.0), 0, -3.3) // : List[Double]

이런 결과가 List[Double]가 되는 건 "자명해" 보여요. 하지만 특별한 조항이 없다면 리스트의 요소 타입 (Double, Double, Int, Double)의 최소 상한은 AnyVal이 돼서, 리스트 표현식은 List[AnyVal] 타입을 받게 될 거예요.

덜 자명한 예는 다음인데, 이 역시 약한 합치 관계를 써서 List[Double]로 타입이 잡혔어요.

val n: Int = 3
val c: Char = 'X'
val d: Double = math.sqrt(3.0)
List(n, c, d) // used to be: List[Double], now: List[AnyVal]

여기서는 왜 타입이 List[Double]로 넓어져야 하는지 덜 분명해요. List[AnyVal]도 그만큼 유효하고 오히려 더 원칙적인 선택처럼 보이거든요.

약한 합치는 모든 "수치" 타입(Char 포함)에 적용됐고, 표현식이 리터럴인지와 무관했어요. 하지만 되돌아보면 의도된 사용처는 오직 정수 리터럴을 다른 표현식의 타입에 맞추는 경우뿐이었어요. 다른 수치 타입은 문법에 명시적 타입 표기가 내장되어 있어서(f, d, ., L 또는 Char를 위한 '), 작성자가 정말로 그 특정 타입을 의도했음을 보장해 줍니다.

그래서 Scala 3는 약한 합치의 일반적 개념을 버리고, 한 가지 규칙만 유지해요. 즉 필요한 경우 Int 리터럴을 다른 수치 타입에 맞춘다는 규칙이에요.

더 자세한 내용

더 알아보기 (Learn more)