String 클래스는 Java.lang 패키지로 제공되는 Java 문자열 클래스이다.

별도의 import 없이 사용이 가능한데, 아래와 같이 선언을 할 수 있다.

 

 

위 둘의 차이는 이후 알아보기로 하자.

String 클래스는 한 번 인스턴스가 생성되면 수정할 수 없다. (immutable object)

 

 

값의 변경은 불가능하지만, 새 String을 만들어 바꿀 수는 있다.

 

 

위 코드 중에서 char[]를 String으로 바꾸는 것에 주목해보자.

아래와 같이 2가지 방법으로 바꿀 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package String;
 
public class StringClass {
 
    public static void main(String[] args) {
        String str = "ABCDFFG";
        char[] temp_arr = str.toCharArray();
        System.out.println(temp_arr); // ABCDFFG
        temp_arr[4= 'E';
//        str = new String(temp_arr);
        str = String.valueOf(temp_arr);
        System.out.println(str); // ABCDEFG
    }
 
}
 
cs

 

즉, new String(char[] array) 혹은 String.valuOf(char[] array)를 이용!

 

그리고, 두 문자열이 같은지 비교하는 메서드로 equlas 메서드가 있는데, 왜 == 로는 비교를 할 수 없는지 살펴보자.

처음 String을 선언할 때 두 가지 방법이 있다는 것과 연결되는 내용이다.

 

 

두 방법의 차이는 리터럴로 선언하느냐, 인스턴스 객체를 생성하여 선언하느냐의 차이.

그 차이는 다음과 같다.

 

 

리터럴로 선언한 경우에는 두 변수가 같은 "text" 값을 가리키고 있다.

하지만, 인스턴스로 선언한 경우에는 서로 다른 객체를 생성하고 그 안에 "test"를 참조하고 있다.

따라서 아래와 같은 결과가 나타난다.

 

 

그러므로! String을 비롯한 primitive type이 아닌 경우에는 equals 메서드로 비교를 하도록 주의하자. 결국 코딩테스트를 준비하는 과정에서는 너무 당연하지만 ==  대신 equals를 써야하는 것에 주의하는 것이 중요하니까.

 

String 클래스가 제공하는 메서드들은 다양하지만, 그중 일부를 정리하자면,

 

 

 이어서 BOJ에서 문자열 관련 문제를 풀며 추가 정리하도록 하자.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package String;
 
public class String1 {
    public static void main(String[] args) {
        String s = "I like Java and Python and C.";
        System.out.println(s);
 
        // 문자열의 길이
        System.out.println(s.length()); // 29
 
        // 대소문자 변환
        System.out.println(s.toUpperCase()); // 대문자로
        System.out.println(s.toLowerCase()); // 소문자로
 
        // 포함 관계
        System.out.println(s.contains("Java")); // 포함된다면 true 포함되지 않는다면 false
        System.out.println(s.contains("C++"));
        // 위치 정보(맨 앞이 0부터 시작), Java 중 맨 앞 J는 7번째에 있다.
        System.out.println(s.indexOf("Java")); // 7
        System.out.println(s.indexOf("C#")); // 포함되지 않는 문자열이므로 -1 나온다.
        // 문자열의 마지막 글자의 위치 정보, and의 d의 위치
        System.out.println(s.lastIndexOf("and")); // 23
        // 특정한 문자열로 시작하는 지 확인
        System.out.println(s.startsWith("I like")); // 이 문자열로 시작하면 true
        System.out.println(s.endsWith(".")); // 이 문자열로 끝나면 true
 
    }
}
 
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package String;
 
public class String2 {
    public static void main(String[] args) {
        String s = "I like Java and Python and C.";
 
        // 문자열 변환
 
        // 위 문장을 "I like Java, Python, C."로 바꿔서 나타내고 싶다.
        System.out.println(s.replace(" and"", "));
        System.out.println(s); // 원래 문자열의 변화는 없음 // I like Java and Python and C.
 
        // 원래 문자열을 원하는 문자열로 바꿔놓으려면,
        s = s.replace(" and"", ");
        System.out.println(s); // I like Java,  Python,  C.
 
        s = "I like Java and Python and C."// 다시 원래대로
 
        // 문자열을 원하는 부분만 출력하고 싶을 때
        System.out.println(s.substring(7)); // 인덱스 7부터 시작해서 끝까지 출력(이전 내용은 제외)
        // 인덱스 번호를 모르는 경우가 많으므로
        System.out.println(s.substring(s.indexOf("Java")));
        // 결과: Java and Python and C.
        // 시작과 끝을 정해서 원하는 부분만 출력하고 싶을 때
        System.out.println(s.substring(s.indexOf("Java"), s.indexOf(".")));
        // 이때, substring(시작 인덱스, (끝+1) 인덱스) 임을 주의하자.
        // 즉, 끝 위치에 나타난 인덱스 바로 전의 인덱스에 해당하는 값이 출력된다.
        // 따라서, Java and Python and C 이 출력된다.
 
        System.out.println(s); // 원래 문자열의 변화는 없음 // I like Java and Python and C.
 
        // 원래 문자열을 원하는 문자열로 바꿔놓으려면,
        s = s.substring(7);
        System.out.println(s); // Java and Python and C.
 
        // 공백 제거
        s = "            I love Java.           ";
        System.out.println(s);
        System.out.println(s.trim()); // 앞뒤 공백 제거
 
        // 문자열 결합
        String s1 = "Java";
        String s2 = "Python";
        System.out.println(s1 + s2); // JavaPython
        System.out.println(s1 + "," + s2); // Java,Python
        System.out.println(s1.concat(",").concat(s2)); // Java,Python
 
 
    }
}
 
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package String;
 
public class StringCompare {
    public static void main(String[] args) {
 
        // 문자열 비교
        String s1 = "Java";
        String s2 = "Python";
 
        System.out.println(s1.equals(s2)); // 문자열 내용이 같으면 true, 다르면 false // false
        System.out.println(s1.equals("Java")); // true
 
        System.out.println(s2.equals("python")); // 대소문자 구분하므로 false
        // 대소문자 구분없이 내용이 같으면 true를 나타내게 하고 싶다면?
        System.out.println(s2.equalsIgnoreCase("python"));
 
        // 문자열 비교 심화
        s1 = "1234";
        s2 = "1234";
        // 문자열 변수 s1, s2 모두 한 메모리 공간에 존재하는 "1234"를 참조한다.
        System.out.println(s1.equals(s2)); // true // 참조하고 있는 메모리 공간의 내용을 비교
        System.out.println(s1 == s2); // true // 변수 각각이 참조하고 있는 것이 같은지를 비교
 
        s1 = new String("1234");
        s2 = new String("1234");
        // 문자열 변수 s1, s2 각각 다른 메모리 공간에 존재하는 "1234"를 참조한다.
        System.out.println(s1.equals(s2)); // true // 참조하고 있는 메모리 공간의 내용이 같으므로
        System.out.println(s1 == s2); // false // 변수 각각이 참조하고 있는 것이 다르므로
 
        // 따라서 Java에서 문자열의 내용을 비교하고 싶으면 equals를 써라!!
 
    }
}
 
cs

+ Recent posts