좌충우돌 코딩

코틀린 - 다양한 클래스 본문

코틀린/순수 코틀린

코틀린 - 다양한 클래스

Tracoding 2023. 3. 27. 23:26

코틀린의 다양한 클래스가 있죠.

그 중 오늘 알아볼 클래스는 데이터 클래스와 오브젝트 클래스, 컴패니언 클래스입니다.

데이터 클래스

데이터 클래스는 data 키워드로 선언하여 VO(value-object)클래스를 편리하게 이용할 수 있게 해줍니다.

data class DataClass(val name: String, val age: Int)

 

데이터 클래스는 데이터를 다루는데 편리한 기능을 제공하는 것이 주목적이므로 위의 코드처럼 주 생성자에  val, var 키워드로 매개변수를 선언해 클래스의 맴버 변수로 활용을 하는 것이 일반적이죠.

 

데이터 클래스는 객체의 데이터를 비교도 가능합니다.

data class DataClass(val name: String, val age: Int)

fun main() {
    val data1 = DataClass("John", 34)
    val data2 = DataClass("John", 34)
    val data2 = DataClass("Tom", 34)
    
    println("객체 비교 : ${data1.equals(data2}") // true
    println("객체 비교 : ${data1.equals(data3}") // false
}

equals() 함수로 손쉽게 클래스 객체를 비교할 수 있습니다.

 

data1과 data2의 클래스 객체는 동일하니 true가 나오고 data1과 data3은 나이는 같으나 이름이 다르기 때문에 false가

나오는 것을 확인할 수 있습니다.

하지만 주의할 점이 있습니다. equals()함수는 주 생성자의 매개변수만 비교한다는 겁니다.

 

주 생성자를 말했었죠?

지금 위 코드를 보면 data class DataClass에 괄호 안에 있는 (val name: String, val age: Int)가 주 생성자이죠.

 

아래 코드를 보시죠.

data class DataClass(val name: String, val age: Int) {
	lateinit var address: String
    constructor(name: String, age: Int, address: String): this(name, age) {
    	this.address = address
    }
}

fun main() {
	val data1 = DataClass("Tom", 32, "INCHEON")
    val data2 = DataClass("Tom", 32, "SEOUL")
    
    println("객체 비교 : ${data1.equals(data2)}") // true
}

실행 결과는 true로 나옵니다.

 

이처럼 주 생성자의 매개변수들만 비교하고 부 생성자로 생성된 매개변수값은 비교를 안하기 때문에

이름과 나이는 같아도 주소가 다름에도 결과는 true로 나옵니다.

 

데이터 클래스에 toString() 함수도 이용할 수 가 있습니다.

data class DataClass(val name: String, val age: Int)

class NonDataClass(val name: String, val age: Int)

fun main() {
	val data = DataClass("Tom", 30)
    val nonData = NonDataClass("John", 35)
    
    println("데이터 클래스 : ${data.toString()}")	// DataClass(name="Tom", age=30)
    println("논데이터 클래스 : ${nonData.toString()}") // 참조주소
}

일반 클래스는 toString() 함수를 이용하면 참조주소값이 출력되지만,

데이터 클래스는 toString() 함수를 이용하면 객체의 데이터를 확인할 수  있습니다.

 

오브젝트 클래스

코틀린에서 오브젝트 클래스는 익명 클래스를 만들 목적으로 사용합니다.

익명 클래스란 말 그대로 이름이 없는 클래스를 의미합니다.

그래서 클래스를 선언할 당시에 객체를 생성하지 않으면 객체를 생성할 방법이 사라집니다.

 

open class Super {
    open var age = 20
    open fun some() {
        println("age : $age")
    }
}

val obj = object: Super() {
    override var age = 20
    override fun some() {
        println("age : $age")
    }
}

fun main() {
    obj.age = 30
    obj.some() // age : 30
}

 

컴패니언 클래스

컴패니언 클래스는 클래스에 직접적으로 접근하고 싶을 때 사용합니다.

 

아래 코드를 보시죠.

class User {
    val name = "Ban"
    var age = 40
    fun into() {
        println("내 이름은 ${name}이고 나이는 ${age}살이야")
    }
}

fun main() {
    User.name	// 오류
    User.into()  // 오류
}

직접적으로 접근이 안됩니다.

 

이걸 가능케 하는 것이 컴패니언 클래스 입니다.

class User {
    companion object {
        val name = "Ban"
    	var age = 40
    	fun into() {
            println("내 이름은 ${name}이고 나이는 ${age}살이야")
    	}
    }
}

fun main() {
    User.age = 30
    User.into()      // 내 이름은 Ban이고 나이는 30살이야
    
}

컴패니언 클래스로 적용을 하면 클래스이름으로 직접적으로 접근이 가능하지만,

변수로 선언해서 접근하는 것이 되지 않습니다.

 

 

그럼 이만~~

 

'코틀린 > 순수 코틀린' 카테고리의 다른 글

코틀린 - 지연 초기화  (0) 2023.03.31
코틀린 - 널(null)  (0) 2023.03.29
코틀린 - 상속  (0) 2023.03.26
코틀린 - 접근제한자  (0) 2023.03.25
코틀린 - 클래스(class)  (0) 2023.03.24
Comments