문자열(String)
1. 변경 불가능한 클래스
String 클래스는 문자열을 저장하기위해 char[] value를 인스턴스 변수로 정의하고 있다.
인스턴스 생성시 입력받는 문자열이 value에 저장되는데, value에 한 번 저장된 배열은 읽기만 가능하며 변경할 수 없다.
2. 문자열 비교
String 클래스 생성자를 이용하여 문자열을 만든 경우, new 연산자에 의해 메모리 할당이 이루어진다.
따라서 항상 새로운 String인스턴스가 생성되어 서로 다른 메모리값을 가진다.
하지만, 문자열 리터럴의 경우 같은 내용의 문자열 리터럴을 재사용한다.
아래 예시를 보자.
String str1 = new String("apple");
String str2 = new String("apple");
String str3 = "apple";
String str4 = "apple";
str1과 str2는 String 클래스 생성자를 이용하며 문자열을 만든 경우이다.
new 연산자에 의해 각각의 메모리 할당이 이루어졌으므로, str1과 str2의 메모리 주소는 상이하다.
반면, str3과 str4는 문자열 리터럴을 지정한 문자열이다.
둘은 같은 내용의 문자열 리터럴을 지정하였으므로, "apple"이라는 문자열 리터럴이 저장된 메모리 주소를 가리키게 된다.
즉 str3과 str4가 담고있는 주소는 같다.
System.out.println(str1==str2); // false
System.out.println(str3==str4); // true
System.out.println(str1.equals(str2)); // true
System.out.println(str3.equals(str4)); // true
위 코드에서 str1.equals(str2)가 true인 이유는 무엇일까?
모든 객체의 조상인 Object.class에서는 equals()에서는 단순히 this==obj 형태로 주소가 동일한지 확인한다.
이대로라면 str1.equals(str2)의 값은 false여야 할 것이다.
아래는 String.class에서 equals() 메서드이다.
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
Object.class의 equals()를 오버라이딩한 String의 equals()에서는 String이 가진 문자열의 내용이 같은지를 확인하는 부분이 추가되어있다. 따라서 같은 주소를 참조하고 있지 않더라도 가진 문자열의 내용이 같다면 true를 반환하게 된다.
3. 빈 문자열(empty string) 가능
길이가 0인 배열이 존재할 수 있을까? 가능하다.
따라서 String 역시 value로 char[0]인 배열을 가질 수 있다.
String str1 = new String("");
String str2 = "";
char[] arr = new char[0];
String str3 = new String(arr);
st1, str2, str3 모두 길이가 0인 배열을 value로 가진 빈 문자열이다.
4. String 생성자
String 클래스는 문자열 조작을 위한 다양한 내장함수를 제공한다. 이는 추후 따로 정리하기로 하고, 일단 오늘은 String을 생성하는 생성자의 종류에 대해서만 정리하자.
메서드 | 설명 | 예제 |
String(String s) | 주어진 문자열(s)를 갖는 String 인스턴스 생성 | String str = new String("Son"); |
String(char[] value) | 주어진 문자열(value)를 갖는 String 인스턴스 생성 | char[] cArr = ['S','o','n']; String str = new String(cArr); |
String(StringBuffer buf) | StringBuffer인스턴스가 가진 문자열과 같은 내용의 문자열을 갖는 String 인스턴스 생성 | StringBuffer sb = new StringBuffer("Son"); String str = new String(sb); |
'프로그래밍 언어 > Java' 카테고리의 다른 글
Java의 예외처리 (함수 너 회피형이야?) (1) | 2025.01.02 |
---|---|
잠깐 ! JVM 정리하고 갑시다 (1) | 2024.12.31 |
[Java] 문자열(String) 내장 함수 정리 (1) | 2024.01.11 |
[Java] CharSequence란? (0) | 2024.01.11 |
[Java] 스트림(Stream) (0) | 2024.01.10 |