노트/Java to Kotlin

object, data class, enum, 람다

작성

step 12(object), 14(다양한 클래스), 15(배열과 컬렉션), 17(람다)에서 적은 것이다. 뒤로 갈수록 메모가 짧아진다.

companion object: Java 의 static

class KotlinPerson private constructor(
    val name: String,
    var age: Int
) {
    // static 처럼 클래스와 동행하는 유일한 객체라고 생각하자
    companion object {
        // 컴파일할 때 값이 정해지는 진짜 상수일 때만 const 를 쓴다
        private const val MIN_AGE = 1

        @JvmStatic   // Java 에서 companion object 를 쓸 때 붙인다
        fun newBaby(name: String): KotlinPerson {
            return KotlinPerson(name, MIN_AGE)
        }
    }
}

companion object 도 하나의 객체다. 이름을 붙일 수 있고 다른 타입을 상속받을 수도 있다.

interface Log {
    fun log()
}

// companion object Factory : Log {
//     override fun log() {
//         println("I'm a companion object")
//     }
// }

object: 싱글톤

object SingletonPerson {
    val name = "Singleton"
}

println(SingletonPerson.name)

익명 클래스: object : 타입

interface MoveAble {
    fun move()
    fun stop()
}

private fun moveSomething(moveAble: MoveAble) {
    moveAble.move()
    moveAble.stop()
}

moveSomething(object : MoveAble {
    override fun move() {
        println("Move")
    }

    override fun stop() {
        println("Stop")
    }
})

요약

  1. Java 의 static 변수와 함수를 만들려면 companion object 를 쓴다.
  2. companion object 도 객체라서 이름을 붙이고 다른 타입을 상속받을 수 있다.
  3. 싱글톤은 object 키워드로 만든다.
  4. 익명 클래스는 object : 타입 으로 만든다.

data class 와 enum class

data class PersonDto(
    var name: String = "",
    var age: Int = 0
)

enum class Country(
    private val code: String
) {
    KOREA("KR"),
    USA("US"),
    JAPAN("JP"),
    CHINA("CN");

    fun getCode(): String {
        return code
    }
}
  • data class 는 equals, hashCode, toString 을 만들어 준다. DTO 에 쓴다.
  • enum class 는 생성자와 메서드를 가질 수 있고, when 과 함께 쓰면 분기가 깔끔해진다. sealed class 도 when 과 함께 쓴다.

배열과 컬렉션

val array = arrayOf(100, 200)
for (i in array.indices) {
    println("$i ${array[i]}")
}

val numbers = listOf(100, 200)
println(numbers[0])

for ((index, value) in numbers.withIndex()) {
    println("$index $value")
}

람다

class Fruit(val name: String, val price: Int)

val fruits = listOf(
    Fruit("사과", 2_000),
    Fruit("바나나", 3_000),
)

// 함수 타입은 (파라미터 타입) -> 반환 타입 이다
val isApple: (Fruit) -> Boolean = fun(fruit: Fruit): Boolean {
    return fruit.name == "사과"
}

// 람다로 쓰면 마지막 expression 이 반환 값이 된다
val isApple2 = { fruit: Fruit -> fruit.name == "사과" }

Kotlin 에서 함수는 일급 시민이다. 값처럼 변수에 넣고 파라미터로 넘길 수 있다.