Study/Java

Java equals()와 ==의 차이

cosmohoo 2020. 9. 10. 10:52
반응형

java 기술면접에서 가장 많이 물어보는 질문이다. 

==와 equals()의 차이가 무엇인지를 묻는 것이다. 

아래 예시를 보면서 이야기해보겠다. 

 

 

package nh1;

import java.util.Scanner;

public class Str01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a =10, b= 10;
		System.out.println(a == b);
		String s1="NH";
		String s2="NH";
		
		System.out.println(s1 ==s2);
		System.out.println(s1.equals(s2));
		
		Scanner sc = new Scanner(System.in);
		System.out.println("입력 => NH");
		String s3 = sc.next();
		sc.close();
		
		System.out.println(s1 == s3);
		System.out.println( s1.equals(s3));
		//스택에 쌓이고 heap에 쌓이는 것에 따라 다르다. 
		
	}

}

  • 주소 값주소 값 비교 vs 내용 비교 

일반적으로 == 은 주소 값 비교, equals는 안에 있는 내용까지 비교하는 것으로 알려져 있습니다. 

이를 좀더 깊게 들어가 보면 스택과 Heap에 대한 이해가 필요합니다. 

 

Heap : 참조형 값이 들어가 있는 정리 되어있지 않은 공간 

Stack : 값형이 들어가 차례대로 쌓이는 공간 

 

예를 들어 참조형의 대표인 String 변수 s = "NH"라고 생각해봅니다. 

NH라는 값은 heap에 위치해있으며, 해당 주소값이 Stack에 쌓이게 됩니다. 

 

반대로 int형 변수 i = 4; 를 예로 들겠습니다. 

i는 해당값이 그대로 stack에 쌓이게 됩니다. 

 

 

이를 바탕으로 설명하겠습니다. 

 

==은 해당 변수의 주소 값에 대한 비교 , 

equals()는 해당 변수의 값에 대한 비교를 하는 것입니다. 

 

 

 

package nh1;

public class Str02 {
		public static void main(String[] args) {
			String s1 = "NH";
			String s2 =null;
			s2="NH";
			String s3="Info";s3="NH";
			System.out.println(s2 == s1);
			System.out.println(s3==s1);
		}
}

 

위의 예시를 보면 s1과 s3는 주소 값이 다를 거 같은데 true를 반환합니다. 

이유는 같은 변수의 값을 둘이 같이 바라보고 있기 때문입니다. 

새로운 string으로서 NH라는 글자를 만들고자 할 때는 new String()을 사용해서 새로운 변수를 만들면 Heap에 새로운 위치가 생성되어 False가 반환됩니다. 

 

NH라는 글자를 입력받아 원래의 NH와 비교를 해보면 equals()는 True를 반환하지만, ==는 False를 반환하는 이유입니다. 

 

 

package nh1;

public class Str03 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		String s1= "NH";
		String s2= "NH";
		String s3= s1;
		String s4= new String("NH");
		String s5=  new String(s1);
		
		System.out.println(s1 == s2);
		System.out.println(s1 == s3);
		System.out.println(s1 == s4);
		System.out.println(s1 == s5);

}

 

 

 


 

 

==은 해당 변수의 주소값에 대한 비교 , 

equals()는 해당 변수의 값에 대한 비교를 하는 것입니다. 

 

반응형