티스토리 뷰

Programming/JAVA

"==" 과 "equals()" 의 차이점

다루사무 2013. 9. 6. 15:14
반응형

☕ 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 방지)

다음 코드는 str0null 일 때 오류가 발생합니다 👇

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
링크
«   2025/11   »
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
글 보관함