코틀린의 클래스 종류

김명석·2023년 9월 6일

Kotlin

목록 보기
1/3

데이터 클래스

data 키워드로 선언하며 자주 사용하는 데이터를 객체로 묶어준다.
데이터 클래스는 VO(value-object)클래스를 편리하게 이용하게 해준다.

선언

기존의 class 선언 앞에 data를 넣어 선언한다.

class NonDataClass(val name:String ,val email: String)
data class DataClass(val name: String, val email: String)

객체 생성
기존 class 와 같이 주생성자의 매개변수를 넣어 생성할 수 있다.

fun main(){
	val non1 = NonDataClass("temp1","a@a.com")
 	val non2 = NonDataClass("temp1","a@a.com")   
	val data1 = DataClass("temp2","b@b.com")
	val data2 = DataClass("temp2","b@b.com")	
}

equals()

객체의 데이터 비교하는 함수이다.

VO클래스는 데이터를 주요하게 다루는 클래스이다. 따라서 객체의 데이터가 서로 같은지 비교가 빈번하게 이루어진다.
이는 객체가 같은 것과는 다르다. kotlin에서는 `equals()` 함수를 통해 주로 사용된다.
println(${non1.equals(non2)})
println(${data1.equals(data2)})

위 코드의 경우 각각 false ,true 의 값을 출력한다.
이는 equals() 함수는 일반 클래스의 객체를 비교하면 객체 자체를 비교하므로 결과값으로 false 를 내보낸다. 하지만 데이터 클래스의 객체를 비교하면 객체의 데이터를 비교하므로 true를 내보내게 된다.

유의점

equals 를 통해 데이터 클래스를 비교할 때 주 생성자에 선언한 멤버 변수의 데이터만 비교의 대상으로 여긴다.

data class DataClass(val name:String, val email:String )
{ 
	lateinit var address:String
	constructor(name:String, email:String, age:Int);
    this(name,email,age){
    	this.age = age
    }
}
fun main(){
	val obj1 = DataClass("a","b","20")
	val obj2 = DataClass("a","b","25")
    println(${obj1.equals(obj2)})
}

해당 경우에 경우 보조 생성자로 설정된 age 에 대한 부분은 확인하지 않기에 true 를 출력한다.

toString()

객체의 데이터를 반환하는 함수이다. 
일반 클래스의 toString 과는 반환값이 다르다.

	fun main(){
    	class NonDataclass(val name:String)
        data class Dataclass(val name:String,val age:Int)
        val non = NonDataclass("일반 클래스")
        val data = Dataclass("데이터 클래스",20)
        println("${non.toString()}")
        println("${data.toString()}")
    }

non.toString()의 경우 의미없는 데이터 값을 반환한다
data.toString()의 경우 Dataclass(name=데이터 클래스, age=20)와 같이 반환한다.


이처럼 toString() 함수는 객체가 포함하는 멤버 변수의 데이터를 출력한다.

오브젝트 클래스

코틀린에서 오브젝트 클래스는 익명 클래스 (anonymous class)를 만들 목적으로 사용된다.

예시


val obj = object {
	var data =10
	fun some(){
    	println("data : ${data}")
    }    
}
fun main(){
	obj.data=20 //오류
    obj.some()	//오류
}
object 키워드를 사용해 멤버 변수와 함수를 포함한 클래스를 선언.
클래스 선언과 동시에 객체가 생성되며 이를 obj에 저장하게 된다.
그러나 접근시 오류가 나게되는데 이는 클래스의 타빙때문이다. 
object 키워드로 선언했지만 타입이 명시되지 않아서 최상위 타입인 any로 여기게 된다. 
이러한 any타입에는 data,some() 이라는 함수가 없어서 오류가 발생하게 된다.

object {} 의 형태로 익명 클래스 선언이 가능하나 보통은 타입까지 함계 입력해 선언한다. ex) object: A {}

	open class Super{
	    open var data =10
        open fun some(){
        	println("$data")
        }
    }
    val obj = object:Super(){
    	override var data =20 
        override fun some(){
        	println("i am object some : $data")
        }
    }
    fun main(){
    	obj.data =30	//성공
        obj.some()		//성공
    }

위 코드와 같이 object:Super() {} 로 선언 하였기 때문에 이 익명 클래스는 Super 클래스의 상속을 받을 수 있다. 이를 통해 obj 객체를 통해 Super 클래스에 선언된 멤버에 접근이 가능해진다.

컴패니언 클래스 companion class

컴패니언 클래스는 멤버 변수나 함수를 클래스 이름으로 접근하고자 할 때 사용한다.
일반적인 클래스의 멤버는 객체를 생성하여 접근해야한다.그러나 컴패니언 클래스는 객체를 생성하지 않고서도 클래스 이름으로 특정 멤버를 이용할 수 있다.


일반 클래스의 멤버 접근

class MyClass{
	var data =10 
    fun some(){
    	println(data)
    }
}
fun main(){
	val obj = MyClass()
    obj.data = 20		//성공
    obj.some()			//성공
    MyClass.data = 20	//오류
    MyClass.some() 		//오류
}

MyClass에 data 변수와 some() 함수를 선언했다. MyClass의 객체를 생성한 후 객체명으로 멤버에 접근하는 것은 가능하다. 그러나 클래스의 이름으로 접근이 불가능하게된다.


컴패니언 클래스의 멤버 접근

클래스 내부에 companion object {} 형태로 선언하게 되면,
위와 달리 클래스의 이름을 통해 접근이 가능하게 된다.

class MyClass{
	companion object{
    	var data =10
        fun some(){
        	println(data)
        }
    }
}
fun main(){
	val obj = MyClass()
    MyClass.data = 20	//성공
    MyClass.some() 		//성공
}

0개의 댓글