==, equal

류한선·2025년 6월 20일

실기연습-2

목록 보기
15/95

좋습니다!
그렇다면 다른 주제로 실기 스타일의 꼬아낸 기본기 문제를 드릴게요. 이번에는 **문자열(String) 비교와 참조 방식("==" vs .equals())**을 주제로 삼겠습니다.
이건 진짜 자바 실기에서 틀리기 딱 좋은 대표 함정이에요.


✅ 문제: 다음 Java 코드의 출력 결과를 구하시오.

public class Main {
    public static void main(String[] args) {
        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));
    }
}

❓ 보기

A.

true  
true  
true

B.

false  
false  
true

C.

true  
false  
true

D.

false  
true  
false

🔍 핵심 포인트 요약

비교 방식의미
==두 객체가 **같은 주소(참조)**를 가리키는지 비교
.equals()두 객체의 내용이 같은지 비교 (문자열 값 비교)

✅ 한 줄씩 디버깅 해설


String a = "hello";
String b = "hello";
  • 🔸 문자열 리터럴 "hello"String constant pool에 저장됨
  • a, b 둘 다 같은 "hello" 객체를 참조함
a ─────┐
       ▼
    "hello"
       ▲
b ─────┘

a == btrue


String c = new String("hello");
  • new String(...)을 쓰면 무조건 새로운 객체 생성
  • c는 같은 내용이지만 다른 객체를 참조
c ─────> "hello" (새 객체)

a == cfalse


System.out.println(a == b);      // true
System.out.println(a == c);      // false
System.out.println(a.equals(c)); // true (내용은 같음)

✅ 정답: C. true false true


✨ 추가 헷갈리게 꼬는 방식 (실기 응용)

❓ 아래 코드의 출력 결과는?

String x = "abc";
String y = x + "";
System.out.println(x == y);
  • 🔹 y는 "abc" 리터럴로 보이지만, 런타임에 새롭게 만들어진 객체
  • 따라서 x == yfalse

✅ 정리 요약

표현의미주소 같음?내용 같음?
"abc"리터럴
new String("abc")새 객체
a == b참조 비교✅ or ❌-
a.equals(b)내용 비교-✅ or ❌

아주 좋은 질문입니다!
==.equals()는 자바에서 객체를 비교할 때 의미와 쓰임이 완전히 다릅니다.


1. == 연산자

  • 의미: 두 객체가 **같은 메모리 주소(참조)**를 가리키는지 비교
  • 즉, 두 변수에 저장된 참조값이 같은지 비교하는 연산자입니다.

예시

String a = "hello";
String b = "hello";
System.out.println(a == b); // true, 같은 상수풀(String constant pool)을 참조함

String c = new String("hello");
System.out.println(a == c); // false, c는 새로운 객체임
  • 참고: 기본 타입(int, char 등)은 값 자체를 비교합니다.

2. .equals() 메서드

  • 의미: 두 객체의 내용이 같은지 비교
  • 대부분 클래스에서 재정의(오버라이드)되어 있어, 객체 내부 값 비교에 쓰임

예시 (String)

String a = "hello";
String c = new String("hello");
System.out.println(a.equals(c)); // true, 내용이 같으므로 true 반환

정리하면

비교 방법비교 대상의미결과 예시 (String a="hello", c=new String("hello"))
==참조값두 변수가 같은 객체인지a == c → false
.equals()객체 내용두 객체 내부 내용이 같은지a.equals(c) → true

언제 어떤 걸 써야 할까?

  • 객체가 같은지 확인할 땐?==
  • 내용이 같은지 확인할 땐?.equals() (특히 String, Wrapper 클래스 등)
  • 실수하면?==로 문자열 비교하면 잘못된 결과가 나와서 버그 원인이 됨

보통 자주 쓰는 패턴

if (str1.equals(str2)) { ... }  // 안전하고 정확한 문자열 비교

// null 안전하게 쓰려면
if ("hello".equals(str1)) { ... }  // str1이 null이어도 NPE 안남

0개의 댓글