데이터를 보관하는 목적으로 사용하는 클래스이다. 클래스가 Data를 보유하면서 특별한 기능을 하지 않는다.
data 클래스의 장점은 보일러 플레이트 코드를 줄여준다는 것이다.
위의 코드는 자바 코드이고 아래의 코드는 코틀린 코드이다. 같은 기능을 하지만 data class 클래스는 많은 보일러플레이트 코드를 줄여준다.
// getter 와 setter 를 작성한 Java POJO class 의 형태
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(String int) {
this.age = age;
}
}
// 위의 POJO 클래스와 같은 기능을 하지만, boilerplate code 가 사라졌다
data class person(
val name: String,
val age: Int
)
data class Person(val name: String, val age: Int)
fun main(args: Array){
val jun = Person("준", 4)
val junName = jun.name // name 프로퍼티에 접근
val junAge = jun.age // age 프로퍼티에 접근
jun.age = 5 // Error: val cannot be assigned
}
코틀린 컴파일러는 데이터 클래스의 인스턴스를 더 쉽게 불변 객체로 활용할 수 있게 메소드를 제공한다. 이것이 copy()함수이다. copy()함수는 객체를 복사하면서 일부 프로퍼티를 바꿀 수 있게 해준다.
원본 객체를 메모리상에서 직접 바꾸는 대신 복사본을 만드는 것이 낫다고 한다. 복사본은 원본과 다른 생명주기를 가지며, 복사본의 프로퍼티 값을 바꾸거나 복사본을 제거해도 프로그램에서 원본을 참조하는 다른 부분에 전혀 영향을 주지 않기 때문이다.
fun main() {
val jun = Person("jun", 24)
val anotherJun = jun.copy(age=211)
println(jun)
println(anotherJun)
}
data class Person(var name: String, val age: Int)
fun main() {
val jun = Person("준", 24)
// toString() - 결과 : Person(name=준, age=24)
println(jun.toString())
// hashCode() - 결과 : 1595160
println(jun.hashCode())
// equals() - 결과 : true
val jun1 = Person("준", 24)
println(jun.equals(jun1))
// equals() - 결과 : false
val jun2 = Person("짭준", 25)
println(jun.equals(jun2))
}
data class Person(var name: String, val age: Int)
"ClassName(field1=value1, field2=value)" 형태의 String 으로 객체를 convert 하여 반환한다
hashCode 란, 객체를 구별하는 정수값을 말한다. 동일한 값을 가졌다고 해서 동일 객체인것이 아니다. 동일 객체는 서로 같은 참조를 바라본다.
JVM 언어에서는 equals() 가 true 를 반환하는 두 객체는 반드시 같은 hashCode() 를 반환해야한다는 제약이 있다.
참조 동일성이 아닌 객체의 동등성을 검사한다.
kotlin 의 구조적 동등 연산자 (Structural equality operator) "==" 을 호출하여 사용할 수 있다. kotlin 에서의 "==" 연산자는 내부적으로 equals() 함수를 호출하는 방식으로 컴파일된다.
Java 에서 참조 동일성을 비교하는 "==" 연산자는 kotlin 에서는 "===" 연산자로 사용된다.
kotlin 의 is 검사는 Java 의 instanceOf 와 같다
fun main() {
val jun = Person("준", 124)
// Destructuring Declaration 구문을 통해 객체를 여러 변수로 구조화
val (name, age) = jun
println(name) // 결과 - 준
println(age) // 결과 - 124
}
data class Person(val name: String, val age: Int)
kotlin은 데이터 클래스의 기본 생성자에 선언된 모든 property에 해당하는 componentN()함수를 생성한다.
componentN() 을 통해 Destructuring Declarations 를 사용할 수 있다. Destructuring Declarations 는 객체를 여러 변수로 구조화하기 위해 사용한다.
실제 컴파일시에는 아래와 같이 해석된다.
val name = olaf.component1()
val age = olaf.component2()