작성
·
31
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)
[질문 내용]
String d = new String("TEST");
String e = new String("TEST");
각각의 참조값이 다르게 생성되어야 함에도
System.out.println(d.hashCode());
System.out.println(e.hashCode());
해보면 결과값은 동일한 해쉬값이 나옵니다.
동일성 비교는 false, 동등성 비교는 true가 되고요.
문자열 리터럴일 경우 문자열 풀을 사용하는 것은 이해가 되었는데 객체생성도 문자열에서는 동일한 문자열 풀을 사용하는지 궁금해서 질문드립니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 감사님.
문의하신 내용에 대해 구체적으로 설명드리겠습니다.
질문에서 언급하셨듯이, 두 개의 String
객체 d
와 e
를 new
연산자를 사용하여 생성하면 각각 다른 메모리 주소를 가지게 됩니다. 즉, 두 객체는 참조값(메모리 주소)은 다르지만, 내부적으로 문자열 데이터가 동일하기 때문에 hashCode()
는 동일한 값을 반환합니다. 이는 Java 문자열의 특징 중 하나이며, 문자열의 내용을 기반으로 해시코드를 계산하기 때문에 실제 메모리 주소와 상관없이 동일한 문자열이면 동일한 해시코드를 반환합니다.
hashCode()
는 객체의 해시코드를 반환하는 메서드로, 객체의 내용(특히 문자열의 경우)을 기반으로 계산됩니다.equals()
는 객체의 동등성을 비교하는 메서드로, 두 객체가 동일한 내용을 가지고 있는지를 검사합니다.예를 들어:
String d = new String("TEST");
String e = new String("TEST");
System.out.println(d.hashCode()); // 동일한 값 출력
System.out.println(e.hashCode()); // 동일한 값 출력
System.out.println(d == e); // 참조 동일성 비교: false 반환
System.out.println(d.equals(e)); // 내용 동일성 비교: true 반환
문자열 literal을 사용할 경우, 동일한 내용의 문자열은 문자열 풀(String Pool)에 저장되어 재사용됩니다. 그러나 new
연산자를 사용할 때마다 새로운 객체가 생성되며, 이는 문자열 풀이 아닌 힙 메모리에 저장됩니다.
만약, 문자열 풀에 대해 좀 더 깊이 알고 싶다면, 다음 링크를 참고하실 수 있습니다:
String Pool - Java 문자열 핸들링 이해하기
관련 질문에 도움이 될 만한 기존 답변이 아래에 있습니다:
- Generating hash codes in Java
- Difference between hash and hashCode method
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.