객체의 ‘같음’을 확인하는 방법: 일반 클래스 vs 데이터 클래스

순순·2024년 3월 10일

코틀린

목록 보기
2/8

우리가 흔히 쓰는 == 연산자, 즉 equals 는 같다는 의미를 가진다.

그렇다면 객체가 같다는 건 '주소값이 같다'를 의미하는 걸까? 아니면 '수학적 값이 똑같다'를 의미하는 걸까?

이전 포스팅 에서 객체를 생성하면 객체의 주소값이 생성되고, 그 주소값을 가지고 객체를 구분하고 지칭할 수 있는 거라고 했다. 그래서 객체가 똑같다는 건, 무조건 주소 값이 같은 거라고 생각했었다.

그래서 당연히 전자의 의미만 있다고 생각했는데... 주소값으로 비교하지 않는 경우가 있었다. 바로 dataClass가 그랬다.


1. DataClass


매개체의 데이터를 관리하는 용도로 사용하는 클래스.

즉, data를 담을 변수만 가지고 있는 클래스를 DataClass라고 부른다.


특징

  • 객체의 멤버를 보다 쉽게 관리할 수 있는 기능이 추가된다.
  • abstract, open, sealed, inner 클래스로 정의할 수 없다
  • 반드시 주 생성자를 가지고 있어야 한다.

DataClass의 메서드

개발자의 개발편리성을 위해 몇가지 메서드가 자동으로 구현된다.

  • equals : 객체가 가지고 있는 변수를 모두 비교하는 메서드
  • hashCode : 객체를 구분하기 위한 고유한 정수값
  • copy : 객체를 복사하는 메서드
  • toString : 객체가 가지고 있는 변수의 값을 출력
  • componentN : 객체 분해


2. 객체 비교 해보기


일반 클래스 일 때

  • "obj1과 obj2는 다른 객체입니다" 가 출력된다.
fun main(){
    // 일반 클래스의 객체 생성
    var obj1 = TestClass1(10, 20)
    var obj2 = TestClass1(10, 20)

    if(obj1 == obj2){
        println("obj1과 obj2는 같은 객체입니다.")
    } else {
        println("obj1과 obj2는 다른 객체입니다.")
    }
}

// 일반 클래스
class TestClass1(var a1:Int, var a2:Int)

데이터 클래스 일 때

  • "obj3과 obj4는 같은 객체입니다." 가 출력된다.

fun main(){
    // 데이터 클래스의 객체 생성
    var obj3 = TestClass2(30, 40)
    var obj4 = TestClass2(30, 40)

    if(obj3 == obj4){
        println("obj3과 obj4는 같은 객체입니다.")
    } else {
        println("obj3과 obj4는 다른 객체입니다.")
    }

}

// 데이터 클래스
// 반드시 주생성자가 있어야 한다.
data class TestClass2(var a1:Int, var a2:Int)

3. 결론


데이터클래스에서는 데이터 클래스는 equals 메서드가 구현되어 있으며, 객체가 가지고 있는 프로퍼티의값이 같은 지를 비교해준다. 반면 일반 클래스에서는 각각의 ‘주소값’이 일치하는지를 비교해준다.



profile
플러터와 안드로이드를 공부합니다

1개의 댓글

comment-user-thumbnail
2025년 11월 1일

깔끔한 정리 감사합니다~

답글 달기