본문 바로가기
My Image
프로그래밍/Java

[String] == VS equals 문자열 비교

by Lim-Ky 2017. 12. 27.
반응형

 == VS equals 문자열 비교

 

안녕하세요. Limky 입니다. 오랜만에 글쓰네요~

오늘은 기본적인 java 문자열 비교에 대한 흔한 실수를 알아보고 올바른 문자열 비교가 무엇인지 알아보겠습니다.

 

자바에서 문자열은 String이라는 타입을 사용합니다. String은 데이터타입이 아니라 엄연히 말하면 클래스입니다. 

하지만 재미있는 것이 자바에서는 데이터 타입이 참조형, 기본형(8가지)가 있습니다. 

그런데 String이라는 것은 분명 클래스이기 때문에 참조형 타입이지만, 기본형처럼 값을 직접 할당 해서 사용할 수 있습니다. 

 

즉 String에 값을 할당 하는 방법은 2가지가 존재합니다.

 

String str = new String("Limky"); //생성자를 통한 참조형으로..

 

String str = "Limky"; //기본자료형처럼 직접 할당하는 방법...

 

또 하나 알아둬야 할 것은 후자같은 방법으로 Data를 할당 할 시 JVM 메모리 상수풀이란 곳에 "Limky" 값을 str에 할당합니다.

 

다음과 같이 값을 할당 했다고 합시다.

 

String str01 = "Limky"; 

 

String str02 = "Limky"; 

 

str01 , str02 모두 Limky를 할당 받았습니다. 하지만 주소는 다를까요??? 아닙니다. str01이 jvm 상수풀 메모리 공간에 이미 Limky를 할당 받고 있었고, str02는 새로 메모리를 생성하지 않고 str01이 가리키고 있는 Limky를 같이 가리키게 됩니다. 

따라서!! 같은 주소 값을 가지고 있습니다. 

 

하지만!! 다음과 같은 경우는 다릅니다.

 

String str01 = new String("Limky"); 

 

String str02 = "Limky"; 

 

str01은 jvm 안에 있는 heap이라는 메모리 영역에 인스턴스가 생성되고 Limky라는 값을 가지고 있습니다. 하지만 str02는 jvm 안에 상수풀 안에 있는 메모리에 Limky를 만들고 그 메모리 주소를 가리키고 있습니다. 따라서 엄연히 data값은 같더라고 데이터를 가리키고 있는 주소 값은 다릅니다.

 

왜 이렇게 주소 값을 따질까요? 바로 == 비교연산자라는 녀석때문입니다. 자칫 문자열 비교시 == 연산을 사용할 때가 있는데 그러면 안됩니다... 왜냐면 == 비교연산자는 문자열 데이터 값을 비교하는 것이 아닌!!! 주소 값을 비교하기 때문입니다. 

 

따라서 str01 == str02는 false입니다. 주소 값을 비교하기 때문이지요. 그렇다면 주소 값이 아닌 순수하게 data값만 비교하려면 어떻게 해야 할까요?? 

 

바로 String에서 지원하는 equals라는 문자열 비교 메서드를 사용하면 주소 값이 아닌 data값을 비교하기 때문에 우리가 원하는 결과를 얻을 수 있습니다.

 

아래는 지금까지 설명한 내용을 바탕으로 예제를 바탕으로 작성되었습니다.

== 연산을 할 때와 equals 를 잘 비교해보면 equals는 어떻게 값을 할당 하던지 간에 data값만 비교하기 때문에 항상 참인 것을 알 수 있습니다. 따라서 문자열 비교시에는 equals를 쓰는 것이 안전하고 보편적입니다.

 

package StringCompare;

public class StringCompareMain {

	public static void main(String[] args) {
		
		String str01 = "Limky";
		String str02 = "Limky";
		
		if(str01 == str02){
			System.out.println("== 비교 : 같습니다.");
		}else{
			System.out.println("== 비교 : 같지 않습니다.");
		}
		
		String str03 = new String("Limky");
		String str04 = "Limky";
		
		if(str03 == str04){
			System.out.println("== 비교 : 같습니다.");
		}else{
			System.out.println("== 비교 : 같지 않습니다.");
		}
		
		String str05 = new String("Limky");
		String str06 = new String("Limky");
		
		if(str05 == str06){
			System.out.println("== 비교 : 같습니다.");
		}else{
			System.out.println("== 비교 : 같지 않습니다.");
		}
		
		////////////////////////////////////////////////////
		String str07 = new String("Limky");
		String str08 = "Limky";
		
		if(str07.equals(str08)){
			System.out.println("equals 비교 : 같습니다.");
		}else{
			System.out.println("equals 비교 : 같지 않습니다.");
		}
		
		String str09 = new String("Limky");
		String str10 = new String("Limky");
		
		if(str09.equals(str10)){
			System.out.println("equals 비교 : 같습니다.");
		}else{
			System.out.println("equals 비교 : 같지 않습니다.");
		}
		
	}

}

 

출력결과

 

 

 

 

 

 

 

반응형

댓글