kyucumber
전체 글 보기

이펙티브 코틀린 아이템 23. 타입 파라미터의 섀도잉을 피하라

프로퍼티와 파라미터가 같은 이름을 가지는 경우 지역 파라미터가 외부 스코프에 있는 프로퍼티를 가리며 이를 섀도잉(shadowing)이라고 부른다.

class Forest(val name: String) { fun addTree(name: String) { // ... } }

이러한 섀도잉 현상은 클래스 타입 파라미터와 함수 타입 파라미터 사이에서도 발생한다.

interface Tree class Birch: Tree class Spruce: Tree // Type parameter "T" is never used class Forest<T: Tree> { // Forest와 addTree의 타입 파라미터가 독립적으로 동작하는 문제 fun <T: Tree> addTree(tree: T) { // .. } } val forest = Forest<Birch>() forest.addTree(Birch()) forest.addTree(Spruce())

위에 주석에도 적었지만, Forest 클래스의 타입 파라미터와 addTree 함수의 타입 파라미터가 독립적으로 동작하게 되어 addTree 메소드에 의도하지 않은 타입이 전달될 수 있다.

독립적인 타입 파라미터를 의도했다면 이름을 아예 다르게 하는것이 좋다.

class Forest<T: Tree> { fun <ST: Tree> addTree(tree: ST) { // .. } }

정리

타입 파라미터 섀도잉을 피하자.

Reference

  • 이펙티브 코틀린 - 프로그래밍 인사이트, 마르친 모스칼라 지음, 윤인성 옮김

개인적인 기록을 위해 작성된 글이라 잘못된 내용이 있을 수 있습니다.

오류가 있다면 댓글을 남겨주세요.

Table of contents