Data & Nested classes
자바에서 데이터만 보유하는 클래스를 만들려면 여러 가지 정의해야 하는 경우가 있다
코틀린은 Data클래스를 지원하여 이러한 상황에서 보다 손쉽게 구현할 수 있다.
data class User(val name: String, val age: Int)
기본 생성자에서 선언된 속성을 톻애 equals(), toString() 등의 여러 함수들을 자동으로 생성해준다.
물론 명시적으로 정의할 수도 있다.
기본 생성자에서 1개 이상의 프로퍼티가 있을 경우에 의미가 있으며, abstract, open, sealed, inner가 안된다.
하지만 1.1이후로는 sealed class를 상속할 수 있게 되었다.
만약 Data class에 아무런 프로퍼티를 주지 않고 생성하고 싶을 때는 default값을 설정해 주면 된다.
data class User(val name: String = "", val age: Int = 0)
data class는 copy라는 함수가 있기 때문에 일부 값만 바꾸고 싶다면 유용하게 쓸 수 있다.
val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)
Destructuring Declarations
data class는 destructuring Declarations을 사용 가능하다.
컴파일러가 componentN 함수를 자동으로 만들어 주기 때문이다.
val jane = User("Jane", 35)
val (name, age) = jane
println("$name, $age years of age")
Standard Data Classes
스텐다드 라이브러리에서 제공하는 data 클래스도 있다. Pain, Triple 같은 클래스이다.
val pair = Pair("Jane", 35)
print(pair)
Nested Classes
중첩 클래스란 클래스 안에 다른 클래스가 존재하는 것이다.
즉, 클래스의 멤버로 클래스를 갖는 경우이다.
class Outer{
private val bar: Int = 1
class Nested{
fun foo() = 2
}
}
val demo = Outer.Nested().foo()
멤버처럼 접근 가능하다. 하지만 이 경우에는 내부 클래스에서 외부 클래스에 멤버에 접근이 불가능하다.
하지만 inner라는 키워드를 사용하면 내부 클래스로 동작하게 된다.
class Outer{
private val bar: Int = 1
inner class Nested{
fun foo() = 2
}
}
val demo = Outer().Nested().foo()
익명 내부 클래스도 만들 수 있다.
객체 표현식을 이용해서 익명 내부 클래스의 인스턴스를 생성할 수 있다.
mSearchEditText.setOnClickListener(object: View.OnClickListener {
override fun onClick(v: View?){
//code
}
})
//람다
mSearchEditText.setOnClickListener(View.OnClickListener{
v -> //code
})