Kotlin 중첩, 내부, 데이터 클래스

Notepad96

·

2020. 10. 6. 18:27

300x250

 

 

 

 

 

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. 참 조

 

 

Nested and Inner Classes - Kotlin Programming Language

 

kotlinlang.org

 

 

 

Data Classes - Kotlin Programming Language

 

kotlinlang.org

 

 

 

 

300x250