Search

동일성과 동등성

Tags
Java
Date
2024/01/14

개요

자바의 기본 중 하나인 동일성과 동등성에 대해 알아보도록 하겠습니다.

1. 동일성과 동등성이란

동일성은 두 객체가 모두 동일한 곳을 참조하고 있는 것이고, 동등성은 두 객체가 같은 정보를 갖고 있는 것입니다.
가장 간단한 예시를 들자면 String 입니다. String은 매번 할당 시 새로운 String Pool에 만들어집니다.
String str1 = "hello"; String str2 = "hello"; if(str1 == str2){ System.out.println("yes"); } else { System.out.println("no"); }
Java
복사
위 두 값을 비교하면 "no" 가 나옵니다. 동일한 값을 가지고 있는 것이지 동일한 참조를 갖고 있는 것이 아니기 때문입니다.
대게 객체들의 동등성을 비교할 때 equals를 오버라이딩 합니다. 이 때 equals"개발자가 동일한 값이 들어 있다고 판단하는 기준" 에 따라 오버라이딩 되어야 한다고 생각합니다.
예를 들어, 학생 객체가 있다고 가정해보겠습니다.
class Student { private String name; private String age; private String studentId; ... @Override public boolean equals(Object obj){ if(this.name == obj.name && this.age == obj.age){ return true; } return false; } }
Java
복사
여러 필드 값이 있을 수 있지만, 만약 개발자가 이름과 나이가 같다면 동등한 것이라고 정의하였다면 그것이 곧 동등성입니다.
참고로 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; }
Java
복사

2. 예상 질문

"동등성과 동일성의 차이는 무엇인가요?" 두 객체가 할당된 메모리 주소가 같으면 동일하며, 두 객체의 내용이 같으면 동등합니다. 동일성은 == 연산자를 통해 판별할 수 있고, 동등성은 equals 연산자를 통해 판별할 수 있습니다.
"== 연산자와 equals 연산자의 차이는 무엇인가요?"
== 연산자는 객체의 동일성을 판별하기 위해 사용하며, equals 연산자는 두 객체의 동등성을 판별하기 위해 사용합니다.
equals 연산자는 재정의하지 않으면 내부적으로 == 연산자와 같은 로직을 수행하므로 차이가 없습니다. 따라서 equals 연산자는 각 객체의 특성에 맞게 재정의를 해야 동등성의 기능을 수행합니다.