-
23장 - 타입 파라미터의 섀도잉을 피하라Kotlin/Effective Kotlin 요약 2023. 3. 6. 00:01728x90
섀도잉이란?
다음 코드처럼 지역 파라미터가 외부 스코프에 있는 프로퍼티를 가리키는 경우 섀도잉이라 부릅니다.
class Forest(val name: Stirng){ fun addTree(name: String) { //... } }
이런 현상은 클래스 타입 파라미터와 함수 타입 파라미터 사이에서도 발생합니다.
특히 제너릭과 함께 사용되는 경우 다양한 문제가 발생합니다.
interface Tree class Birch: Tree class Sqruce: Tree class Forest<T: Tree>{ fun <T: Tree>addTree(tree: T){ println("adding tree ...") } } fun main() { val forest = Forest<Birch>() forest.addTree(Birch()) forest.addTree(Sqruce()) }
이렇게 코드를 작성하면 Forest와 addTree타입 파라미터가 독립적으로 동작합니다.
코드만 봐서는 둘이 독립적으로 동작한다는 것을 빠르게 알아내기 힘듭니다.
따라서 addTree가 클래스 타입 파라미터인 T를 사용하게 하는 것이 좋습니다.
interface Tree class Birch: Tree class Sqruce: Tree class Forest<T: Tree>{ fun addTree(tree: T){ println("adding tree ...") } } fun main() { val forest = Forest<Birch>() forest.addTree(Birch()) forest.addTree(Sqruce()) //Error, type mismatch }
독립적인 타입 파라미터를 의도했다면 이름을 아예 다르게 다는 것이 좋습니다.
interface Tree class Birch: Tree class Sqruce: Tree class Forest<T: Tree>{ fun <ST: Tree>addTree(tree: ST){ println("adding tree ...") } } fun main() { val forest = Forest<Birch>() forest.addTree(Birch()) forest.addTree(Sqruce()) }
728x90'Kotlin > Effective Kotlin 요약' 카테고리의 다른 글
25장 - 공통 모듈을 추출해서 여러 플랫폼에서 재사용하라 (0) 2023.03.08 24장 - 제네릭 타입과 variance 한정자를 활용하라 (0) 2023.03.07 22장 - 일반적인 알고리즘을 구현할 때 제너릭을 사용하라 (0) 2023.03.05 21장 - 일반적인 프로퍼티 패턴은 프로퍼티 위임으로 만들어라 (0) 2023.03.04 20장 - 일반적인 알고리즘을 반복해서 구현하지 말라 (0) 2023.02.19