Notice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- jvm이란
- android ar 개발
- 안드로이드 os 구조
- android retrofit login
- 플러터 설치 2022
- 안드로이드 유닛 테스트 예시
- 스택 큐 차이
- 안드로이드 라이선스 종류
- 자바 다형성
- rxjava cold observable
- 안드로이드 유닛 테스트
- rxjava hot observable
- ANR이란
- rxjava disposable
- ar vr 차이
- jvm 작동 원리
- 안드로이드 레트로핏 사용법
- 서비스 vs 쓰레드
- 안드로이드 레트로핏 crud
- 서비스 쓰레드 차이
- 안드로이드 라이선스
- 객체
- 2022 플러터 설치
- Rxjava Observable
- 스택 자바 코드
- 큐 자바 코드
- 안드로이드 유닛테스트란
- 클래스
- 멤버변수
- 2022 플러터 안드로이드 스튜디오
Archives
- Today
- Total
나만을 위한 블로그
[이펙티브 코틀린] 아이템 23. 타입 파라미터의 섀도잉을 피하라 본문
728x90
반응형
아래 코드처럼 프로퍼티, 파라미터가 같은 이름을 가질 수 있다. 이렇게 되면 지역 파라미터가 외부 스코프에 있는 프로퍼티를 가린다. 이를 섀도잉(shadowing)이라고 부른다. 이런 코드는 많이 사용된다. 개발자들도 문제가 있으면 쉽게 찾을 수 있는 부분이라 어떤 경고도 발생시키지 않는다.
class Forest(val name: String) {
fun addTree(name: String) {
// ...
}
}
이런 섀도잉 현상은 클래스 타입 파라미터와 함수 타입 파라미터 사이에서도 발생한다. 개발자가 제네릭을 제대로 이해하지 못할 때 이와 관련된 다양한 문제들이 발생한다. 이건 심각한 문제가 될 수 있고 개발자가 스스로 문제를 찾기도 힘들다.
interface Tree
class Birth: Tree
class Spruce: Tree
class Forest<T: Tree> {
fun <T: Tree> addTree(tree: T) {
// ...
}
}
이렇게 코드를 작성하면 Forest, addTree의 타입 파라미터가 독립적으로 동작한다.
interface Tree
class Birch: Tree
class Spruce: Tree
class Forest<T: Tree> {
fun <T: Tree> addTree(tree: T) {
// ...
}
}
fun main() {
val forest = Forest<Birch>()
forest.addTree(Birch())
forest.addTree(Spruce())
}
이런 상황을 의도하는 경우는 거의 없을 것이다. 또한 코드만 봐선 둘이 독립적으로 동작한다는 걸 빠르게 알아내기 힘들다. 따라서 addTree가 클래스 타입 파라미터인 T를 쓰게 하는 게 좋다.
interface Tree
class Birch: Tree
class Spruce: Tree
class Forest<T: Tree> {
fun addTree(tree: T) {
// ..
}
}
fun main() {
val forest = Forest<Birch>()
forest.addTree(Birch())
forest.addTree(Spruce()) // Type mismatch
}
독립적인 타입 파라미터를 의도했다면 이름을 아예 다르게 다는 게 좋다. 아래 코드처럼 타입 파라미터를 사용해서 다른 타입 파라미터에 제한을 줄 수도 있다.
interface Tree
class Birch: Tree
class Spruce: Tree
class Forest<T: Tree> {
fun <ST: T> addTree(tree: ST) {
// ...
}
}
fun main() {
val forest = Forest<Birch>()
forest.addTree(Birch())
}
반응형
'책 > Effective Kotlin' 카테고리의 다른 글
[이펙티브 코틀린] 아이템 25. 공통 모듈을 추출해서 여러 플랫폼에서 재사용하라 (0) | 2022.11.09 |
---|---|
[이펙티브 코틀린] 아이템 24. 제네릭 타입과 variance 한정자를 활용하라 (0) | 2022.10.30 |
[이펙티브 코틀린] 아이템 22. 일반적인 알고리즘 구현 시 제네릭을 써라 (0) | 2022.09.12 |
[이펙티브 코틀린] 아이템 21. 일반적인 프로퍼티 패턴은 프로퍼티 위임으로 만들어라 (0) | 2022.09.11 |
[이펙티브 코틀린] 아이템 20. 일반적인 알고리즘을 반복해서 구현하지 마라 (0) | 2022.09.10 |
Comments