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