타입 파라미터의 새도잉을 피하라.

섀도잉이란?

class Programmer(
		private val name: String
) {
		fun addKeyboard(name: String){
			...
		}
}
  • 위 예시 처럼 프로퍼티(name)와 파라미터(name)가 동일한 이름을 사용하는 경우 지역 파라미터가 외부 스코프에 있는 프로퍼티를 가리는 문제를 말한다.
interface Keyboard

class QK: Keyboard
class KeyChrone: Keyboard

class Programmer<T: Keyboard> {	
		fun <T: Keyboard> addKeyboard(keyboard: T) {
			...
		}
}

val programmer = Programmer<QK>()
programmer.addKeyboard(QK())
programmer.addKeyboard(KeyChrone())

  • 위 예시처럼 클래스 타입 파라미터와 함수 타입 파라미터 사이에서도 발생하며 두 타입은 독립적으로 동작한다.
  • 이러한 경우 개발자가 의도하는 경우가 거의 없으며, 문제를 찾아내기가 힘들어짐.

개선

class Programmer<T: Keyboard> {	
1>	fun addKeyboard(keyboard: T) {
			...
		}
		

2>	fun <ST: T> addKeyboard(keyboard: ST){ 
			...
		}
}

val programmer = Programmer<QK>()
programmer.addKeyboard(QK())
programmer.addKeyboard(KeyChrone()) // ERROR

  1. 클래스 타입 파라미터를 사용하도록 변경
  2. 독립적인 타입 파라미터를 사용하는 경우 이름을 다르게 사용.
    • 타입 파라미터를 사용해 다른 타입 파라미터에 제한을 주는것도 가능.

정리

  • 코드를 읽고 이해하기 어려워지는 타입 파라미터 섀도잉을 피하자!