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

woga·2023년 7월 1일
0

코틀린 공부

목록 보기
26/54
post-thumbnail
class Forest(val name: String) {

	fun addTree(name: String) {
    	// ...
    }
}

이 코드처럼 프로퍼티와 파라미터가 같은 이름을 가질 수 있다. 이렇게 되면 지역 파라미터가 외부 스코프에 있는 프로퍼티를 가리는데 이걸 Shadowing(섀도잉)이라 한다. 또한 개발자들도 문제가 있을 경우 한 번에 찾기 쉽기 때문에 경고도 발생시키지 않는다.

이 현상은 클래스 타입 파라미터와 함수 타입 파라미터 사이에서도 발생한다. 개발자가 제네릭을 제대로 이해하지 못할 때 이와 관련 된 다양한 문제들이 발생한다. 하지만 이는 심각한 문제가 되기도 하며 개발자가 스스로 문제를 찾아내기도 힘들다

interface Tree
class Birch: Tree
class Spruce: Tree

class Forest<T: Tree> {

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

이렇게 코드를 작성하면 Forest와 addTree의 타입 파라미터가 독립적으로 동작한다.

val forest = Forest<Birch>()
forest.addTree(Birch())
forest.addTree(Spruce())

이러한 상황을 의도하는 경우는 거의 없을 것이다. 또한 코드만 봐서는 둘이 독립적으로 동작한다는 것은 빠르게 알아내기도 힘들다. 따라서 addTree가 클래스 타입 파라미터인 T를 사용하게 하는 것이 좋다

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

//Usage
val forest = Forest<Birch>()
forest.addTree(Birch())
forest.addTree(Spruce()) // ERROR, type mismatch

만약 독립적인 타입 파라미터를 의도했다면 이름을 아예 다르게 다는 것이 좋다. 참고로 다음 코드처럼 타입 파라미터를 사용해서 다른 타입 파라미터에 제한을 줄 수도 있다.

class Forest<T: Tree> {

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

정리

타입 파라미터 섀도잉을 피하기 바란다. 타입 파라미터 섀도잉이 발생한 코드는 이해하기 어렵다. 타입 파라미터가 섀도잉되는 경우에는 코드를 주의해서 살표보길 바란다.

profile
와니와니와니와니 당근당근

0개의 댓글