프로그래밍 기초
동일성(Identity)과 동등성(Equality)의 차이에 대해서 설명해주세요
메모리 주소 비교와 값 비교의 근본적 차이. Python·Java·JavaScript 언어별 연산자와 실무에서 자주 마주치는 버그 패턴까지 인터랙티브 시각화로 완벽히 준비합니다.
2026년 3월 6일 · 약 15분 읽기
Q. "동일성(Identity)과 동등성(Equality)의 차이를 설명하고, Java에서 어떻게 구분해 사용하는지 말씀해주세요."
예상 꼬리질문
답변 가이드
"동일성은 두 변수가 메모리 상 같은 객체를 가리키는지 비교하며, 동등성은 두 객체의 데이터 값이 같은지를 비교합니다."
"Java에서 ==는 동일성(참조 주소 비교)이고, .equals()는 동등성(값 비교)입니다. String 리터럴은 인턴 풀을 사용해 ==가 true가 될 수 있지만, new로 생성하면 반드시 .equals()를 써야 합니다."
"실무 규칙은 간단합니다: String·객체 비교는 항상 동등성(.equals())으로, null·싱글톤 검증은 동일성(==)으로 처리합니다."
프로그래밍에서 "같다"는 말에는 두 가지 의미가 숨어 있습니다. 메모리 상 같은 객체를 가리키는가와 데이터 내용이 같은가입니다. 이 둘을 혼동하면 예상치 못한 버그가 생깁니다.
이 아티클에서는 면접 꼬리질문 흐름을 따라가며 각 개념을 인터랙티브 시각화로 직접 체험합니다. 텍스트로 외우는 것보다 훨씬 오래 기억에 남을 거예요.
1. 메모리로 이해하는 동일성과 동등성
꼬리질문: "동일성과 동등성이 메모리 수준에서 어떻게 다른가요?"
변수를 선언하면 스택(Stack)에 변수가 생성되고, 실제 데이터는 힙(Heap)에 저장됩니다. 변수는 힙의 메모리 주소를 참조합니다.
동일성(Identity)은 두 변수가 같은 메모리 주소를 가리키는지 확인합니다. 동등성(Equality)은 메모리 주소와 무관하게 저장된 데이터 값이 같은지 확인합니다.
아래 시각화에서 변수가 메모리에서 어떻게 표현되는지 직접 확인해 보세요.
Step 1: 변수 a 선언
스택 (Stack)
힙 (Heap)
비교 방식 선택
변수 a가 스택에 생성되고, 메모리 주소 0x1000을 저장. 힙에는 실제 데이터가 저장됨.
변수는 주소를, 데이터는 메모리 공간을 차지합니다.
2. 언어별로 다른 구현
꼬리질문: "언어마다 동일성·동등성 연산자가 왜 다른가요?"
프로그래밍 언어마다 동일성과 동등성을 나타내는 연산자가 다릅니다. Python은 is / ==, Java는 == / .equals(), JavaScript는 === / JSON.stringify()를 사용합니다.
특히 Python의 정수 캐싱(-5~256 범위), Java의 String 인턴 풀처럼 언어별 최적화가 예상과 다른 결과를 낼 수 있어 주의가 필요합니다.
언어별 비교 동작을 직접 확인해 보세요.
동일성 (Identity)
동등성 (Equality)
성능 비교
3. 실제 코드 예제
꼬리질문: "Java에서 String 비교 시 == 와 .equals()의 차이를 설명해주세요"
Java에서 String 리터럴은 String Pool에 저장되어 재사용됩니다. 같은 리터럴은 ==로도 true가 됩니다. 하지만 new String()으로 생성하면 항상 새 객체가 힙에 생성되어 ==는 false를 반환합니다.
이 차이가 실무에서 버그의 원인이 됩니다. String 비교는 항상 .equals()를 사용하는 것이 안전합니다.
각 언어의 코드 예제를 직접 확인해 보세요.
1# 동일성 비교2a = [1, 2, 3]3b = [1, 2, 3]4c = a56print(a == b) # True (동등성: 값이 같음)7print(a is b) # False (동일성: 다른 객체)8print(a is c) # True (동일성: 같은 객체)910# 메모리 주소 확인11print(id(a)) # 14023456789012312print(id(b)) # 14023456789045613print(id(c)) # 140234567890123
주의사항
Python에서 숫자 비교는 is 대신 ==를 사용하세요. Python은 성능 최적화를 위해 작은 정수(-5~256)를 캐싱합니다.
4. 실무에서 자주 범하는 5가지 실수
꼬리질문: "실무에서 동일성/동등성 혼동으로 생기는 버그 사례를 들어주세요"
이론을 알아도 실무에서는 자신도 모르게 실수를 합니다. Python의 정수 캐싱, Java String 인턴, JavaScript 객체 비교, 컬렉션 contains, null 처리 — 이 5가지가 가장 빈번한 패턴입니다.
각 사례를 퀴즈로 풀어보면 개념이 훨씬 단단해집니다.
각 사례를 직접 풀어보고 정답을 확인해 보세요.
Python 정수 캐싱
a = 256 b = 256 print(a is b) # ??? c = 257 d = 257 print(c is d) # ???
Java String 인턴
String a = "hello";
String b = "hello";
String c = new String("hello");
System.out.println(a == b); // ???
System.out.println(a == c); // ???
System.out.println(a.equals(c)); // ???JavaScript 객체 비교
const user1 = { id: 1, name: "Alice" };
const user2 = { id: 1, name: "Alice" };
if (user1 === user2) {
console.log("같은 사용자입니다");
} else {
console.log("다른 사용자입니다");
}
// 출력: ???컬렉션의 includes
const users = [
{ id: 1, name: "Alice" },
{ id: 2, name: "Bob" }
];
const findUser = { id: 1, name: "Alice" };
if (users.includes(findUser)) {
console.log("사용자를 찾았습니다");
} else {
console.log("사용자를 찾지 못했습니다");
}
// 출력: ???null/undefined 비교
const value = null;
if (value === null) {
console.log("null입니다");
} else if (value == null) {
console.log("동등성으로도 null입니다");
} else {
console.log("null이 아닙니다");
}
// 출력: ???면접 체크리스트
이 항목들을 자신 있게 설명할 수 있다면 동일성·동등성 질문은 준비 완료입니다.
- - 동일성(Identity): 메모리 주소 비교 — 같은 객체 인스턴스인가
- - 동등성(Equality): 데이터 값 비교 — 내용이 같은가
- - Java String 비교: 리터럴은 String Pool 공유, new는 별도 객체 — 항상 .equals() 사용
- - Python 정수 캐싱: -5~256 범위 정수는 is 로도 true, 범위 밖은 false
- - 실무 규칙: String·객체는 동등성, null·싱글톤은 동일성
참고 자료
- Python 공식 문서 — Object Identity — Python의 == 와 is 차이를 공식 문서로 확실히 이해하기
- MDN — Equality comparisons and sameness — JavaScript의 동등성 이해하기
- Go Spec — Comparison operators — Go에서 타입에 따른 비교 방식의 자동 결정 이해하기
의견을 들려주세요
서비스 개선에 큰 도움이 됩니다. 익명으로 자유롭게 남겨주세요.