자바의 데이터 타입에는 크게 기본 타입과 참조 타입으로 구분이 된다.
참조 타입의 특징은 다음과 같다.
- 실제 값을 저장하는 기본형과 달리 자료가 저장된 공간의 주소를 해시코드로 저장한다.
- 메모리의 힙 영역에 실제 값을 저장하고, 그 주소를 갖는 변수 스택 영역에 저장한다.
여기서 제목의 궁금증이 생겼다.
String이 참조변수이면 다른 참조변수와 마찬가지로 출력할 때 해시코드를 출력해야 하는 게 아닌가?
하지만 String을 출력하게 되면 해시코드가 아닌 실제 값이 출력된다.
왜 그런지 이해하기 위해서는 먼저 PrintStream 클래스의 print 메소드를 확인해한다.
public void print(Object obj) {
write(String.valueOf(obj));
}
String 타입은 매개변수가 String 타입으로 오버라이딩 되어있긴 하지만 기본 형식은 위와 같다.
print 메소드를 실행하면 valueof() 메서드가 실행된다.
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
valueof() 메서드는 값이 null이 아니라면 toString()을 반환하게 되는데 여기서 String과 다른 참조변수의 차이점이 발생한다.
다른 참조 변수들은 아래와 같은 toString() 메서드를 사용한다
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
위와 같이 해시코드를 반환하게 된다.
그러나 String은 toString()메소드를 오버라이딩을 하여 아래와 같다.
public String toString() {
return this;
}
자기 자신을 반환하게 된다.
따라서 다른 참조 변수들과 달리 원본 값이 나오게 되는 것이다.
'궁금하다' 카테고리의 다른 글
[MyBatis] selectKey란 무엇인가 + 사용법 (0) | 2024.08.19 |
---|---|
@RequestParam와 @PathVariable의 차이점 (0) | 2024.08.13 |
[JAVA] Call by Reference는 존재하지 않는 이유 (0) | 2024.05.30 |