inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

String 클래스 - 비교

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

94

감사

작성한 질문수 7

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가 되고요.

문자열 리터럴일 경우 문자열 풀을 사용하는 것은 이해가 되었는데 객체생성도 문자열에서는 동일한 문자열 풀을 사용하는지 궁금해서 질문드립니다.

java 객체지향

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 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

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

문제와 풀이

0

25

1

섹션 2 퀴즈 9번

0

34

2

강의노트 내용이 이해가 되지 않아서 문의드립니다.

0

48

1

중급1편, 래퍼클래스 문제와풀이2 로또제너레이터 질문

0

68

1

setVlaue질문

0

94

3

안녕하세요 코딩테스트와 병행하고 싶어서 질문드립니다.

0

94

1

findValue의 파라메터까지 래퍼클래스 배열인 이유가 있을까요?

0

76

1

아래 글처럼 toString() 강의부터 화면이 안보여요

0

99

2

TemporalAdjusters의 lastDayOfNextMonth(), lastDayOfNextYear() 메서드 지원 안함

0

84

2

오타 제보도 되나요?

0

90

2

지역 클래스 예제3 지역변수 질문

0

69

2

래퍼클래스 박싱 출력

0

60

1

자바 equals() 메소드에 대한 물리적 동일성, 논리적 동등성 질문

0

106

3

강의록 오타 제보

0

69

2

자바의 기본 클래스들에 관하여

0

71

1

실무에서 중첩(내부) 클래스 사용하나요?

0

79

1

지역 클래스 - 지역 변수 캡처3

0

55

1

12:30 의 newClassGrade 질문이 있습니다.

0

57

1

날짜와 시간 문제풀이가 막히는데

0

100

2

내부 클래스의 바깥 클래스 참조

0

68

1

스트링 풀, new String()

0

105

3

정적 중첩 클래스 사용 이유

0

97

1

status.getCode() 대신 status.code 사용

1

81

1

메서드의 지역변수명과 내부클래스의 멤버메서드에서의 지역변수명의 중복관련

0

75

1