본문 바로가기
Computer Science/Java

동일성과 동등성

by eunnnn 2023. 4. 10.

동일성(identity)

동일성은 동일하다는 뜻으로 두 개의 객체가 완전히 같은 경우를 의미한다.

변수1은 객체 1을 가리키고 있고, 변수 2와 변수 3은 객체2를 가리키고 있다. 즉 변수2와 변수 3은 동일한 객체를 가리키고 있으므로, 두 변수는 동일하다고 할 수 있다.

그리고 해당 변수가 동일한지를 == 연산자를 통해 판별할 수 있다.

 

동등성(equality)

두 객체가 같은 정보를 가지고 있는 경우 동등하다고 판단한다. 즉, 참조하고 있는 객체의 주소가 서로 다르더라도 내용만 같으면 두 변수는 동등하다고 말할 수 있다.

Car a1 = new Car("aaa");
Car a2 = new Car("aaa");
 
System.out.println(a.equals(a2)); // true

위와 같은 코드에서 new 키워드를 통해 서로 다른 주소값을 갖는 객체 a1, a2를 각각 생성하였다.

해당 객체가 가리키는 값의 주소값이 다르기 때문에 두 객체는 동일하지는 않다. 그러나 내용은 같기 때문에 동등하다.

 

자바에서는 두 객체의 동등성을 비교할 때 주로 Object 클래스의 equals() 메소드를 오버라이딩하여 활용한다.

public boolean equals(Object obj) {
    return (this == obj);
}

 반환 형태를 보면 알 수 있듯이, 단순히 동일성 비교를 하고 있다. 즉, 해당 메소드를 자식 객체에서 재정의하지 않는 이상 equals() 연산자는 == 연산자와 다르지 않다. 그래서 다양한 객체들이 equals()를 재정의하여 사용한다. 예시로 String의 equals 연산자를 살펴보겠다.

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

String 클래스는 위와 같이 equals() 를 재정의하여 인자로 전달된 String의 문자열을 비교하고 있다. 코드를 보면 == 키워드를 통해 두 객체의 동일성 여부를 판단하고, 두 객체가 동일하지 않다면 String인지 여부를 판단한 뒤, 문자 하나 하나가 같은지 비교한다. 만약 모든 문자가 같다면 두 객체의 내용이 같은 것이므로 동등하다고 판별할 수 있다.

'Computer Science > Java' 카테고리의 다른 글

어노테이션  (0) 2023.04.10
String, StringBuilder, StringBuffer의 차이  (0) 2023.04.10
원시 타입과 참조 타입  (1) 2023.04.10
기타 제어자 - static, final, abstract  (0) 2023.04.10
접근 제어자  (1) 2023.04.10