본문 바로가기

자바

[JAVA] String에서 ==, equals() 차이

반응형

     String에서 ==, equals() 차이     

안녕하세요. 오늘은 ==와 equals()의 차이점에 대해 이야기를 해볼까합니다.

 

정수끼리의 값이 같은지 비교할때 일반적으로 ==와 같은 연산자를 통해 두 정수의 값이 일치한지 비교를 합니다.

하지만 가끔 String에서 두 변수에 들어있는 내용은 같은데 false가 뜨는 경우를 한번씩 경험 해보셨을겁니다.

 

오늘은 왜 false가 뜨는지와 어떻게하면 정확한 String 타입의 데이터 비교가 가능한지에 대해 알아보겠습니다.

 

먼저 아래 예시와 같이 코드를 작성했습니다.

String a = "abc";
String b = "abc";
String c = new String("abc");

if (a == b) {
	System.out.println("a와 b는 같습니다");
}

if (a == c) {
	System.out.println("a와 c는 같습니다");
}

if (b == c) {
	System.out.println("b와 c는 같습니다");
}

 

위와 같은 코드를 실행하면 세 변수에 들어있는 값은 일치하기에

 

a와 b는 같습니다

a와 c는 같습니다

b와 c는 같습니다

 

같이 뜨는것을 예상할 수 있습니다.

 

하지만 결과는 ..

 

a와 b는 같습니다

 

a와 b만 동일한 값으로 인식하고 c는 다른 값으로 처리가 됐습니다.

왜 그런지에 대해 한번 알아보겠습니다.

 

우선 == 연산자는 두 변수의 메모리에 저장되어 있는 값을 비교합니다.

int와 같은 primitive type은 기본 타입의 값을 저장하고 있습니다. 하지만 String 과 같은 reference type은 참조하는 객체의 주소를 가지고 있는데요. 

 

결국 String에서의 ==는 두 객체의 주소값을 비교하는 역할을 하는것이죠.

String에 데이터를 리터럴로 넣을시 heap에 있는 String constant pool에 저장되어 새로 생성하지 않고 재사용을 합니다.

그래서 a와 b는 동일한 주소값을 가지고 있기 때문에 true 값이 나올 수 있었던 것입니다.

 

하지만 new 연산자를 통해 객체를 생성할 경우 heap 영역에서 별도의 메모리를 할당 받기 때문에 a, b와 주소값이 달라 false가 뜨는 것이죠. 

 

자 그럼 어떻게 두 문자열에 들어있는 값이 같은지 판별할 수 있을까요.

자바에는 그러한 문제를 해결하기 위해 두 변수의 핵심 값만 비교하는 equals()라는 함수가 존재합니다.

String a = "abc";
String b = "abc";
String c = new String("abc");

if (a.equals(b)) {
	System.out.println("a와 b는 같습니다");
}

if (a.equals(c)) {
	System.out.println("a와 c는 같습니다");
}

if (b.equals(c)) {
	System.out.println("b와 c는 같습니다");
}

 

바로 위와 같이 equals를 통해 값을 비교해봤습니다. 결과는...

 

a와 b는 같습니다

a와 c는 같습니다

b와 c는 같습니다

 

네, 저희가 처음 예상한 결과와 같이 떴습니다.

앞으로 String 타입을 비교할땐 == 연산자 대신 equals를 통해 값을 비교하는 것이 안전하고 좋을거 같습니다.

 

다음에 더 좋은 정보로 찾아뵙겠습니다 ^_^

 

반응형