면접

백엔드 기술 면접 후기(2)

indeep 2024. 1. 1. 17:13
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가 나오게 된다.

반응형