인프런 커뮤니티 질문&답변

감사님의 프로필 이미지
감사

작성한 질문수

김영한의 실전 자바 - 중급 1편

String 클래스 - 비교

참조값을 확인하려면 hashCode() 메서드를 사용하면 될까요?

작성

·

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 객체 denew 연산자를 사용하여 생성하면 각각 다른 메모리 주소를 가지게 됩니다. 즉, 두 객체는 참조값(메모리 주소)은 다르지만, 내부적으로 문자열 데이터가 동일하기 때문에 hashCode()는 동일한 값을 반환합니다. 이는 Java 문자열의 특징 중 하나이며, 문자열의 내용을 기반으로 해시코드를 계산하기 때문에 실제 메모리 주소와 상관없이 동일한 문자열이면 동일한 해시코드를 반환합니다.

hashCode()와 equals()에 대한 간단한 설명:

  • 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 반환

문자열 풀(String Pool):

문자열 literal을 사용할 경우, 동일한 내용의 문자열은 문자열 풀(String Pool)에 저장되어 재사용됩니다. 그러나 new 연산자를 사용할 때마다 새로운 객체가 생성되며, 이는 문자열 풀이 아닌 힙 메모리에 저장됩니다.

만약, 문자열 풀에 대해 좀 더 깊이 알고 싶다면, 다음 링크를 참고하실 수 있습니다:
String Pool - Java 문자열 핸들링 이해하기

관련 질문에 도움이 될 만한 기존 답변이 아래에 있습니다:
- Generating hash codes in Java
- Difference between hash and hashCode method

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

감사님의 프로필 이미지
감사

작성한 질문수

질문하기