1. String 클래스
기존의 다른 언어에서는 문자열을 char형의 배열로 다루었으나 자바에서는 문자열을 위한 클래스를 제공한다.
String클래스는 문자열을 저장하고 이를 다루는데 필요한 메서드를 함께 제공한다.
String 클래스는 변경 불가능한 (immutable) 클래스
String클래스에는 문자열을 저장하기 위해서 문자형 배열 참조변수(char[]) value를 인스턴스 변수로 정의해놓고 있다.
인스턴스 생성자의 매개변수로 입력받는 문자열은 이 인스턴스변수에 문자형 배열(char[])로 저장되는 것이다.
한 번 생성된 String인스턴스가 갖고 있는 문자열은 읽어올 수 만있고 변경할 수는 없다.
예를 들어 아래코드와 같이 '+' 연산자를 이용해서 문자열을 결합하는 경우 인스턴스 내 문자열이 바뀌는 것이 아니라
새로운 문자열("ab")이 담긴 String 인스턴스가 생성되는 것이다.
String a = "a" ;
String b = "b" ;
a = a + b
이처럼 덧셈연산자 '+' 를 사용해서 문자열을 결합하는 것은 매 연사 시 마다 새로운 문자열을 가진 String 인스턴스가 생성되어
메모리 공간을 차지하게 되므로 가능한 한 결합횟수를 줄이는 것이 좋다.
문자열 간의 결합이나 추출등 문자열을 다루는 작업이 많이 필요한 경우에는 String 클래스 대신 StringBuffer 클래스를 사용하는
것이 대안이 될 수 있다.
2. 문자열(String) 클래스 의 비교
문자열을 만들 때는 두가지 방법, 문자열 리터럴을 지정하는 방법과 String 클래스의 생성자를 만드는 방법이 있다.
String str1 = "abc"; // 문자열 리터럴 "abc"의 주소가 str1에 저장됨
String str2 = "abc"; // // 문자열 리터럴 "abc"의 주소가 str2에 저장됨
String str3 = new String("abc"); // 새로운 String 인스턴스를 생성
String str4 = new String("abc"); // 새로운 String 인스턴스를 생성
String 클래스의 생성자를 이용한 경우에는 new 연산자에 의해서 메모리 할당이 이루어지기 때문에 항상 새로운 String 인스턴스가
생성된다. 그러나 문자열 리터럴은 이미 존재하는 것을 재사용하는 것이다. 아래의 그림은 위의 코드가 생성되었을 때 상황을 나타낸 것이다.
equals()를 사용했을 때는 두 문자열의 내용("abc")을 비교하기 때문에 두 경우 모두 true를 결과로 얻지만,
String 인스턴스의 주소를 등가비교연산자 '=='로 비교했을 때는 결과가 다르다.
자바 소스파일에 포함된 모든 문자열 리터럴은 컴파일 시에 클래스 파일에 저장된다. 이 때 같은 내용의 문자열 리터럴은 한번만 저장된다.
문자열 리터럴도 String 인스턴스이고, 한번 생성하면 내용을 변경할 수 없으니 하나의 인스턴스를 공유하면 되기 때문이다.
public class Ex9_7 {
public static void main(String args[]){
String s1 = "AAA" ;
String s2 = "AAA" ;
String s3 = "AAA" ;
String s4 = "BBB" ;
}
}
위 예제를 실행하면 "AAA"라는 문자열을 담고 있는 String 인스턴스가 하나 생성된 후, 참조변수 s1,s2,s3는 모두 이 String인스턴스를
참조하게 된다. 클래스파일이 클래스 로더에 메모리에 올라갈 때, 클래스 파일의 리터럴들이 JVM 내에 있는
'상수 저장소(constant pool)'에 저장된다. 이 때 "AAA" 와 같은 문자열 리터럴은 자동적으로 생성되어 저장되는 것이다.
3. 빈 문자열(empty string)
길이가 0인 배열이 존재할 수 있을까? 답은 존재할 수 있다. char형 배열도 길이가 0인 배열을 생성할 수 있고,
이 배열을 내부적으로 가지고 있는 문자열이 바로 빈 문자열이다.
'String s = :"";'과 같은 문장이 있을 때, 참조변수 s가 참조하고 있는 String 인스턴스는 내부에 'new char[0]과' 같이 길이가
0인 char형 배열을 저장하고 있는 것이다.
char[] = chArr = new char[0]; // 길이가 0인 char배열
int[] = iArr = {}; // 길이가 0인 int 배열
'String s = :"";' 과 같은 표현이 가능하다고 해서 'char c=";'과 같은 표현이 가능한 것은 아니다.
char형 변수에는 반드시 하나의 문자를 지정해야한다.
일반적으로 변수를 선언할 때, 각 타입의 기본 값으로 초기화하지만 String은 참조형 타입의 기본값인 'null' 보다는 빈 문자열로
char 형은 기본값인 '\u0000' 대신 공백으로 초기화 하는 것이 보통이다.
길이가 0인 배열을 생성해서 char 형 배열 참조변수 cArr을 초기화 해주었다. 길이가 0이긴 해도 배열이 생성되며,
생성된 배열의 주소값이 참조변수 cArr에 저장된다.
'JAVA의 정석' 카테고리의 다른 글
StringBuffer 클래스 (0) | 2024.02.22 |
---|---|
String 클래스(2) - join()과 StringJoiner (0) | 2024.02.22 |
Object 클래스 (0) | 2024.02.16 |
예외 처리(4) - 사용자 정의 예외 만들기, 연결된 예외 (0) | 2024.01.29 |
예외 처리(3) - 예외 발생시키기, 예외 떠넘기기 (0) | 2024.01.29 |