java.lang.String 클래스에 대한 간략한 설명과 주요 API들을 정리합니다.
참고한 사이트는 다음과 같습니다.
public final class String
extends Object
implements Serializable, Comparable<String>, CharSequence
String
클래스는 문자열을 나타내는 클래스입니다. 자바 프로그램에서 “abc”와 같은 모든 문자열 리터럴은 이 클래스의 인스턴스로 구현됩니다.
문자열은 상수이며 값은 생성된 후에는 변경될 수 없는 불변(immutable) 객체입니다. 변경 가능한(mutable) 문자열은 StringBuffer
등의 클래스가 지원합니다.
생성자(인자) | 설명 |
---|---|
String() | 새로 생성된 String 객체를 초기화하여 빈 문자 시퀀스를 나타냅니다. |
String(byte[] bytes) | 지정된 바이트 배열을 플랫폼의 기본 문자셋을 사용해 디코딩하여 새 String 을 생성합니다. |
String(byte[] bytes, int offset, int length) | 지정된 바이트 배열의 부분 배열을 플랫폼의 기본 문자셋을 사용해 디코딩하여 새 String 을 생성합니다. |
String(byte[] bytes, int offset, int length, String charsetName) | 지정된 바이트 배열의 부분 배열을 지정된 문자셋을 사용해 디코딩하여 새 String 을 생성합니다. |
String(byte[] bytes, int offset, int length, Charset charset) | 지정된 바이트 배열의 부분 배열을 명시된 문자셋을 사용해 디코딩하여 새 String 을 생성합니다. |
String(byte[] bytes, String charsetName) | 지정된 바이트 배열을 지정된 문자셋을 사용해 디코딩하여 새 String 을 생성합니다. |
String(byte[] bytes, Charset charset) | 지정된 바이트 배열을 지정된 문자셋을 사용해 디코딩하여 새 String 을 생성합니다. |
String(char[] value) | 문자 배열 인자에 현재 포함된 문자 시퀀스를 나타내는 새 String 을 할당합니다. |
String(char[] value, int offset, int count) | 문자 배열 인자의 부분 배열로부터 문자들을 포함하는 새 String 을 할당합니다. |
String (int[] codePoints, int offset, int count) | 유니코드 코드 포인트 배열 인자의 부분 배열로부터 문자들을 포함하는 새 String 을 할당합니다. |
String(String original) | 인자와 동일한 문자 시퀀스를 표현하기 위해 새로 생성되는 String 객체를 초기화합니다. 즉, 새로 생성되는 문자열은 인자 문자열의 복제본입니다. |
String (StringBuffer buffer) | 문자열 버퍼 인자에 현재 포함된 문자 시퀀스를 포함하는 새 문자열을 할당합니다. |
String (StringBuilder builder) | 문자열 빌더 인자에 현재 포함된 문자 시퀀스를 포함하는 새 문자열을 할당합니다. |
접근자와 반환 타입 | 메서드명(인자) | 설명 |
---|---|---|
char | charAt(int index) | 명시된 인덱스의 char 값을 반환합니다. |
IntStream | chars() | 이 시퀀스의 char 값을 zero-extend2한 int 의 스트림을 반환합니다. |
int | codePointAt(int index) | 명시된 인덱스의 유니코드 코드 포인트를 반환합니다. |
IntStream | codePoints() | 이 시퀀스로부터 코드 포인트 값의 스트림을 반환합니다. |
int | compareTo(String anotherString) | 두 문자열을 사전 순서로 비교합니다. |
int | compareToIgnoreCase(String str) | 두 문자열을 대소문자를 구별하지 않고 사전 순서로 비교합니다. |
String | concat(String str) | 인자로 명시된 문자열을 본 문자열의 끝에 이어붙입니다. |
boolean | contains(CharSequence s) | 문자열이 인자로 명시된 시퀀스를 포함하는 경우에 true 를 반환합니다. |
boolean | contentEquals(CharSequence cs) | 문자열을 인자로 명시된 CharSequence 와 비교합니다. |
boolean | contentEquals(StringBuffer sb) | 문자열을 인자로 명시된 StringBuffer 와 비교합니다. |
static String | copyValueOf(char[] data) | valueOf(char[]) 와 동등합니다. |
static String | copyValueOf(char[] data, int offset, int count) | valueOf(char[], int, int) 와 동등합니다. |
boolean | endsWith(String suffix) | 문자열이 인자로 명시된 접미사로 끝나는지 확인합니다. |
boolean | equals(Object anObject) | 문자열을 인자로 명시된 객체와 비교합니다. |
boolean | equalsIgnoreCase(String anotherString) | 문자열을 대소문자를 구분하지 않고 다른 문자열과 비교합니다. |
static String | format(String format, Object... args) | 인자로 명시된 포맷 문자열과 인자들을 이용하여 포매팅된 문자열을 반환합니다. |
static String | format(Locale l, String format, Object... args) | 인자로 명시된 로케일, 포맷 문자열과 인자들을 사용하여 포매팅된 문자열을 반환합니다. |
byte[] | getBytes() | 문자열을 플랫폼의 기본 문자셋 을 사용하는 바이트 시퀀스로 인코딩합니다. 결과는 새 바이트 배열에 저장합니다. |
byte[] | getBytes(String charsetName) | 문자열을 인자로 명시된 이름의 문자셋을 사용하는 바이트 시퀀스로 인코딩합니다. 결과는 새 바이트 배열에 저장합니다. |
byte[] | getBytes(Charset charset) | 문자열을 주어진 문자셋을 사용하는 바이트 시퀀스로 인코딩합니다. 결과는 새 바이트 배열에 저장합니다. |
void | getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) | 문자열로부터 목적 배열에 문자들을 복사합니다. |
int | hashCode() | 문자열의 해시 코드를 반환합니다. |
int | indexOf(int ch) | 문자열에서 인자로 명시된 문자가 처음 나타나는 인덱스를 반환합니다. |
int | indexOf(int ch, int fromIndex) | 문자열에서 특정 인덱스 이후에 인자로 명시된 문자가 처음 나타나는 인덱스를 반환합니다. |
int | indexOf(String str) | 문자열에서 인자로 명시된 문자열이 부분 문자열로 처음 등장하는 위치의 인덱스를 반환합니다. |
int | indexOf(String str, int fromIndex) | 문자열에서 특정 인덱스 이후에 인자로 명시된 문자열이 부분 문자열로 처음 등장하는 위치의 인덱스를 반환합니다. |
String | intern() | 문자열 객체의 canonical representation을 반환합니다. |
boolean | isEmpty() | length() 가 0인 경우 true 를 반환합니다. |
static String | join(CharSequence delimiter, Charsequence... elements) | Charsequence elements 의 복제본을 인자로 명시된 delimiter 의 복제본으로 이어붙인 새 String 을 반환합니다. |
static String | join(CharSequence delimiter, Iterable<? extends CharSequence> elements) | CharSequence elements 의 복제본을 인자로 명시된 delimiter 의 복제본으로 이어붙인 새 String 을 반환합니다. |
int | lastIndexOf(int ch) | 문자열에서 인자로 명시된 문자가 마지막으로 나타나는 위치의 인덱스를 반환합니다. |
int | lastIndexOf(int ch, int fromIndex) | 인자로 명시된 인덱스에서 시작해 역방향으로 탐색하여, 문자열에서 인자로 명시된 문자가 마지막으로 나타나는 위치의 인덱스를 반환합니다. |
int | lastIndexOf(String str) | 문자열에서 인자로 명시된 문자열이 부분 문자열로 마지막으로 나타나는 위치의 인덱스를 반환합니다. |
int | lastIndexOf(String str, int fromIndex) | 인자로 명시된 인덱스에서 시작해 역방향으로 탐색하여, 문자열에서 인자로 명시된 문자열이 부분 문자열로 마지막으로 나타나는 위치의 인덱스를 반환합니다. |
int | length() | 문자열의 길이를 반환합니다. |
boolean | matches(String regex) | 문자열이 주어진 정규 표현식과 일치하는지 아닌지를 확인합니다. |
int | offsetByCodePoints(int index, int codePointOffset) | codePointOffset 코드 포인트에 의해 주어진 index 로부터의 오프셋인 이 String 내의 인덱스를 반환합니다. |
boolean | regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) | 두 문자열 영역이 같은지 확인합니다. |
boolean | regionMatches(int toffset, String other, int ooffset, int len) | 두 문자열 영역이 같은지 확인합니다. |
String | replace(char oldchar, char newChar) | 문자열의 oldChar 를 newChar 로 대체한 결과 문자열을 반환합니다. |
String | replace(CharSequence target, CharSequence replacement) | target 시퀀스와 일치하는 부분 문자열을 인자로 명시된 시퀀스로 대체합니다. |
String | replaceAll(String regex, String replacement) | 주어진 정규 표현식과 일치하는 부분 문자열을 주어진 대체 문자열로 대체합니다. |
String | replaceFirst(String regex, String replacement) | 주어진 정규 표현식과 일치하는 첫 번째 부분 문자열을 주어진 대체 문자열로 대체합니다. |
String[] | split(String regex) | 주어진 정규 표현식과 일치하는 문자열 주위의 문자열들을 나눕니다. |
String[] | split(String regex, int limit) | 주어진 정규 표현식과 일치하는 문자열 주위의 문자열들을 나눕니다. |
boolean | startsWith(String prefix) | 문자열이 인자로 명시된 접두사로 시작하는지 확인합니다. |
boolean | startsWith(String prefix, int toffset) | 인자로 명시된 인덱스로 시작하는 부분 문자열이 인자로 명시된 접두사로 시작하는지 확인합니다. |
CharSequence | subSequence(int beginIndex, int endIndex) | 이 시퀀스의 부분 문자 시퀀스를 반환합니다. |
String | substring(int beginIndex) | 문자열의 부분 문자열을 반환합니다. |
String | substring(int beginIndex, int endIndex) | 문자열의 부분 문자열을 반환합니다. |
char[] | toCharArray() | 문자열을 새 문자 배열로 변환합니다. |
String | toLowerCase() | 기본 로케일 규칙을 사용하여 문자열의 모든 문자를 소문자로 변환합니다. |
String | toLowerCase(Locale locale) | 주어진 Locale 규칙을 사용하여 문자열의 모든 문자를 소문자로 변환합니다. |
String | toString() | 이 객체를 반환합니다. |
String | toUpperCase() | 기본 로케일 규칙을 사용하여 문자열의 모든 문자를 대문자로 변환합니다. |
String | toUpperCase(Locale locale) | 주어진 Locale 규칙을 사용하여 문자열의 모든 문자열을 대문자로 변환합니다. |
String | trim() | 문자열의 앞이나 뒤에 오는 화이트스페이스를 제거한 문자열을 반환합니다. |
static String | valueOf(boolean b) | boolean 인자의 문자열 표현을 반환합니다. |
static String | valueOf(char c) | char 인자의 문자열 표현을 반환합니다. |
static String | valueOf(char[] data) | char 배열 인자의 문자열 표현을 반환합니다. |
static String | valueOf(char[] data, int offset, int count) | char 배열 인자의 특정 부분 배열의 문자열 표현을 반환합니다. |
static String | valueOf(double d) | double 인자의 문자열 표현을 반환합니다. |
static String | valueOf(float f) | float 인자의 문자열 표현을 반환합니다. |
static String | valueOf(int i) | int 인자의 문자열 표현을 반환합니다. |
static String | valueof(long l) | long 인자의 문자열 표현을 반환합니다. |
static String | valueOf(Object obj) | Object 인자의 문자열 표현을 반환합니다. |
일부 메서드의 추가 설명입니다.
intern()
Oracle docs의 설명에 다음과 같은 부분이 있습니다.
A pool of strings, initially empty, is maintained privately by the class String.
초기에 비어 있으면서
String
클래스에 의해 내부적으로 관리되는 문자열 풀.
intern()
메서드가 호출되면 먼저 이 풀에 해당 문자열과 동일한(equals()
메서드의 반환값이 true
인) 문자열을 찾습니다. 동일한 문자열을 찾은 경우, 찾은 문자열의 참조를 반환하고, 찾지 못한 경우 이 문자열을 풀에 추가하고 이 문자열 객체를 반환합니다.
위의 과정을 intern이라고 부릅니다.
String
클래스가 불변 객체이기 때문에 가능한 최적화 기법 중의 하나라고 할 수 있습니다.
한번 생성된 String
객체는 불변이기 때문에 한 객체가 여러 번 사용되거나 동시에 사용될 수 있습니다.
즉, 같은 문자열이 서로 다른 곳에서 여러 번 사용된다면 굳이 매번 새로운 객체를 만들 필요 없이 동일한 객체 하나를 사용하면 메모리 절약에 도움이 되겠죠.
때문에 String
클래스는 내부적으로 이러한 문자열 상수들을 모아놓은 풀(pool)을 갖게 됩니다.
String
객체를 생성하는 방법은 크게 두 가지로 볼 수 있는데,
String str = "This is Java";
new
연산자를 이용한 생성: String str = new String("This is Java");
Java language specification, Java SE 9 Edition 의 문자열 리터럴에 관한 설명에서 다음과 같은 부분을 볼 수 있습니다.
Moreover, a string literal always refers to the same instance of class String. This is because string literals - or, more generally, strings that are the values of constant expressions (§15.28) - are “interned” so as to share unique instances, using the method String.intern.
추가로, 문자열 리터럴은 언제나 String 클래스의 동일한 인스턴스를 참조합니다. 문자열 리터럴들(혹은, 보다 일반적으로 상수 표현식의 값인 문자열들)은 공통의 인스턴스를 공유하기 위해 String.intern 메서드를 사용하여 “intern”되기 때문입니다.
문자열 리터럴을 이용하여 String
객체를 참조하는 과정에서는 암묵적으로 해당 문자열 리터럴을 intern하는 과정이 있다고 볼 수 있습니다. 즉, 동일한 리터럴을 이용하여 String
객체를 여러번 생성해도 실제로 생성되는 String
객체는 하나 뿐인 것이죠.
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1.equals(str2)); // true
System.out.println(str1 == str2); // true
하지만 new
연산자를 이용하면 명시적으로 새로운 객체를 생성해 힙에 할당하게 됩니다.
String str1 = "Hello";
String str2 = new String("Hello");
System.out.println(str1.equals(str2)); // true
System.out.println(str1 == str2); // false
System.out.println(str1 == str2.intern()); // true
위의 코드에서 new
연산자를 통해 생성한 str2
는 명확히 str1
과 다른 객체입니다.
str2.intern()
의 반환값은 str1
을 생성하면서 풀에 추가된 String
객체이므로 str1
과 같은 객체를 참조하게 됩니다.
offsetByCodePoints(int index, int codePointOffset)
문자열의 index
에서부터 지정된 오프셋 만큼 이동한 인덱스를 반환합니다.
대부분의 유니코드 문자들은 한 글자가 2바이트(16비트)인 UTF-16으로 표현이 가능하지만 UTF-16으로 표현 가능한 범위를 벗어난 UTF-32로 표현해야 하는 문자들은 두 개의 UTF-16 문자를 사용하여 표현하게 됩니다.
예를 들어, UTF-32 문자 중에는 높은음자리표 기호()가 있습니다.
코드로는 다음과 같이 사용할 수 있습니다.
System.out.println("\u007a"); // z
System.out.println("\u6c34"); // 水
System.out.println("\uD834\uDD1E"); // 높은음자리표
때문에 UTF-32가 포함된 문자열에서는 코드 포인트 단위로 인덱스를 이동하게 되면 UTF-32 문자에 대해서는 2개의 인덱스를 이동해야 하는 경우가 생깁니다.
예시:
String strUTF8 = "\u007a\u007a\u007a\u007a\u007a";
String strUTF16 = "\u6c34\u6c34\u6c34\u6c34\u6c34";
String strUTF32 = "\uD834\uDD1E\uD834\uDD1E\uD834\uDD1E";
System.out.println(strUTF8.offsetByCodePoints(0, 2)); // == 2
System.out.println(strUTF16.offsetByCodePoints(0, 2)); // == 2
System.out.println(strUTF32.offsetByCodePoints(0, 2)); // == 4
위의 코드에서 strUTF8
과 strUTF16
의 문자는 코드 포인트 가 1개 인덱스를 차지하기 때문에 결과가 2지만 strUTF32
에 대해서는 각 문자가 2개의 인덱스를 차지하기 때문에 4를 반환하게 됩니다.