프로그래밍 기초

동일성(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)

a
address: 0x1000

힙 (Heap)

[1, 2, 3]
@ 0x1000

비교 방식 선택

변수 a가 스택에 생성되고, 메모리 주소 0x1000을 저장. 힙에는 실제 데이터가 저장됨.

변수는 주소를, 데이터는 메모리 공간을 차지합니다.

상세 메모리 정보
1 / 4

2. 언어별로 다른 구현

꼬리질문: "언어마다 동일성·동등성 연산자가 왜 다른가요?"

프로그래밍 언어마다 동일성과 동등성을 나타내는 연산자가 다릅니다. Python은 is / ==, Java는 == / .equals(), JavaScript는 === / JSON.stringify()를 사용합니다.

특히 Python의 정수 캐싱(-5~256 범위), Java의 String 인턴 풀처럼 언어별 최적화가 예상과 다른 결과를 낼 수 있어 주의가 필요합니다.

언어별 비교 동작을 직접 확인해 보세요.

동일성 (Identity)

정의
같은 메모리 위치
비교 대상
메모리 주소(참조)
성능
매우 빠름 (O(1))
사용 시기
싱글톤, 캐시 확인
연산자/메서드
is 연산자

동등성 (Equality)

정의
같은 데이터 값
비교 대상
객체의 내용(값)
성능
상대적으로 느림 (O(n))
사용 시기
데이터 검증, 비교
연산자/메서드
== 연산자

성능 비교

동일성 비교매우 빠름
동등성 비교상대적으로 느림

3. 실제 코드 예제

꼬리질문: "Java에서 String 비교 시 == 와 .equals()의 차이를 설명해주세요"

Java에서 String 리터럴은 String Pool에 저장되어 재사용됩니다. 같은 리터럴은 ==로도 true가 됩니다. 하지만 new String()으로 생성하면 항상 새 객체가 힙에 생성되어 ==는 false를 반환합니다.

이 차이가 실무에서 버그의 원인이 됩니다. String 비교는 항상 .equals()를 사용하는 것이 안전합니다.

각 언어의 코드 예제를 직접 확인해 보세요.

1# 동일성 비교
2a = [1, 2, 3]
3b = [1, 2, 3]
4c = a
5
6print(a == b) # True (동등성: 값이 같음)
7print(a is b) # False (동일성: 다른 객체)
8print(a is c) # True (동일성: 같은 객체)
9
10# 메모리 주소 확인
11print(id(a)) # 140234567890123
12print(id(b)) # 140234567890456
13print(id(c)) # 140234567890123

주의사항

Python에서 숫자 비교는 is 대신 ==를 사용하세요. Python은 성능 최적화를 위해 작은 정수(-5~256)를 캐싱합니다.

4. 실무에서 자주 범하는 5가지 실수

꼬리질문: "실무에서 동일성/동등성 혼동으로 생기는 버그 사례를 들어주세요"

이론을 알아도 실무에서는 자신도 모르게 실수를 합니다. Python의 정수 캐싱, Java String 인턴, JavaScript 객체 비교, 컬렉션 contains, null 처리 — 이 5가지가 가장 빈번한 패턴입니다.

각 사례를 퀴즈로 풀어보면 개념이 훨씬 단단해집니다.

각 사례를 직접 풀어보고 정답을 확인해 보세요.

실수 사례 1

Python 정수 캐싱

a = 256
b = 256
print(a is b)  # ???

c = 257
d = 257
print(c is d)  # ???
실수 사례 2

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)); // ???
실수 사례 3

JavaScript 객체 비교

const user1 = { id: 1, name: "Alice" };
const user2 = { id: 1, name: "Alice" };

if (user1 === user2) {
    console.log("같은 사용자입니다");
} else {
    console.log("다른 사용자입니다");
}
// 출력: ???
실수 사례 4

컬렉션의 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("사용자를 찾지 못했습니다");
}
// 출력: ???
실수 사례 5

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·싱글톤은 동일성

참고 자료


의견을 들려주세요

서비스 개선에 큰 도움이 됩니다. 익명으로 자유롭게 남겨주세요.

0 / 1000