데이터 클래스
데이터 클래스는 data키워드로 선언하면 자주 사용하는 데이터를 객체로 묶어 줍니다. 데이터 클래스는 VO클래스를 편리하게 이용할 수 있게 해 줍니다.
class NonDataClass(val name : String, val email : String , val age : Int)
data class DataClass(val name : String, val email : String , val age : Int){
lateinit var address : String
constructor( name : String, email : String , age : Int) : this(name , email, age){
this.address = address
}
}
fun main(){
val non1 = NonDataClass("Name","Email",10)
val non2 = NonDataClass("Name","Email",10)
val data1 = DataClass("Name","Email",10,"area1")
val data2 = DataClass("Name","Email",10,"area2")
println(non1.equals(non2)) // false
println(data1.equals(data2))// true
println(non1.toString()) // 실위치
println(data1.toString()) // DataClass(name="Name", email="Email", age=10)
}
equals() 함수는 객체를 비교하는 함수입니다.
equals() 함수로 일반 클래스의 객체를 비교하면 객체 자체를 비교하므로 결괏값은 false입니다.
하지만 데이터 클래스를 비교할 경우 객체 자체가 아니라 객체의 데이터를 비교하므로 true입니다.
데이터 클래스는 데이터를 다루는 데 편리한 기능을 제공하는 것이 주목적이므로 위의 코드처럼 주 생성자에 val이나 var키워드로 매개변수를 선언 하여 멤버 변수로 활용하는 것이 일반적입니다. 물론 클래스 본문에 변수를 추가할 수 있지만 객체의 데이터를 비교할 때 이용하는 equals() 함수는 주 생성자에 선언한 멤버 변수의 데이터만 비교 대상으로 삼습니다.
toString() 함수는 객체의 데이터를 반환하는 함수입니다.
toString() 함수 일반 객체를 반환하면 객체의 정보 값이 나오지만 데이터 클래스를 반환하면 객체가 포함하는 멤버 변수의 데이터를 출력합니다. equals() 함수와 마찬가지로 주 생성자의 매개변수에 선언된 데이터만 출력 대상입니다.
오브젝트 클래스
코틀린에서 오브젝트 클래스는 익명 클래스를 만들 목적으로 사용합니다. 익명 클래스는 말 그대로 이름이 없습니다. 클래스 이름이 없으므로 클래스를 선언하면서 동시에 객체를 생성해야 합니다. 그렇지 않으면 이후 객체를 생성할 방법이 없습니다. 오브젝트 클래스는 선언과 동시에 객체를 생성한다는 의미에서 object라는 키워드를 사용합니다.
open class Super{
open var data = 10
open fun some(){
println("super.data=$data")
}
}
val obj1 = object {
var data = 10
fun some(){
println("data=$data")
}
}
val obj2 = object :Super() {
override var data = 20
override fun some(){
println("obj2.data=$data")
}
}
fun main(){
obj2.some() // obj2.data=20
obj2.data = 30
obj2.some() // obj2.data=30
//obj.data = 20 // 오류
//obj.some() // 오류
}
obj1의 경우 main에서 사용하려면 오류가 걸립니다 그 이유는 클래스 타입 때문입니다. object키워드로 클래스를 선언했지만 타입을 명시하지 않았으므로 이 객체는 코틀린의 최상위 타입인 Any로 취급합니다. 그런데 Any 타입 객체에는 data, some()이라는 멤버가 없어서 오류가 발생합니다.
그래서 object 키워드 다음에 타입을 입력해줘야 합니다. 오브젝트 클래스의 타입은 object뒤에 콜론을 입력하고 그 뒤에 클래스의 상위 또는 인터페이스를 입력하면 됩니다.
컴페니언 클래스
컴페니언 클래스는 멤버 변수나 함수를 클래스 이름으로 접근하고자 할 때 사용합니다. 일반 접근 시 오류가 생기기 때문에 companion이라는 키워드로 선언해야 합니다.
class myClass{
companion object{
open var data = 10
open fun some(){
println("data=$data")
}
}
}
fun main(){
myClass.some() //data=10
myClass.data = 20
myClass.some() //data=20
}
클래스 내부에 companion object {} 형태로 선언하면 이클래스를 감싸는 클래스 이름으로 멤버에 접근할 수 있습니다