ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java equals()와 ==의 차이
    Study/Java 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()는 해당 변수의 값에 대한 비교를 하는 것입니다. 

     

    반응형

    댓글

Designed by Who.