동일성(Identity)과 동등성(Equality)

Seyeong·2023년 1월 13일
0

자바

목록 보기
1/2

이번 시간에는 동일성과 동등성에 대해 알아보겠습니다.

이를 위해 간단한 객체를 하나 만들어볼까요?

User 클래스

사용자 정보를 담는 클래스를 선언해봅시다.

public class User {
    private String name; // 이름
    private int age; // 나이
    
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

간단하게 두 개의 필드만 선언했습니다.

이제 이 User 클래스로 동일성과 동등성에 대해 알아봅시다.

동일성?

두 개의 객체가 같은 메모리 주소를 가지고 있다면 이 두 객체는 동일하다.

위의 개념에 따르면 두 개의 User 객체가 같은 메모리 주소를 가리킨다면 두 객체는 동일하다는 것입니다.

아래의 코드를 봐봅시다.

User user1 = new User("홍길동", 20);
User user2 = new User("홍길동", 20);

user1과 user2는 서로 동일 할까요?

실제로 객체를 출력해보면 아래처럼 결과가 나올 것입니다.

// 객체 생성
User user1 = new User("홍길동", 20);
User user2 = new User("홍길동", 20);

// 객체 주소 출력
System.out.println(user1);
System.out.println(user2);

// 객체 메모리 주소
user1 = User@7bb58ca3
user2 = User@c540f5a

서로 메모리 주소가 다릅니다. 당연합니다.
User 객체를 new 키워드로 새로 생성했으니 새로운 메모리에 할당되는 것은 문제가 되지 않습니다. 그럼 이렇게 해보면 어떨까요?

user2 = user1

이렇게 하면 user1이 가리키고 있던 메모리 주소를 user2도 같이 가리키게 됩니다.

실제 출력을 해보면 동일한 메모리 주소를 가리키고 있죠.

// 객체 생성
User user1 = new User("홍길동", 20);
User user2 = new User("홍길동", 20);

// 객체 주소 출력
System.out.println(user1);
System.out.println(user2);

// 객체 메모리 주소
user1 = User@7bb58ca3
user2 = User@7bb58ca3

이제 이 두 객체는 같은 메모리 주소를 가리키고 있습니다. 즉, 이 두 객체는 서로 동일 합니다.

동등성?

두 개의 객체가 같은 정보를 갖고 있다면 이 두 객체는 동등하다.

객체가 서로 '같은 정보' 를 가져야 동등하다고 하는데 여기서 말하는 '같은 정보' 는 필드의 값을 의미합니다.

이번에도 아래의 코드를 봐봅시다
User user1 = new User("홍길동", 20);
User user2 = new User("홍길동", 20);

이 두 객체는 서로 이름도 같고 나이도 같습니다. 즉, 같은 정보 를 가지고 있으므로 user1과 user2는 서로 동등 합니다.

이 코드는 위의 동일성을 검증하는 부분에서 사용했던 코드입니다.
위에서 user1과 user2의 메모리 주소가 불일치하는 것을 확인했죠.

즉, 위의 두 객체는 서로 동일 하지는 않습니다.
하지만 서로 동등 하다고 할 수 있습니다.


마무리

그럼 도대체 이 동일성과 동등성이라는 개념이 왜 필요할까요?

equals( )와 hashCode( ) 를 보면 그 이유를 알 수 있습니다.

지금까지 동일성과 동등성이라는 개념을 코드로 이해해보았습니다.

0개의 댓글