-
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()는 해당 변수의 값에 대한 비교를 하는 것입니다.
반응형'Study > Java' 카테고리의 다른 글
class(클래스) 변수, instance(인스턴스) 변수, local(지역) 변수의 차이 (0) 2020.09.11 -