이번 시간에는 동일성과 동등성에 대해 알아보겠습니다.
이를 위해 간단한 객체를 하나 만들어볼까요?
사용자 정보를 담는 클래스를 선언해봅시다.
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( ) 를 보면 그 이유를 알 수 있습니다.
지금까지 동일성과 동등성이라는 개념을 코드로 이해해보았습니다.