모눈종이에 사각사각

[Java] String 클래스 본문

Java

[Java] String 클래스

모눈종이씨 2022. 10. 31. 00:50

🌙 String 클래스

1. String 클래스는 immutable(변경불가능한) 클래스이다.

한 번 생성된 String인스턴스가 가지고 있는 문자열은 읽을 수만 있고, 변경할 수 없다.

 

'+' 연산자를 이용해서 문자열을 결합하는 경우, 인스턴스 내의 문자열이 바뀌는 것이 아니라 새로운 문자열이 담긴 String 인스턴스가 생성되는 것이다.

 

다음과 같이 코드를 작성해 보았을 때 기존의 a의 주소와 a+=b 연산을 마친 후의 a의 주소가 달라졌음을 확인할 수 있다.

 

2. 문자열의 비교

문자열을 만드는 방법은 두 가지가 있다.

String s1 = "가나다"; // 문자열 리터럴 지정
String s2 = "가나다"; // 문자열 리터럴 지정
String s3 = new String("가나다"); // String 인스턴스 생성
String s4 = new String("가나다"); // String 인스턴스 생성

문자열 리터럴을 지정하는 방법과, String 클래스의 생성자를 이용해서 만드는 방법니다.

 

문자열 리터럴은 클래스가 메모리에 로드될 때 자동적으로 미리 생성된다. 같은 내용의 문자열 리터럴은 한 번만 저장된다.

따라서 문자열 리터럴은 이미 존재하는 것을 재사용한다.

 

클래스 파일에는 소스 파일에 포함된 모든 리터럴의 목록이 있다.
해당 클래스 파일이 클래스 로더에 의해 메모리에 올라갈 때, 이 리터럴의 목록에 있는 리터럴들이 JVM내에 있는 '상수 저장소(constant pool)'에 저장된다.

String클래스의 생성자를 이용한 경우에는 항상 새로운 인스턴스가 생성된다.

 

String클래스는 hashCode()를 오버라이딩 하고 있기 때문에, 같은 내용의 문자열에 대해서는 같은 hashCode()를 반환한다.

그러나 identityHashCode를 보면 문자열 리터럴(s1, s2)의 주소값은 같지만, String 인스턴스로 생성한 문자열은 주소값이 다름을 확인할 수 있다.

 

equals()를 사용했을 때는 두 문자열의 "내용"을 비교하기 때문에 내용만 본다.

그러나 '=='로 비교하였을 때는 각 String의 인스턴스 주소를 비교한다.

 


📚 참고자료

남궁성, 『자바의 정석』, 도우출판

Comments