티스토리 뷰
반응형
☕ Java – "==" 과 "equals()" 의 차이
Java에서 문자열(String)을 비교할 때, "==" 와 "equals()" 의 차이를 혼동하는 경우가 많습니다.
이 두 가지는 비교 대상과 비교 방식이 다릅니다.
🔍 1️⃣ 개념 요약
| 구분 | "==" 연산자 |
"equals()" 메서드 |
|---|---|---|
| 정의 위치 | JVM (언어 연산자) | java.lang.Object 클래스 |
| 비교 대상 | 참조값(주소) | 객체 내부 값(내용) |
| 용도 | 기본형(primitive) 비교 | 객체(Object) 비교 |
| String 비교 시 | 참조(주소) 비교 | 문자열 내용 비교 |
🧩 2️⃣ "==" 연산자
"==" 는 두 변수가 같은 객체(참조)를 가리키는지 비교합니다.
int i = 10, j = 20, k = 10;
System.out.println(i == j); // false
System.out.println(i == k); // true
기본형에서는 값 자체를 비교하지만,
객체에서는 참조 주소(reference) 를 비교합니다.
📘 예시 – 문자열 비교
String str0 = "TEST";
String str1 = "테스트";
String str2 = new String("TEST");
String str3 = "TEST";
System.out.println(str0 == str1); // false
System.out.println(str0 == str2); // false
System.out.println(str0 == str3); // true
⚙️ 결과 설명
| 비교 | 결과 | 이유 |
|---|---|---|
str0 == str1 |
false | 서로 다른 문자열 리터럴 |
str0 == str2 |
false | new 로 새 객체 생성 |
str0 == str3 |
true | "TEST" 리터럴은 문자열 풀(String Pool)에서 공유됨 |
💡
"TEST"와 같이 리터럴로 생성된 문자열은 String Constant Pool 에 저장되며,
동일한 리터럴은 재사용되어 참조가 동일하게 됩니다.
🧠 3️⃣ "equals()" 메서드
equals() 는 객체의 내용(값) 을 비교합니다.
Object 클래스의 기본 구현은 "==" 와 동일하지만,String, Integer, List 등은 equals() 를 재정의(Override) 하여 값 비교로 동작합니다.
📘 Object의 equals()
public boolean equals(Object obj) {
return (this == obj);
}
즉, Object 기본 equals는 여전히 참조 비교입니다.
📘 String의 equals()
public boolean equals(Object anObject) {
if (this == anObject) return true; // 동일 객체면 true
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++]) return false;
}
return true;
}
}
return false;
}
즉,
String.equals()는 내부 char 배열의 값을 하나씩 비교합니다.
📊 비교 예시
System.out.println(str0.equals(str2)); // true
System.out.println(str0.equals(str3)); // true
| 비교 | 결과 | 이유 |
|---|---|---|
str0.equals(str2) |
true | 내용이 동일함 |
str0.equals(str3) |
true | 내용이 동일함 |
⚖️ 4️⃣ 결론
| 비교 대상 | 사용해야 할 비교 방식 |
|---|---|
| 기본형 (int, char, boolean 등) | "==" |
| 객체 (String, Integer 등) | "equals()" |
"=="→ 같은 객체인지(주소)"equals()"→ 내용이 같은지(값)
🧾 5️⃣ String 비교 시 주의사항 (NullPointerException 방지)
다음 코드는 str0 이 null 일 때 오류가 발생합니다 👇
public void showHI(String str0) {
if (str0.equals("TEST")) // ❌ NullPointerException 위험
System.out.println("Hi!!!");
}
✅ 올바른 방법
public void showHI(String str0) {
if ("TEST".equals(str0)) // ✅ 안전한 비교
System.out.println("Hi!!!");
}
이유:
"TEST"는 절대 null 이 될 수 없는 상수 객체이므로
비교 대상(str0)이 null 이어도 예외가 발생하지 않습니다.
🧠 6️⃣ 요약
| 구분 | "==" |
"equals()" |
|---|---|---|
| 비교대상 | 참조값(주소) | 값(내용) |
| 적용대상 | 기본형 | 객체 |
| String 비교결과 | 리터럴 동일 시 true | 내용 동일 시 true |
| Null 안전성 | null 비교 시 오류 발생 가능 | "문자열상수".equals() 사용 시 안전 |
✅ 결론:
- 기본형(primitive) 은
==로 비교- 객체(Object) 는
equals()로 비교- 문자열(String)은
"상수".equals(변수)형태로 비교하여 Null 예외를 방지하자.
'Programming > JAVA' 카테고리의 다른 글
| json-lib 2.3과 필요 의존 라이브러리 (0) | 2018.11.06 |
|---|---|
| JEUS , WebtoB 기본 (0) | 2015.01.02 |
| BASE64 인코딩 디코딩 (0) | 2014.12.18 |
| 자바로 경고창 띄우기 (0) | 2014.01.07 |
| 여러모로 사용되는 정규표현식! (0) | 2014.01.06 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- this
- Java
- jeus
- 시간비교
- 트위터 타임라인 위젯
- 0으로
- 자바스크립트
- 음수를
- 대체어
- 오라클
- IE모드
- internal error
- 오라클 복구
- IE는언제없어지나
- 락걸림
- 오라클 세션
- 사용자삭제
- 시간지정
- 명령어
- oracle 줄바꿈
- 로그초기화
- html
- javascript
- 오라클 락
- 웹투비
- jQuery
- Oracle
- webtob
- lock
- 트위터 위젯
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
글 보관함
