String Class
기존에 다른 언어에서는 문자열을 char형의 배열로 다루었으나 자바에서는 문자열을 위한 클래스를 제공한다.
String클래스는 문자열을 저장하고 이를 다루는데 필요한 메서드를 제공한다.
변경 불가능한(immutable) 클래스
String클래스에는 문자열을 저장하기 위해서 문자형 배열 변수(char[]) value를 인스턴스 변수로 정의해놓고 있다.
인스턴스 생성 시 생성자의 매개변수로 입력받는 문자열은 이 인스턴스변수(value)에 문자형 배열(char[])로 저장되는 것이다.
public final class String implements ... {
private char[] value;
...
}
한번 생성된 String 인스턴스가 갖고 있는 문자열은 읽어 올 수만 있고, 변경할 수는 없다.
연산자를 이용해서 문자열을 결합하는 경우 인스턴스내의 문자열이 바뀐는 것이 아니라 새로운 문자열이 담긴 String인스턴스가 생성되는 것이다.
연산 시 마다 새로운 문자열을 가진 String인스턴스가 생성되어 메모리 공간을 차지하게 되므로 가능한 결합횟수를 줄이는 것이 좋다.
문자열을 다루는 작업이 많이 필요한 경우 String클래스 대신 StringBuffer클래스를 사용하는 것이 좋다.
StringBuffer인스턴스에 저장된 문자는 변경이 가능하므로 하나의 StringBuffer인스턴스만으로도 문자열을 다루는 것이 가능하다.
문자열을 비교
문자열을 만들 때는 두 가지 방법, 문자열 리터럴을 지정하는 방법과 String클래스의 생성자를 사용해서 만드는 방법이 있다.
String클래스의 생성자를 이용한 경우에는 new연산자에 의해서 메모리 할당이 이루어지기 때문에 항상 새로운 String인스턴스가 생성된다.
그러나 문자열 리터럴은 이미 존재하는것을 재사용하는 것이다.
String str1 = "abc"; // 문자열 리터럴 "abc"의 주소가 str1에 저장됨
String str2 = new String("abc") // 새로운 String인스턴스를 생성
str1.equals(str2); // true
str1 == str2 // false
문자열 리터럴
자바 소스파일에 포함된 모든 문자열 리터럴은 컴파일 시에 클래스 파일에 저장된다.
이때 같은 내용의 문자열 리터럴은 한번만 저장된다.
문자열 리터럴도 String인스턴스이고, 한번 생성하면 내용을 변경할 수 없기 때문에 하나의 인스턴스를 공유하면 되기 때문이다.
빈 문자열(empty string)
빈 문자열은 String인스턴스 내부에 new char[0]과 같이 길이가 0인 char 배열을 저장하고 있다.
String str = ""; // new char[0]
String클래스의 생성자와 메서드
join()과 StringJoiner
join()은 여러 문자열 사이에 구분자를 넣어서 결합한다.
구분자로 문자열을 자르는 split()과 반대의 작업을 한다.
String animals = "dog,cat,bear";
String[] animalArr = animals.split(",");
String animalStr = String.join("-", animalArr);
System.out.println(animalStr); // dog-cat-bear
java.util.StringJoiner클래스를 사용해서 문자열을 결합할 수도 있다.
StringJoiner sj = new StringJoiner(",", "[", "]")
String[] strArr = {"aaa", "bbb", "ccc"};
for (String std : strArr) {
sj.add(s.toUpperCase());
}
System.out.println(sj.toString()); // [AAA,BBB,CCC]
문자 인코딩 변환
getByte(String charsetName)를 사용하면, 문자열의 문자 인코딩을 다른 인코딩으로 변경할 수 있다.
자바가 UTF-16을 사용하지만, 문자열 리터럴에 포함되는 문자들은 OS의 인코딩을 사용한다.
한글 윈도우즈의 경우 문자 인코딩으로 CP949를 사용한다.
byte[] utf8_str = "가".getByte("UTF-8"); // UTF-8으로 인코딩 변경
String str = new String(utf8_str, "UTF-8") // byte배열을 문자열로 변환
String.format()
format()은 형식화된 문자열을 만들어내는 간단한 방법이다.
printf()하고 사용법이 완전히 똑같다.
String str = String.format("%d 더하기 %d는 %d입니다.", 3, 2, 5);
기본형 값을 String으로 변환
숫자로 이루어진 문자열을 숫자로, 또는 그 반대로 변환하는 경우가 자주 있다.
숫자에 빈 문자열("")을 더하거나, String.valueOf()를 사용하는 방법도 있다.
성능은 String.valueOf()가 더 좋다.
int num = 30;
String numStr1 = num + "";
String numStr2 = String.valueOf(num);
String을 기본형 값으로 변환
기본형 값을 String으로 변환시와 반대로 valueOf()를 쓰거나 parseInt()를 사용하면 된다.
두 메서드는 반환 타입만 다르지 같은 메서드이다.
parseInt()나 parseFloat()같은 메서드는 공백 또는 문자가 포함되어 있는 경우 변환 시 예외(NumberFormatException)가 발생할 수 있으므로 주의해야 한다.
String str = "30";
int strNum1 = Integer.valueOf(str);
int strNum2 = Integer.parseInt(str);
'Java' 카테고리의 다른 글
Java로 Slack 메세지 발송하기 (0) | 2021.11.23 |
---|---|
컬렉션 프레임워크(Collection Framework) (0) | 2021.09.30 |
Object Class (0) | 2021.09.30 |
연결된 예외(chained exception) (0) | 2021.09.30 |
예외 되던지기(exception re-throwing) (0) | 2021.09.27 |