String 클래스
문자형 배열(char[])과 그에 관련된 메서드들이 정의되어 있다.
public final class String implemnets java.io.Serializable, Comparable {
private char[] value;
...
}
String인스턴스가 가지고 있는 문자열은 읽어 올 수만 있고, 바꿀 수 없다.
문자열을 결합하는 것은 매 연산 시마다 새로운 String인스턴스가 생성되어 메모리 공간을 차지하므로 가능한 결합 횟수를 줄이는 것이 좋다.
문자열 결합이나 추출 등 문자열을 다루는 작업이 많이 필요한 경우 StringBuffer클래스를 사용하는 것이 좋다.
문자열 비교
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인스턴스가 생성된다. 반면 문자열 리터럴은 이미 존재하는 것을 재사용하는 것이다.
빈 문자열(empth string)
내용이 없는 문자열로, 크기가 0인 char형 배열을 저장하는 문자열이다.
String은 참조형 타입의 기본값은 null 보다는 빈 문자열로, char형은 기본값인 '\u0000' 대신 공백으로 초기화하는 것이 일반적이다.
String s = "";
char c = "";
join()과 StringJoiner
join은 여러 문자열 사이에 구분자를 넣어서 결합한다.
String animals = "dog,cat,bear";
String[] arr = animals.split(",");
String str = String.join("-", arr);
System.out.println(str); // dog-cat-bear
StringJoiner클래스를 사용해서 문자열을 결합할 수도 있다.
StringJoiner sj = new StringJoiner(",", "[", "]");
String[] strArr = {"aaa", "bbb", "ccc"};
for(String s : strArr)
sj.add(s.toUpperCase());
System.out.println(sj.toString()); // [AAA,BBB,CCC]
문자 인코딩 변환
getBytes(String charsetName)를 사용하면, 문자열의 문자 인코딩을 다른 인코딩으로 변경할 수 있다.
자바는 UTF-16을 사용하지만, 문자열 리터럴에 포함되는 문자들은 OS의 인코딩을 사용한다. 한글 윈도우즈는 CP949(MS949)를 사용한다
CP949를 UTF-8로 변경하려면 아래와 같이 한다.
byte[] utf8_str = "가".getBytes("UTF-8"); // 문자열을 UTF-8로 변환
String str = new String(utf8_str, "UTF-8"); // byte배열을 문자열로 변환
String.format()
printf()와 사용법이 같다.
String str = String.format("%d 더하기 %d는 %d입니다.", 3, 5, 3+5);
문자열과 기본형 간의 변환
기본형 값을 String으로 변환
방법 2가 더 빠르다.
int i = 100;
String str1 = i + ""; // 100을 "100"으로 변환하는 방법1
String str2 = String.valueOf(i); // 100을 "100"으로 변환하는 방법2.
String을 기본형 값으로 변환
int i = Integer.parseInt("100"); // "100"을 100으로 변환하는 방법1
int i2 = Integer.valueOf("100"); // "100"을 100으로 변환하는 방법1
valueOf는 반환타입이 Integer이다. 내부적으로 parseInt()를 호출할 뿐이므로, 두 메서드는 반환타입만 다르지 사실 같은 메서드이다.
StringBuffer 클래스
- String처럼 문자형 배열(char[])을 내부적으로 가지고 있다.
- String클래스와 달리 내용을 변경할 수 있다.
- 인스턴스를 생성할 때 버퍼(배열)의 크기를 충분히 지정해 주는 것이 좋다.
StringBuffer의 생성자
StringBuffer인스턴스를 생성할 때는 생성자 StringBuffer(int length)를 사용해서 저장될 문자열의 길이를 고려하여 충분히 여유 있는 크기로 지정하는 것이 좋다. 버퍼의 크기를 지정해주지 않으면 16개의 문자를 저장할 수 있는 크기의 버퍼를 생성한다.
StringBuffer의 변경
StringBuffer sb = new StringBuffer("abc");
sb.append("123");
StringBuffer sb2 = sb.append("ZZ");
System.out.println(sb);
System.out.println(sb2);
StringBuffer의 비교
StringBuffer클래스는 equals메서드를 오버라이딩하지 않았다.
toString()은 오버라이딩되어 있어서, StringBuffer인스턴스에 toString()을 호출해서 String인스턴스를 얻은 다음, 여기에 equals메서드를 사용해서 비교해야 한다.
String s = sb.toString();
String s2 = sb2.toString();
System.out.println(s.equals(s2)); // true
StringBuilder 클래스
StringBuffer는 멀티스레드에 안전하도록 동기화되어 있다. 이로 인해 성능이 떨어진다. 멀티스레드로 작성된 프로그램이 아닌 경우, StringBuffer의 동기화는 불필요하게 성능만 떨어뜨리게 된다.
그래서 StringBuffer에서 스레드의 동기화만 뺀 StringBuilder가 있다. StringBuilder는 StringBuffer와 완전히 똑같은 기능을 한다. 따라서 그냥 StringBuffer 대신 StringBuilder로 바꾸면 된다.
'JAVA' 카테고리의 다른 글
[java.lang] Wrapper 클래스, Number클래스 (0) | 2023.03.09 |
---|---|
[java.lang] Math 클래스 (0) | 2023.03.09 |
[java.lang] Object 클래스 (0) | 2023.03.09 |
예외처리 (0) | 2023.03.08 |
[OOP] 내부 클래스(inner class) (0) | 2023.03.08 |