본문 바로가기

프로그래밍/JAVA

[ JAVA ] java.lang 패키지 - String클래스

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