반응형
== 은 스택의 값을 비교하고
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 |