프로퍼티와 파라미터가 같은 이름을 가지는 경우 지역 파라미터가 외부 스코프에 있는 프로퍼티를 가리며 이를 섀도잉(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
- 이펙티브 코틀린 - 프로그래밍 인사이트, 마르친 모스칼라 지음, 윤인성 옮김
개인적인 기록을 위해 작성된 글이라 잘못된 내용이 있을 수 있습니다.
오류가 있다면 댓글을 남겨주세요.