본문 바로가기
Dev/Java

[Java] ==와 equals() 차이

by Ellen571 2024. 7. 30.
반응형

 

 

 

== 은 스택의 값을 비교하고

equals() 는 힙의 값을 비교한다.

 

 

JVM 메모리 영역은 간략하게 메소드, 힙, 스택으로 나뉜다.

자바 메모리 구성

 

스택(Stack)

원시 자료형과 참조 변수(+객체주소) 저장

 

힙(Heap)

참조 변수의 실제 데이터와 객체 저장

 

String s1 = "KR", s2 = "KR";
System.out.println(s1 == s2); // 스택 주소 동일 동일 값을 가리키기에
System.out.println(s1.equarl(s2)); // 값 자체만 비교
  • "KR"이 힙에 먼저 생성된 후, s1 변수가 스택에 생성되면 "KR"의 주소를 저장한다.
  • 다시 나오는 "KR"은 에 생성되어 있는지 조회하고, 이미 있으니 스택에 s2을 생성하고 "KR" 주소를 저장한다.
  • s1와 s2 둘 다 에 있는 "KR"의 동일 주소를 가지게 된다.
  • s1 == s2는 스택에 있는 주소를 비교한다.
  • s1.equarl(s2)은 주소가 가리키는 힙의 값을 비교한다.

 

값은 같은데 주소가 다른 경우

String s1 = "KR";
System.out.println("KR 입력");
Scanner sc = new Scanner(System.in);
String s2 = sc.next();
sc.close();

System.out.println(s1==s2); // false
System.out.println(s1.equals(s2)); // true
  • scanner는 입력받을 공간을 힙에 먼저 확보해 놓고 주소값도 생성한다.
  • 그렇기에 값이 입력되어 저장될 때 이미 있는 값이여도 주소가 다르다.
  • ==은 스택 주소 비교했을 때 s1와 s2는 다르게 나와 false이다.
  • 하지만 equals는 힙에 있는 값을 비교하기에 true로 나온다.
String s1 = "KR";
String s2 = "KR";
String s3 = new String("KR");
String s4 = new String(s1);
String s5 = s1;

System.out.println(s1==s2); // true
System.out.println(s1==s3); // false
System.out.println(s1==s4); // false
System.out.println(s1==s5); // true
  • new는 힙에 새 객체 공간을 만든다.
  • 값이 같아도 새로 객체를 생성한 것이라면 주소값이 동일하지 않은 것이다.

 

 

반응형

'Dev > Java' 카테고리의 다른 글

[Java] && 와 &는 동일하지 않다.  (0) 2024.07.29
[Java] 데이터 타입  (0) 2024.07.28
[Java] JVM 구조  (0) 2024.07.27
[Java] 자바 프로그램은 어떻게 실행될까?  (0) 2024.07.27
[Java] 프로그래밍은 언제부터 시작?  (0) 2024.07.27