String a = "abc" 라고 만든 변수가 있고,
String b = new String("abc") 라고 만든 변수가 있습니다.
이 두 개를 '==' 으로 비교하게 되면 false가 나오는데 왜 그런 건가요?
되게 간단한 질문이라고 생각한다.
기본적으로 String에서 == 비교와 equals()로 비교를 했을 때 차이점을 알고 있냐는 질문과 유사하다.
우선 자바 메모리 구조가 어떻게 되는지 사진으로 알아보자.
String a = "abc";
리터럴로 a라는 변수에 값을 할당했다.
이렇게 하면 스트링 풀에 "abc"라는 값이 생성되기 된다.
새로운 그 다음 새로운 값을 만들어서 비교해보면
String a = "a";
System.out.println(a.hashCode());
String c = "a";
System.out.println(c.hashCode());
위와 같은 코드를 동작하게되면 둘 다 동일한 해시코드가 나오게 된다.
그 이유는 "a"를 처음에 상수풀에 추가해놓고 c에서 "a"를 할당할 때 이미 상수풀에 값이 있으니 참조값을 반환시키기 때문이다.
기존에는 상수 풀이 메서드 영역에서 관리됐지만 JDK 7부터 힙 영역에서 관리된다.
그렇기에 "abc"라는 값은 힙 영역에 상수풀에 저장돼서 고유한 주소값을 가지게 된다.
String b = new String("abc");
이렇게 new 키워드로 "abc" 문자열을 생성하면 힙 영역에 새로운 객체를 만들게 되는 것이다.
그래서 a는 힙 영역의 상수 풀에 있는 "abc"를 참조.
b는 힙 영역의 있는 "abc" 객체를 참조.
이 상태에서 ==으로 비교하게 되면 두 개의 주소값을 비교하게 된다.
그래서 false가 나오게 되는 것이다.
반면에 equals()는 두 변수의 값만 비교하게 된다.
a는 상수 풀, b는 힙에 존재하고 주소 값은 다르지만 값 자체는 동일하다.
그래서 true가 나오게 된다.
반응형
'면접' 카테고리의 다른 글
백엔드 기술 면접 후기(4) (1) | 2024.01.04 |
---|---|
백엔드 기술 면접 후기(3) (1) | 2024.01.03 |
백엔드 기술 면접 후기(1) (2) | 2023.12.25 |