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
- 서비스 vs 쓰레드
- 안드로이드 유닛 테스트 예시
- android retrofit login
- 멤버변수
- 큐 자바 코드
- 안드로이드 라이선스
- 스택 자바 코드
- 2022 플러터 안드로이드 스튜디오
- jvm이란
- 스택 큐 차이
- ar vr 차이
- rxjava disposable
- android ar 개발
- 플러터 설치 2022
- Rxjava Observable
- 안드로이드 유닛테스트란
- ANR이란
- 안드로이드 레트로핏 사용법
- rxjava cold observable
- jvm 작동 원리
- 안드로이드 os 구조
- 2022 플러터 설치
- 자바 다형성
- 객체
- rxjava hot observable
- 서비스 쓰레드 차이
- 클래스
- 안드로이드 레트로핏 crud
- 안드로이드 유닛 테스트
- 안드로이드 라이선스 종류
Archives
- Today
- Total
나만을 위한 블로그
[이펙티브 코틀린] 아이템 12. 연산자 오버로드를 할 때는 의미에 맞게 써라 본문
728x90
반응형
예를 들어 팩토리얼을 구하는 함수를 생각해 본다.
fun Int.factorial(): Int = (1..this).product()
fun Iterable<Int>.product(): Int =
fold(1) { acc, i -> acc * i }
이 함수는 Int 확장 함수로 정의돼 있어 편하게 쓸 수 있다.
fun main() {
print(10 * 6.factorial()) // 7200
}
팩토리얼은 ! 기호를 써서 표기하지만 코틀린은 이런 연산자를 지원하지 않는다. 그러나 아래처럼 연산자 오버로딩을 활용하면 만들 수 있다.
// not() = "!" 기호
operator fun Int.not() = factorial()
fun main() {
print(10 * !6) // 7200
}
이렇게 할 수는 있지만 이렇게 해선 안 된다. 이 함수의 이름이 not인 것에 주목하라. 함수명이 not이므로 논리 연산에 사용해야지 팩토리얼 연산에 쓰면 안 된다. 코드를 이렇게 작성하면 오해의 소지가 있다. 모든 연산자는 연산자 대신 함수로도 호출할 수 있다.
코틀린에서 각 연산자의 의미는 항상 같게 유지된다. 예를 들어 아래 코드를 본다.
x + y == z
이 코드는 언제나 다음과 같은 코드로 변환된다.
(x.plus(y))?.equal(z) ?: (z == null)
이는 구체적인 이름을 가진 함수고 모든 연산자가 이런 이름이 나타내는 역할을 할 거라고 기대된다. 이처럼 이름만으로 연산자 사용이 크게 제한된다. 따라서 팩토리얼을 계산하기 위해 ! 연산자를 쓰면 안 된다.
분명하지 않은 경우
관례를 충족하는지 아닌지가 확실하지 않을 때가 문제다. 예를 들어 함수를 세 배 한다는 건 무슨 의미인가?
operator fun Int.times(operation: () -> Unit): () -> Unit =
{ repeat(this) { operation() } }
val tripledHello = 3 * { print("Hello") }
fun main() {
tripledHello() // HelloHelloHello
}
의미가 명확하지 않다면 infix를 활용한 확장 함수를 쓰는 게 좋다. 일반적인 이항 연산자 형태처럼 사용할 수 있다.
infix fun Int.timesRepeated(operation: () -> Unit) = run { repeat(this) { operation() } }
val tripledHello = 3 timesRepeated { print("Hello") }
fun main() {
tripledHello // HelloHelloHello
}
톱 레벨 함수를 쓰는 것도 좋다. 사실 함수를 n번 호출하는 건 다음 같은 형태로 이미 stdlib에 구현돼 있다.
규칙을 무시해도 되는 경우
지금까지 확인한 연산자 오버로딩 규칙을 무시해도 되는 중요한 경우가 있다. 바로 도메인 특화 언어(DSL)를 설계할 때다.
반응형
'책 > Effective Kotlin' 카테고리의 다른 글
[이펙티브 코틀린] 아이템 14. 변수 타입이 명확하지 않은 경우 확실하게 지정하라 (0) | 2022.07.18 |
---|---|
[이펙티브 코틀린] 아이템 13. Unit?을 리턴하지 마라 (0) | 2022.07.10 |
[이펙티브 코틀린] 아이템 11. 가독성을 목표로 설계하라 (0) | 2022.06.19 |
[이펙티브 코틀린] 아이템 10. 단위 테스트를 만들어라 (0) | 2022.06.05 |
[이펙티브 코틀린] 아이템 9. use를 써서 리소스를 닫아라 (0) | 2022.06.02 |
Comments