[기본 개념] 4 | (1.3) String 클래스의 메서드

728x90

[기본 개념] 4 | (1.3) String 클래스의 메서드

1 Object클래스

2> String클래스

3 StringBuffer클래스와 StringBuilder클래스

4 Math클래스

5 래퍼(wrapper)클래스

2. String클래스

변경 불가능한(immutable)클래스

 String클래스에는 문자열을 저장하기 위해 문자형 배열 참조변수(char[ ]) value를 인스턴스 변수로 정의해놓고 있다. 인스턴스 생성 시 생성자의 매개변수로 입력받는 문자열은 이 인스턴스변수(value)에 문자형 배열(char[ ])로 저장되는 것이다.

 

public final class String implements java.io.Serializable, Comparable {

        private char[ ] value ;

                 . . .

 

한번 생성된 String인스턴스가 갖고 있는 문자열을 읽어올 수만 있고 변경할 수는 없다.

 

 덧셈 연산자 '+'를 사용해서 문자열을 결합하면 문자열이 바뀌는 것이 아니라 새로운 문자열을 가진 String인스턴스가 생성되어 메모리 공간을 차지한다. 따라서 문자열간의 결합이나 추출 등 문자열을 다루는 작업이 많이 필요한 경우는 저장된 문자열 변경이 가능한 StringBuffer클래스를 사용하는 것이 좋다.

 

문자열 비교

 문자열을 만드는 방법은 문자열 리터럴을 지정하는 방법과 String클래스의 생성자를 사용해서 만드는 방법이 있다.

 

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인스턴스가 생성된다. 그러나 문자열 리터럴은 이미 존재하는 것을 재사용하는 것이다.

(문자열 리터럴은 클래스가 메모리에 로드될 때 자동적으로 미리 생성된다.)

 

 equals( )를 사용했을 때는 두 문자열의 내용("abc")을 비교하기 때문에 모두 true를 결과로 얻는다. 하지만, 각 String인스턴스의 주소를 등가 비교 연산자'=='로 비교했을 때는 결과가 다르다.

 

문자열 리터럴

 자바 소스파일에 포함된 모든 문자열 리터럴은 컴파일 시에 클래스 파일에 저장된다. 문자열 리터럴도 String인스턴스이고, 한번 생성하면 내용을 변경할 수 없으니 하나의 인스턴스를 공유하면 되기 때문에 같은 내용의 문자열 리터럴은 한 번만 저장된다.

 

        String s1 = "AAA" ;

        String s2 = "AAA" ;

        String s3 = "AAA" ;

 

 위의 코드를 실행하면 "AAA"를 담고 있는 String인스턴스가 하나 생성된 후, 참조변수 s1, s2, s3는 모두 이 String인스턴스를 참조하게 된다.

 

빈 문자열(empty string)

길이가 0인 배열을 내부적으로 가지고 있는 문자열이 바로 빈 문자열이다.

 

String s = "" ;

 

 위와 같은 문장이 있을 때, 참조변수 s가 참조하고 있는 String인스턴스는  내부에 'new char[0]'과 같이 길이가 0인 char형 배열을 저장하고 있는 것이다. 그렇지만 'char c = '' ;'에서 char형 변수는 하나의 문자를 지정해야 하므로 불가능하다. (char c = ' ' ; 은 가능)

 

 String은 참조형 타입의 기본값인 null보다 빈 문자열로, char형은 기본값인 '\u0000'대신 공백으로 초기화하는 것이 보통이다.

 

길이가 0이긴 해도 배열이 생성되며 생성된 배열의 주소값이 참조변수에 저장된다.

 

String클래스의 생성자와 메서드

String클래스 내에 정의된 생성자와 메서드의 목록이다.

 

메서드 / 설명 예제 결과
String(String s) String s = new String("Hello") ; s = "Hello"
주어진 문자열(s)를 갖는 String인스턴스를 생성한다.
String(char[ ] value) char[ ] c = {'H', 'e', 'l', 'l', 'o'} ;
String s = new String(c) ;
s = "Hello"
주어진 문자열(value)를 갖는 String인스턴스를 생성한다.
String(StringBuffer buf) StringBuffer sb = new StringBuffer("Hello") ;
String s = new String(sb) ;
ss = "Hello"
StringBuffer인스턴스가 갖고 있는 문자열과 같은 내용의 String인스턴스를 생성한다.
char charAt(int index) String s = "Hello" ;
String n = "0123456" ;
char c = s.charAt(1) ;
char c2 = n.charAt(1) ;
c = 'e'
c2 = '1'
지정된 위치(index)에 있는 문자를 알려준다.
int compareTo(String str) int i = "aaa".compareTo("aaa") ;
int i2 = "aaa".compareTo("bbb") ;
int i3 = "bbb".compareTo("aaa") ;
i = 0
i2 = -1
i3 = 1
문자열(str)과 사전순서로 비교한다. 
같으면, 0을 사전순으로 이전이면 음수를, 이후면 양수를 반환한다.
String concat(String str) String s = "Hello" ;
String s2 = s.concat(" World") ;
s2 = "Hello World"
문자열(str)를 뒤에 덧붙인다.
boolean contains(CharSequence s) String file = "abcdefg" ;
boolean b = s.contains("bc") ;
b = true
지정된 문자열(s)이 포함되었는지 검사한다.
boolean endsWith(String suffix) String file = "Hello.txt" ;
boolean b = file.endsWith("txt") ;
b = ture
지정된 문자열(suffix)로 끝나는지 검사한다.
boolean equals(Object obj) String s = "Hello" ;
boolean b = s.equals("Hello") ;
boolean b2 = s.equals("hello") ;
b = true
b2 = false
매개변수로 받은 문자열(obj)과 String인스턴스의 문자열을 비교한다.
obj가 String이 아니거나 문자열이 다르면 false를 반환한다.
boolean equalsIgnoreCase(String str) String s = "Hello" ;
boolean b = s.equalsIsIgnoreCase("HELLO") ;
boolean b2 = s.equalsIsIgnoreCase("hello")
b = true
b2 = true
문자열과 String인스턴스의 문자열을 대소문자 구분없이 비교한다.
int indexOf(int ch) String s = "Hello" ;
int idx1 = s.indexOf('o') ;
int idx2 = s. indexOf('k') ;
idx1 = 4
idx2 = -1
주어진 문자(ch)가 문자열에 존재하는지 확인하여 위치(index)를 알려준다.
못 찾으면 -1을 반환한다.
int indexOf(int ch, int pos) String s = "Hello" ;
int idx1 = s.indexOf('e', 0) ;
int idx2 = s.indexOf('e', 2) ;
idx1 = 1
idx2 = -1
주어진 문자(ch)가 문자열에 존재하는지 지정된 위치(pos)부터 확인하여 위치(index)를 알려준다.
못찾으면 -1을 반환한다.
int indexOf(String str) String s = "ABCDEFG" ;
int idx = s.indexOf("CD") ;
idx = 2
주어진 문자열(str)이 존재하는지 확인하여 그 위치(index)를 알려준다.
없으면 -1을 반환한다.
String intern( ) String s = new String("abc") ;
String s2 = new String("abc") ;
boolean b = (s == s2) ;
boolean b2 = s. equals(s2) ;
boolean b3 = (s.intern( ) == s2.intern( )) ;
b = false
b2 = true
b3 = true
문자열을 상수풀(constant pool)에 등록한다.
이미 상수풀에 같은 내용의 문자열이 있을 경우 그 문자열의 주소값을 반환한다.
int lastIndexOf(int ch) String s = "java.lang.Object" ;
int idx1 = s.lastIndexOf('.') ;
int idx2 = s.indexOf('.') ;
idx1 = 9
idx2 = 4
지정된 문자 또는 문자코드를 문자열의 오른쪽 끝에서부터 찾아서 위치(index)를 알려준다.
못 찾으면 -1을 반환한다.
int lastIndexOf(String str) String s = "java.lang.Object" ;
int idx1 = s.lastIndexOf("java") ;
int idx2 = s.indexOf("java") ;
idx1 = 10
idx2 = 0
지정된 문자열을 인스턴스의 문자열 끝에서부터 찾아서 위치(index)를 알려준다.
못 찾으면 -1을 반환한다.
int length( ) String s = "Hello" ;
int length = s.length( ) ;
length = 5
문자열의 길이를 알려준다.
String replace(char old, char nw) String s = "Hello" ;
String s1 = s.replace('H', 'C') ;
s1 ="Celllo"
문자열 중의 문자(old)를 새로운 문자(nw)로 바꾼 문자열을 반환한다.
String replace(CharSequence old, CharSequence nw) String s = "Hellollo" ;
String s1 = s.replace("ll", "LL") ;
s1 = "HeLLoLLo"
문자열 중의 문자열(old)을 새로운 문자열(nw)로 모두 바꾼 문자열을 반환한다.
String replaceAll(String regex, String replacement) String ab = "AABBAABB" ;
String r = ab.replaceAll("BB", "bb") ;
r = "AAbbAAbb"
문자열 중에서 지정된 문자열(regex)과 일치하는 것을 새로운 문자열(replacement)로 모두 변경한다.
String replaceFirst(String regex, String replacement) String ab ="AABBAABB" ;
String r = ab.replaceFirst("BB", "bb") ;
r = "AAbbAABB"
문자열 중에서 지정된 문자열(regex)과 일치하는 것 중, 첫 번째 것만 새로운 문자열(replacement)로 변경한다.
String[ ] split(String regex) String animals = "dog, cat, bear" ;
String [ ] arr = animals.split(",") ;
arr[0] = "dog"
arr[1] = "cat"
arr[2] = "bear"
문자열을 지정된 분리자(regex)로 나누어 문자열 배열에 담아 반환한다.
String[ ] split(String regex, int limit) String animals ="dog, cat, bear" ;
String[ ] arr = animals.split(",", 2) ;
arr[0] = "dog"
arr[1] = "cat, bear"
문자열을 지정된 분리자(regex)로 나누어 문자열 배열에 담아 반환한다.
단, 문자열 전체를 지정된 수(limit)로 자른다.
boolean startsWith(String prefix) String s = "java.lang.Object" ;
boolean b = s.startsWith("java") ;
boolean b2 = s.startsWith("lang") ;
b = true
b2 = false
주어진 문자열(prefix)로 시작하는지 검사한다.
String substring(int begin)
String substring(int begin, int end)
String s = "Hello" ;
String c = s.substring(10) ;
String p = s.substring(5, 9) ;
c = "Object" ;
p = "lang" ;
주어진 시작위치(begin)부터 끝위치(end)범위에 포함된 문자열을 얻는다.
이때, 시작위치의 문자는 범위에 포함되지만, 끝위치의 문자는 포함되지 않는다.
String toLowerCase( ) String s = "Hello" ;
String s1 = s.toLowerCase( ) ;
s1 = "hello"
String인스턴스에 저장되어 있는 모든 문자열을 소문자로 변환하여 반환한다.
String toString( ) String s = "Hello" ;
String s1 = s.toLowerCase( ) ;
s1 = "Hello"
String인스턴스에 저장되어 있는 문자열을 반환한다.
String toUpperCase( ) String s = "Hello" ;
String s1 = s.toUpperCase( ) ;
s1 = "HELLO"
String인스턴스에 저장되어 있는 모든 문자열을 대문자로 변환하여 반환한다.
String trim( ) String s = "    Hello World    " ;
String s1 = s. trim( ) ;
s1 = "Hello World"
문자열의 왼쪽 끝과 오른쪽 끝에 있는 공백을 없앤 결과를 반환한다.
이때, 문자열 중간에 있는 공백은 제거되지 않는다.
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)
String b = String.valueOf(true) ;
String c = String.valueOf(true) ;
String i = String.valueOf(true) ;
String l = String.valueOf(true) ;
String f = String.valueOf(true) ;
String d = String.valueOf(true) ;
java.util.Date dd = new java.util.Date( ) ;
String date = String.valueOf(dd) ;
b = "true"
c = "a"
i = "100"
l = "100"
f = "10.0"
d = "10.0"
date = "Wed Jan 27
21:26:29 KST 2021"
지정된 값을 문자열로 변환하여 반환한다.
참조변수의 경우, toString( )을 호출한 결과를 반환한다.

 

join( )과 StringJoiner

join( )은 여러 문자열 사이에 구분자를 넣어서 결합한다. split( )와 반대 작업을 한다.

 

String animals = "dog, cat, bear" ;

String[ ] arr     = animals.split(",") ;              // 문자열을 ','를 구분자로 나눠서 배열에 저장

String str        = String.join("-", arr) ;            // 배열의 문자열 '-'로 구분해서 결합

System.out.println(str) ;                                 // dog-cat-bear

 

java.utill.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]

 

String.format( )

format( )은 형식화된 문자열을 만들어내는 간단한 방법이다. printf( )하고 사용법이 완전히 똑같다.

 

String str = String.format("%d 더하기 %d는 %d입니다.", 3, 5, 3 + 5) ;

System.out.println(str) ;   // 3 더하기 5는 8입니다.

 

기본형 값을 String으로 변환

 기본형을 문자열로 변경하는 방법은 숫자에 빈 문자열" "을 더해주면 된다. 이 외에도 valueOf( )를 사용하는 방법도 있다. 성능 향상이 필요한 경우에 valueOf( )를 작성하고 간단하고 편한 빈 문자열을 쓰면 된다.

 

int i = 100 ;

String str1 = i + "" ;                             // 100을 "100"으로 변환하는 방법 1

String str2 = String.valueOf(i) ;     // 100을 "100"으로 변환하는 방법 2

 

(참조변수에 String을 더하면, 참조변수가 가리키는 인스턴스의 toString( )을 호출하여 String을 얻은 다음 결합한다.)

 

String을 기본형 값으로 변형

반대로 String을 기본형으로 바꾸는 방법은 valueOf( )를 쓰거나 parseInt( )를 사용하면 된다.

 

int i   = Integer.parseInt("100") ;      // "100"을 100으로 변환하는 방법 1

int i2 = Integer.valueOf("100") ;      // "100"을 100으로 변환하는 방법 2

 

(원래 valueOf( )의 반환타입은 Integer인데, 오토박싱(auto-boxing)에 의해 Integer가 int로 자동 변환된다.)

 

기본형 ---> 문자열 문자열 ---> 기본형

    String  String.valueOf(boolean b)
    String  String.valueOf(char c)
    String  String.valueOf(int i)
    String  String.valueOf(long l)
    String  String.valueOf(float f)
    String  String.valueOf(double d)
    

    boolean  Boolean.parseBoolean(String s)
    byte            Byte.parseBoolean(String s)
    short         Short.parseBoolean(String s)
    int                Int.parseBoolean(String s)
    long           Long.parseBoolean(String s)
    float           Float.parseBoolean(String s)
    double     Double.parseBoolean(String s)

 

 

 

 

 

 

출처 | Java의 정석 (남궁 성)

728x90