KOTLIN

[KOTLIN] 타입 파라미터의 섀도잉을 피하라 (이펙티브 코틀린)

집한구석 2022. 7. 10. 10:51
728x90

섀도잉

class User(val email: String) {

  fun isMatchingEmail(email: String): Boolean {
    ...
  }
  ...
}
  • 프로퍼티와 파라미터가 같은 이름을 가지게 되어, 지역 파라미터가 외부 스코프에 있는 프로퍼티를 가리게 되는 것을 섀도잉이라 함
  • 그냥 프로퍼티와 파라미터가 같은 이름을 가질 수 있음으로 정의

interface Tree
class Birch: Tree
class Spruce: 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(Spruce()) //정상동작...
}

-----------------------------------------

class Forest<T: Tree> {
    fun addTree(tree: T) {
        println("adding tree ...")
    }
}

fun main() {
    val forest = Forest<Birch>()
    forest.addTree(Birch())
    forest.addTree(Spruce()) // error
}

-----------------------------------------

class Forest<T: Tree> {
    fun <ST: Tree> addTree(tree: ST) {
        println("adding tree ...")
    }
    
    // 다른 타입 파라미터에 제한을 준 경우
    fun <ST: T> addTypeTree(tree: ST) {
        println("adding tree ...")
    }
}
  • 섀도잉은 클래스 타입 파라미터와 함수타입 파라미터 사이에서도 발생을 함
  • 독립적인 타입의 파라미터를 의도한 경우에는 타입 파라미터의 이름을 다르게 정의하는 것이 좋음