문자열 객체 생성
java.lang 패키지에 포함된 클래스로서 String 클래스는 문자열을 나타낸다. 문자열 리터럴은 자바 컴파일러에 의해 모두 String 객체로 처리된다.
| 생성자 | 설명 |
|---|---|
| String() | 빈 문자열 객체를 생성한다. |
| String(char[] value) | char 배열에 있는 문자들을 문자열 객체로 생성한다. |
| String(String original) | 매개 변수로 주어진 문자열을 동일한 문자열 객체로 생성한다. |
| String(StringBuffer buffer) | 매개 변수로 주어진 문자열 버퍼의 문자열을 문자열 객체로 생성한다. |
문자열 특징
대표적인 문자열 특징은 다음 2가지와 같다.
-
리터럴과 new String(): 문자열 리터럴은 자바 내부에서 리터럴 테이블로 특별히 관리하여 동일한 리터럴을 공유시키지만, new String()로 생성된 문자열은 new 키워드를 이용하여 생성되는 다른 객체와 동일하게 힙 메모리에 생성된다.
-
객체의 수정 불가능: 일단 생성된 문자열 객체는 수정이 불가능하다. 문자열을 변경하기 위한 메소드 사용 예제 코드는 다음과 같다.
String s = new String("Hello");
String t = s.concat("Java"); // 문자열 s에 "Java"를 덧붙인 새로운 문자열 객체를 리턴한다.
문자열 활용
문자열 클래스의 주요 메소드는 다음 표와 같다.
| 메소드 | 설명 |
|---|---|
| char charAt(int index) | index 인덱스에 있는 문자 값을 반환한다. |
| int codePointAt(int index) | index 인덱스에 있는 유니코드 값을 반환한다. |
| int compareTo(String anotherString) | 두 문자열을 사전 순으로 비교하여 두 문자열이 같으면 0, 현 문자열이 anotherString 문자열보다 먼저 나오면 음수를 아니면 양수를 반환한다. |
| String concat(String str) | 현재 문자열 뒤에 str 문자열을 덧붙인 새로운 문자열 객체를 반환한다. |
| boolean contains(CharSequence s) | s 시퀀스에 지정된 문자들을 포함하고 있으면 참을 반환한다. |
| int length() | 문자열의 길이(문자 개수)를 반환한다. |
| String replace(CharSequence target, CharSequence replacement) | target 시퀀스가 지정하는 일련의 문자들을 replacement 시퀀스가 지정하는 문자들로 변경한 문자열을 반환한다. |
| String[] split(int beginIndex) | 정규식 regenx 문자열에 일치하는 부분을 중심으로 문자열을 분리하고, 분리된 문자열들을 배열로 저장하여 반환한다. |
| String subString(int beginIndex) | beginIndex 인덱스로부터 시작하는 서브 문자열을 반환한다. |
| String toLowerCase() | 소문자로 변경한 문자열을 반환한다. |
| String toUpperCase() | 대분자로 변경한 문자열을 반환한다. |
| String trim() | 문자열 앞뒤의 공백 문자들을 제거한 문자열을 반환한다. |
문자열 클래스의 다양한 메소드를 활용하는 예제 코드는 다음과 같다.
package ch6n7;
public class StringEx {
public static void main(String[] args) {
String a = new String(" C#");
String b = new String(",C++ ");
System.out.println(a + "의 길이는 " + a.length()); // 문자열의 길이(문자 개수)를 반환한다.
System.out.println(a.contains("#")); // 문자열의 포함 관계를 반환한다.
a = a.concat(b); // 문자열을 연결한다.
System.out.println(a);
a = a.trim(); // 문자열 앞뒤의 공백을 제거한다.
System.out.println(a);
a = a.replace("C#", "Java"); // 문자열을 대치한다.
System.out.println(a);
String s[] = a.split(",");
for (int i = 0; i < s.length; ++i) {
System.out.println("분리된 문자열" + i + ": " + s[i]);
}
a.substring(5); // 인덱스 5부터 끝까지 서브 문자열을 반환한다.
System.out.println(a);
char c = a.charAt(2); // 인덱스 2의 문자를 반환한다.
System.out.println(c);
}
}
실행 결과는 다음과 같다.
C#의 길이는 3
true
C#,C++
C#,C++
Java,C++
분리된 문자열0: Java
분리된 문자열1: C++
Java,C++
v
StringBuffer 객체 생성
java.lang 패키지에 포함되어 있으며, String 클래스와 같이 문자열을 다룬다.
| 생성자 | 설명 |
|---|---|
| StringBuffer() | 초기 버퍼의 크기가 16인 문자열 버퍼 객체를 생성한다. |
| StringBuffer(CharSequence seq) | seq 시퀀스가 지정하는 일련의 문자들을 포함하는 문자열 버퍼 객체를 생성한다. |
| StringBuffer(int capacity) | 지정된 초기 크기를 갖는 문자열 버퍼 객체를 생성한다. |
| StringBuffer(String str) | 지정된 문자열로 초기화된 문자열 버퍼 객체를 생성한다. |
StringBuffer 특징
대표적인 StringBuffer 특징은 다음 2가지와 같다.
-
기본 패키지: java.lang 패키지에 포함되어 있고, String 클래스와 같이 문자열을 다룬다.
-
수정 가능: String 객체의 경우 내부의 문자열을 수정할 수 없지만, StringBuffer 객체는 저장된 문자열의 수정이 가능하다.
-
가변 버퍼: StringBuffer 객체는 문자열을 저장하는 가변 버퍼를 가지고 있다. 이러한 이유로 저장된 문자열을 수정할 수 있다.
-
가변 크기: 문자열의 크기가 늘어나면, 내부 버퍼의 크기를 자동으로 조절한다. 더 자세한 설명은 다음과 같다.
새로운 크기 = (현재 버퍼의 크기 * 2) + 2, 현재 크기의 2배에 2를 더한 값으로 확장된다.
단순히 2배로만 늘리는 것보다 약간 더 큰 여유 공간을 확보하여 빈번한 재할당을 줄여 약간의 성능 향상을 기대하도록 구현되어 있다.
StringBuffer 활용
문자열 클래스의 주요 메소드는 다음 표와 같다.
| 메소드 | 설명 |
|---|---|
| StringBuffer append(String str) | str 문자열을 문자열 버퍼에 덧붙인다. |
| StringBuffer append(StringBuffer sb) | sb 문자열 버퍼를 현재의 문자열 버퍼에 덧붙인다. 이 결과로 현재 문자열 버퍼의 내용이 변한다. |
| int capacity() | 문자열 버퍼의 현재 크기를 반환한다. |
| StringBuffer delete(int start, int end) | start 위치에서 end 위치 앞까지 부분 문자열을 삭제한다. |
| StringBuffer insert(int offset, String str) | str 문자열을 문자열 버퍼의 offset 위치에 삽입한다. |
| StringBuffer replace(int start, int end, String str) | 문자열 버퍼 내의 start 위치의 문자부터 end가 지정하는 문자 앞의 서브 문자열을 str 문자열로 대치한다. |
| StringBuffer reverse() | 문자열 버퍼 내의 문자들을 반대 순서로 변경한다. |
| void setLength() | 문자열 버퍼 내 문자열 길이를 newLength 정수로 재설정하고 현재 길이보다 큰 경우 널 문자(‘ ‘)로 채우며 작은 경우는 기존 문자열이 잘린다. |