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")
}
})
요약
- Java 의 static 변수와 함수를 만들려면
companion object를 쓴다. - companion object 도 객체라서 이름을 붙이고 다른 타입을 상속받을 수 있다.
- 싱글톤은
object키워드로 만든다. - 익명 클래스는
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 에서 함수는 일급 시민이다. 값처럼 변수에 넣고 파라미터로 넘길 수 있다.