독서

[이펙티브 코틀린] 2장. 가독성

오렌지색 귤 2024. 6. 30. 23:18
반응형

아이템 11. 가독성을 목표로 설계하라

 

찾아본 내용

 

p. 73

 

let은 람다식의 결과를 리턴합니다.

 

let 함수

 

  1. 문법 및 사용법
  • let 함수는 확장 함수로, 모든 객체에서 호출할 수 있다
  • let 함수는 객체를 람다의 인자로 전달하고, 그 람다 블록의 결과를 반환한다
  • 람다 식 내에서 객체를 참조하려면 기본적으로 it를 사용하거나 명시적으로 변수명을 지정할 수 있다

 

  1. 활용 예시
  • null 안전성 확보
    • 특정 변수가 널이 아닐 때만 어떤 작업을 수행하려면 ?.let을 사용합니다.
  • 체이닝
    val result = "Kotlin".let {
      it.toUpperCase()
    }.let {
      it.reversed()
    }
    println(result)  // "NITLOK"
  • 유형 변환 및 처리
    val number = "1234".toIntOrNull()?.let {
      it * 2  // 숫자를 두 배로 증가
    }
    println(number)  // 2468

 

p. 74

 

가변 프로퍼티는 쓰레드의 관련된 문제를 발생시킬 수 있으므로, 스마트 캐스팅이 불가능합니다.

 

가변 프로퍼티와 스마트 캐스팅

 

가변 프로퍼티는 값이 언제든지 변경될 수 있기 때문에, 컴파일러가 해당 프로퍼티의 타입을 안전하게 추론할 수 없다.


예를 들어, 특정 시점에서 String 타입이었던 가변 프로퍼티가 이후에 다른 타입으로 변경될 가능성이 있기 때문에 스마트 캐스팅이 불가능하다.

 

var someValue: Any = "Hello"

if (someValue is String) {
    println(someValue.length)  // 스마트 캐스팅이 불가능합니다.
}

 

위 코드에서 someValueString 타입으로 확인된 후에도, 다른 쓰레드가 someValue의 값을 변경할 수 있으므로, 안전하지 않다.


따라서, 코틀린 컴파일러는 가변 프로퍼티에 대해 스마트 캐스팅을 허용하지 않는다.

 

 

 

 

 

아이템 12. 연산자 오버로트를 할 때는 의미에 맞게 사용하라

 

찾아본 내용

 

p. 80

 

코틀린에서 infix 키워드를 사용하면, 함수 호출 시 점(.)과 괄호를 생략하고 중위 표기법으로 함수 호출이 가능하다.


이는 코드 가독성을 높이고 자연스러운 문법으로 만들 수 있으며, 특히 확장 함수와 함께 사용하면 매우 유용하다.

 

infix 함수

 

조건

  1. 인픽스 함수는 멤버 함수 또는 확장 함수
  2. 인픽스 함수는 하나의 파라미터만 가질 수 있다
  3. 파라미터는 기본값을 가질 수 없다

 

예제

infix fun String.concatWith(space: String): String {
    return this + space
}

fun main() {
    val result = "Hello" concatWith "World"
    println(result)  // Output: HelloWorld
}

 

 

 

p. 80

 

아래 두 함수의 차이는?

 

// A
operator fun Int.times(operation: () -> Unit) {
    repeat(this) {
        operation()
    }
}

// B
infix fun Int.timesRepeated(operation: () -> Unit) {
    repeat(this) {
        operation()
    }
}

 

A의 경우 Int 타입에 대해 * 연산자를 오버로딩한다.


operation이라는 함수 타입 파라미터를 받아, 이를 this가 가리키는 숫자만큼 반복하여 실행한다.

 

 

사용 예시

 

5 * { println("Hello") }

 

B의 경우 Int 타입에 대해 timesRepeated라는 이름의 infix 함수를 정의한다.


이 함수도 operation 이라는 함수 타입 파라미터를 받아 이를 this가 가리키는 숫자만큼 반복하여 실행한다.

 

 

사용 예시

 

5 timesRepeated { println("Hello") }

 

 

아이템 13. Unit?을 리턴하지 말라

생략

 

 

 

아이템 14. 변수 타입이 명확하지 않은 경우 확실하게 지정하라

생략

 

 

 

아이템 15. 리시버를 명시적으로 참조하라

 

p.88

 

찾아본 내용

 

also 함수와 let 함수의 차이는?

 

주요 차이점은 람다의 결과와 this 참조 방식이다.

 

let 함수 특징

  • 객체를 인수로 받아 람다를 실행
  • 람다의 결과를 반환
  • 주로 객체를 다른 타입으로 변환하거나 임시 변수를 사용할 때 유용

 

also 함수 특징

  • 객체를 인수로 받아 람다를 실행
  • 원래 객체를 반환
  • 주로 객체 자체를 변경하거나 추가 작업을 할 때 유용

 

활용 예시

// let 활용 예시 (null 안전성 확보)
val name: String? = "Kotlin"
val length = name?.let {
    println(it) // "Kotlin"
    it.length   // 6
}
println(length) // 6

// also 활용 예시 (객체 상태 변경)
val numbers = mutableListOf("one", "two", "three")
val result = numbers.also {
    it.add("four")
    println(it) // [one, two, three, four]
}
println(result) // [one, two, three, four]

 

 

아이템 16. 프로퍼티는 동작이 아니라 상태를 나타내야 한다

생략

 

 

 

 

아이템 17. 이름 있는 아규먼트를 사용하라

생략

 

 

 

 

아이템 18. 코딩 컨벤션을 지켜라

생략

반응형