카테고리 없음

코틀린의 여러가지 클래스 종류

sangwoon 2022. 7. 9. 22:36

데이터 클래스란?

데이터 클래스는 data 키워드로 선언하며 자주 사용하는 데이터를 객체로 묶어 줍니다. 데이터 클래스는 VO클래스를 편리하게 이용할 수 있게 합니다.

data class는 객체의 데이터 사용합니다.

그리고 다양한 메소드를 자동으로 생성해주는 클래스이기도 하다.

 

그럼 다양한 메소드를 사용하며 data class에 대해서 공부해 보도록 하자!!

 

equals() 함수

객체의 데이터가 같은지를 비교하는 경우에 사용됩니다

 

예제)

data class DataClass(val name:String){}


fun main() {
   val data1  = DataClass("limsangwoon")
   val data2  = DataClass("sangwoon")
   
   
   println("use equals : ${data1.equals(data2)}")
   
   val data3  = DataClass("sangwoon")
   val data4  = DataClass("sangwoon")
   
   
   println("use equals : ${data3.equals(data4)}")

    
}

출력 결과

use equals : false

use equals : true

 

보면 equals를 사용했을 때 객체 자체(즉 메모리)를 비교하는 것이 아니라 객체의 데이터를 비교하기 때문에 

위에 data1과 data2는 false가 나온 것이고 data3와 data4는 true가 나온 것이다.

 

equals 함수에 대해서 마지막으로 주의해야할 점은 주 생성자의 멤버 변수가 같은지만 판단을 한다는 것이다.

 

그리고 그냥 클래스로 생성한 객체 또한 equals를 사용할 수 있다. 하지만 객체 자체(객체 자체는 메모리의 주소라고 생각하면 좋을 뜻)로 비교를 하기 때문에 사실상 equals를 사용한다고 해서 true가 나올 일은 없을 것이다.

 

toString() 함수

데이터 클래스를 사용하면서 객체가 가지는 값을 확인해야 할 때가 많다.

이때 toString() 함수를 사용하면 함수의 반환값을 알 수 있다.

data class DataClass(val name:String){}


fun main() {
   val data1 = DataClass("limsangwoon")
   println("toString ${data1.toString()}")
 
}

이렇게 toString() 함수는 객체가 포함하는 멤버 변수의 데이터를 출력합니다.

 

copy() 함수

특정 필드값만 바꿔서 복사한다.

data class DataClass(val name:String){}


fun main() {
   val data1 = DataClass("limsangwoon")
   println("toString ${data1.copy(name = "king")}")
 
}

이런식으로 특정 필드값을 바꾼다.

 

 

오브젝트 클래스란?

 

오브젝트 클래스는 익명 클래스를 만들 목적으로 사용한다.

익명이니까 당연히 이름도 없다.

 

오브젝트 클래스는 선언과 동시에 객체를 생성한다는 의미에서 object라는 키워드를 사용합니다.

 

객체를 생성한다는 것은 

메인 함수에서 

객체를 선언할 필요가 없다는 것!~!

 

예제)

val obj = object{
    var data = 10
    fun some(){
        println("data:  $data")
    }
}


fun main() {
   obj.data = 20
   obj.some()
}

이러면 

object 키워드로 클래스 생성과 동시에 obj에 객체를 저장한다. 

 

하지만 막상 obj.data 하고 선언을 하면 에러가 뜬 다는 것을 알 수 있다.

왤까..?

 

바로 object 함수의 type을 지정하지 않아서 이다.

기본적으로 type을 지정하지 않으면 Any type이 들어가는데 

Any Type에는 data, some() 이라는 멤버가 존재하지 않는다.

 

그러므로 에러가 발생하는 것이다.

open class Super{
    open var data = 10
    open fun some(){
        println("data: $data")
    }
}


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


fun main() {
   obj.data = 20
   obj.some()
}

이런식으로

Super 클래스로 type을 지정해서

object 클래스에 상속을 해주는 것이다.

 

이러면

data: 20

이러한 결과를 사용할 수 있다.

 

 

컴패니언 클래스란?

컴패니언 클래스는 멤버 변수나 함수를 클래스 이름으로 접근하고자 할 때 사용합니다.

class MyClass{
    companion object {
        var data = 10
        fun some(){
            println(data)
        }
    }
}

fun main(){
    MyClass.data = 20
    MyClass.some()
    
}

이렇게 객체를 main 함수에서 생성하지 않고 

클래스의 이름만으로 companion object를 사용해 class 의 이름인 MyClass로 접근이 가능한 것을 알 수 있다.