1. String 클래스
▶ String클래스는 문자열을 저장하고 이를 다루는데 필요한 메서드를 제공한다.
(1) 변경 불가능한(immutable) 클래스
▶ String 클래스에는 문자열을 저장하기 위해 문자형 배열 변수(char[]) value를 인스턴스 변수로 정의해놓고 있으며,
인스턴스 생성 시 생성자의 매개변수로 입력받는 문자열은 이 인스턴스 변수(value)에 문자형 배열(char[])로 저장된다.
▶ 한번 생성된 String 인스턴스가 갖고 있는 문자열은 읽어 올 수만 있고, 변경은 불가능하다.
▶ 덧셈연산자 '+'를 사용해서 문자열을 결합하는 것은 매 연산 시 마다 새로운 문자열을 가진 String 인스턴스가 생성된다.
▶ StringBuffer 인스턴스에 저장된 문자열은 변경이 가능하므로 문자열간의 결합이나 추출 등 문자열을 다루는 작업이 많이 필요한 경우에는 String 클래스 대신 StringBuffer 클래스를 사용하는 것이 좋음
※ 참고) String 클래스는 앞에 final이 붙어 있으므로 다른 클래스의 조상이 될 수 없다.
(2) 문자열의 비교
◆ 문자열 만드는 방법
1. 문자열 리터럴을 지정하는 방법 : 문자열 리터럴은 클래스가 메모리에 로드될 때 자동적으로 미리 생성된다.
예) String str1 = "abc"; // 문자열 리터럴 "abc"의 주소가 str1에 저장됨
String str2 = "abc"; // 문자열 리터럴 "abc"의 주소가 str2에 저장됨
str1 == str2 -> true
str1.equals(str2) -> true
2. String 클래스의 생성자를 사용해서 만드는 방법 : new연산자에 의해 메모리할당이 이루어지기 때문에 항상 새로운 String 인스턴스가 생성된다.
예) String str3 = new String("abc"); // 새로운 String 인스턴스를 생성
String str4 = new String("abc"); // 새로운 String 인스턴스를 생성
str3 == str4 -> false
str3.equals(str4) -> true
(3) 문자열 리터럴
▶ 자바 소스파일에 포함된 모든 문자열 리터럴은 컴파일 시에 클래스 파일에 저장된다.
▶ 문자열 리터럴도 String 인스턴스이고, 한번 생성하면 내용을 변경할 수 없기 때문에 같은 내용의 문자열 리터럴은 한번만 저장된다.
▶ 클래스 파일이 클래스 로더에 의해 메모리에 올라갈 때, 리터럴의 목록에 있는 리터럴들이 JVM내에 있는 '상수 저장소(constant pool)'에 저장된다.
(4) 빈 문자열(empty string)
▶ 빈 문자열은 char형 배열 길이가 0인 배열이다.
▶ String s = ""; 에서 참조변수 s가 참조하고 있는 String 인스턴스는 내부에 'new char[0]'과 같이 길이가 0인 char형 배열을 저장하고 있는 것이다.
▶ char형 변수에는 반드시 하나의 문자를 지정해야한다. (char c = ''; (x))
▶ 일반적으로 String은 참조형 타입의 기본값인 null보다는 빈 문자열로 초기화하고,
char형은 기본값인 '\u0000' 대신 공백으로 초기화한다.
※ '\u0000'은 유코드의 첫 번째 문자로써 아무런 문자도 지정되지 않은 빈 문자이다.
(5) String 클래스의 생성자와 메서드
메서드 | 설명 |
String(String s) | 주어진 문자열(s)을 갖는 String인스턴스를 생성한다. |
String(char[] value) | 주어진 문자열(value)을 갖는 String인스턴스를 생성한다. |
String(StringBuffer buf) | StringBuffer인스턴스가 갖고 있는 문자열과 같은 내용의 String인스턴스를 생성한다. |
char charAt(int index) | 지정된 위치(index)에 있는 문자를 알려준다. (index는 0부터 시작) |
int compareTo(String str) | 문자열(str)과 사전순서로 비교한다. 같으면 0, 사전순으로 이전이면 음수를, 이후면 양수를 반환한다. |
String concat(String str) | 문자열(str)을 뒤에 덧붙인다. |
boolean contains(CharSequence s) | 지정된 문자열(s)이 포함되었는지 검사한다. |
boolean endsWith(String suffix) | 지정된 문자열(suffix)로 끝나는지 검사한다. |
boolean equals(Object obj) | 매개변수로 받은 문자열(obj)과 String인스턴스의 문자열을 비교한다. obj가 String이 아니거나 문자열이 다르면 false를 반환한다. |
boolean equalsIgnoreCase(String str) | 문자열과 String인스턴스의 문자열을 대소문자 구분없이 비교한다. |
int indexOf(int ch) | 주어진 문자(ch)가 문자열에 존재하는지 확인하여 위치(index)를 알려준다. 못 찾으면 -1을 반환한다. (index는 0부터 시작) |
int indexOf(int ch, int pos) | 주어진 문자(ch)가 문자열에 존재하는지 지정된 위치(pos)부터 확인하여 위치(index)를 알려준다. 못 찾으면 -1을 반환한다. (index는 0부터 시작) |
int indexOf(String str) | 주어진 문자열이 존재하는지 확인하여 그 위치(index)를 알려준다. 없으면 -1을 반환한다. (index는 0부터 시작) |
String intern() | 문자열을 상수풀(constant pool)에 등록한다. 이미 상수풀에 같은 내용의 문자열이 있을 경우 그 문자열의 주소값을 반환한다. |
int lastIndexOf(int ch) | 지정된 문자 또는 문자코드를 문자열의 오른쪽 끝에서부터 찾아서 위치(index)를 알려준다. 못 찾으면 -1을 반환한다. |
int lastIndexOf(String str) | 지정된 문자열을 인스턴스의 문자열 끝에서부터 찾아서 위치(index)를 알려준다. 못 찾으면 -1을 반환한다. |
int length() | 문자열의 길이를 알려준다. |
String replace(char old, char nw) | 문자열 중의 문자(old)를 새로운 문자(nw)로 바꾼 문자열을 반환한다. |
String replace(CharSequence old, CharSequence nw) | 문자열 중의 문자열(old)를 새로운 문자열(nw)로 모두 바꾼 문자열을 반환한다. |
String replaceAll(String regex, String replacement) | 문자열 중에서 지정된 문자열(regex)과 일치하는 것을 새로운 문자열(replacement)로 변경한다. |
String replaceFirst(String regex, String replacement) | 문자열 중에서 지정된 문자열(regex)과 일치 하는 것 중, 첫 번째 것만 새로운 문자열(replacement)로 변경한다. |
String[] split(String regex) | 문자열을 지정된 분리자(regex)로 나누어 문자열 배열에 담아 반환한다. |
String[] split(String regex, int limit) | 문자열을 지정된 분리자(regex)로 나누어 문자열 배열에 담아 반환한다. 단, 문자열 전체를 지정된 수(limit)로 자른다. |
boolean startsWith(String prefix) | 주어진 문자열(prefix)로 시작하는지 검사한다. |
String substring(int begin) String substring(int begin, int end) |
주어진 시작위치(begin)부터 끝 위치(end) 범위에 포함된 문자열을 얻는다. 이 때, 시작위치의 문자는 범위에 포함되지만, 끝 위치의 문자는 포함되지 않는다. (begin ≦ x < end) |
String toLowerCase() | String인스턴스에 저장되어 있는 모든 문자열을 소문자로 변환하여 반환한다. |
String toString() | String인스턴스에 저장되어 있는 문자열을 반환한다. |
String toUpperCase() | String인스턴스에 저장되어 있는 모든 문자열을 대문자로 변환하여 반환한다. |
String trim() | 문자열의 왼쪽 끝과 오른쪽 끝에 있는 공백을 없앤 결과를 반환한다. 이 때 문자열 중간에 있는 공백은 제거되지 않는다. |
static String valueOf(boolean b) static String valueOf(char c) static String valueOf(int i) static String valueOf(long l) static String valueOf(float f) static String valueOf(double d) static String valueOf(Object o) |
지정된 값을 문자열로 변환하여 반환한다. 참조변수의 경우, toString()을 호출한 결과를 반환한다. |
(6) join()과 StringJoiner
▶ join()은 여러 문자열 사이에 구분자를 넣어서 결합한다.
예) String str = String.join("-", {"aaa", "bbb", "ccc"}; // 배열의 문자열을 '-'로 구분해서 결합
System.out.println(str); // aaa-bbb-ccc
▶ StringJoiner클래스를 사용해서 문자열을 결합 (여러 문자열 사이에 구분자를 넣어서 결합할 수 있으며, prefix(접두사)와 suffix(접미사)도 붙일 수 있다.
예) StringJoiner sj = new StringJoiner("/", "[", "]"); // 배열의 문자열을 '/'로 구분해서 결합, prefix '[', suffix ']'
sj.add("aaa");
sj.add("bbb");
sj.add("ccc");
System.out.println(sj.toString()); // [aaa/bbb/ccc]
(7) 유니코드의 보충문자
◆ String클래스의 메서드 중 매개변수의 타입이 char인 것들이 있고, int인 것들도 있는 이유?
- 원래 유니코드는 16비트 문자체계이지만 20비트로 확장하게 되어 하나의 문자를 char타입으로 다루지 못하고, int타입으로 다루게 됨
- 유니코드 확장에 의해 새로 추가된 문자들을 '보충 문자(supplementary characters)'라고 한다.
- 메서드에서 매개변수가 'int ch'인 것들은 보충문자를 지원하는 것이고, 'char ch'인 것들은 지원하지 않는 것들이다.
(8) 문자 인코딩 변환
▶ getBytes(String charsetName)를 사용하면 문자열의 문자 인코딩을 다른 인코딩으로 변경할 수 있다.
(9) String.format()
▶ 형식화된 문자열을 만들어내는 간단한 방법
▶ printf()하고 사용법이 같다.
예) String str = String.format("%d 더하기 %d는 %d입니다.", 3, 5, 3+5);
System.out.println(str); // 3 더하기 5는 8입니다.
(10) 기본형 값을 String으로 변환
▶ 숫자에 빈 문자열 " "을 더하기
▶ valueOf() 메서드 사용하기
▶ 빈 문자열을 더하는 방법이 간단하지만 성능은 valueOf()가 더 좋음
(11) String을 기본형 값으로 변환
▶ valueOf() 메서드 사용하기
예) int i2 = Integer.valueOf("100");
▶ valueOf()의 반환 타입은 Integer인데 오토박싱(autoboxing)에 의해 Integer가 int로 자동 변환된다.
▶ parseInt() 메서드 사용하기
예) int i = Integer.parseInt("100");
▶ parseInt()나 parseFloat() 같은 메서드는 문자열에 공백 또는 문자가 포함되어 있는 경우 변환 시 예외(NumberFormat Exception)가 발생할 수 있으므로 주의해야 한다.
<기본형과 문자열 간의 변환 방법>
기본형 -> 문자열 | 문자열 -> 기본형 |
String String.valueOf(boolean b) | boolean Boolean.parseBoolean(String s) |
String String.valueOf(char c) | byte Byte.parseByte(String s) |
String String.valueOf(int i) | short Short.parseShort(String s) |
String String.valueOf(long l) | int Integer.parseInt(String s) |
String String.valueOf(float f) | long Long.parseLong(String s) |
String String.valueOf(double d) | float Float.parseFloat(String s) |
double Double.parseDouble(String s) |
'프로그래밍 > JAVA' 카테고리의 다른 글
[ JAVA ] 형식화 클래스 (0) | 2022.12.20 |
---|---|
[ JAVA ] Calendar와 Date (0) | 2022.12.20 |
[ JAVA ] java.lang 패키지 - Object클래스 (0) | 2022.11.26 |
[ JAVA ] 인터페이스(interface) (0) | 2022.10.29 |
[ JAVA ] 오버라이딩(overriding) (0) | 2022.10.09 |