Kotlin 중첩, 내부, 데이터 클래스
Notepad96
·2020. 10. 6. 18:27
1. 중첩 클래스(Nested class)
중첩 클래스(Nested class)는 클래스 안에서 클래스를 선언하는 것이다.
클래스 안에서 선언을하므로 생성하기 위해서는 "바깥 클래스.중첩 클래스" 식으로 생성자를 호출하여야 한다.
class One {
var one: String = "one"
fun print() {
println("One")
//println("$two") error
}
class Two {
var two: String = "two"
fun print() {
println("Two")
//println("$one") error
}
}
}
fun main() {
var one = One()
one.print()
var two = One.Two()
two.print()
}
여기서 중요한점은 클래스 안에 클래스가 선언되어 있지만 서로 접근할 수 있는 관계가 아니라는 것이다.
따라서 중첩 클래스를 생성하기 위해서는 바깥 클래스를 통하여 접근하여야 하지만 서로 프로퍼티나 멤버함수를 공유하지는 않는다.
2. 내부 클래스(Inner class)
중첩 클래스는 생성 시 바깥 클래스를 통하여 접근할뿐 서로 프로퍼티와 멤버 함수를 공유하지 않았었다.
하지만 내부 클래스에서 바깥 클래스의 프로퍼티의 접근하는 등 바깥 클래스와 내부 클래스 간 서로 공유하기 위해서는 내부 클래스(Inner class)를 사용하여야 한다.
class One {
var one: String = "one"
fun print() {
println("One")
println(Two().two)
}
inner class Two {
var two: String = "two"
fun print() {
println("Two")
println(this@One.one)
}
}
}
fun main() {
var one = One()
one.print()
var two = One().Two()
two.print()
}
내부 클래스에서 바깥 클래스 프로퍼티의 접근하기 위하여 "this@바깥 클래스.프로퍼티" 처럼 해주고 있다.
또한, Two 인스턴스를 생성하기 위하여 One().Two() 로 생성자를 호출하고 있다.
3. 데이터 클래스(Data class)
데이터로서의 역할만 하는 클래스일 경우 data 키워드를 사용하여 데이터 클래스 선언하면 추가적인 구현없이 데이터를 다루는데 특화된 클래스를 생성할 수 있다.
data class Book(var name:String, var price: Int)
fun main() {
var book1 = Book("name1", 12000)
var book2 = Book("name1", 16000)
var book3 = Book("name1", 12000)
if(book1 == book2) println("equal")
else println("diff")
if(book1 == book3) println("equal")
else println("diff")
var book4 = book3.copy()
book3.price = 34000
println(book4.toString())
}
equals(), hashCode(), toString(), copy() 의 멤버 함수들이 자동으로 오버라이딩 된다.
따라서 두 인스턴스가 동일한 프로퍼티들을 같는지 간편하게 비교할 수 있으며(equals) copy()를 통하여 간편하게 인스턴스를 복사할 수 있다.
4. 참 조
'Kotlin > Syntax' 카테고리의 다른 글
Kotlin Java equals() (0) | 2022.03.21 |
---|---|
Kotlin 클래스 비교하기 compareTo (0) | 2020.10.07 |
Kotlin 추상 클래스(Abstract class), 인터페이스(Interface) (0) | 2020.10.04 |
Kotlin static 이용 Companion Object (0) | 2020.10.03 |
Kotlin Singleton pattern - object (0) | 2020.10.02 |