프로그래밍 언어/Java

[Java] String 클래스 정확히 이해하기

happy_life 2022. 6. 28. 17:17

목차

1. String 개요

2. String 생성 방법 비교

3. 자주 사용하는 String 메서드

4. join()과 StringJoiner() 메서드

5. string을 기본형으로 변경하기

 

 

1. String 개요

다른언어에서는 char형의 배열로 문자열을 다루지만, 자바에서는 String 클랫스를 통해 문자열을 다룬다.  String 인스턴스가 갖고 있는 문자열은 변경이 불가능하다. 아래의 코드를 보면서 이해해보자.

 

코드 예제

public class StringEx1 {
    public static void main(String[] args) {
        String x = "x";
        String y = "y";
        x = x + y;

        System.out.println("x = " + x);
        // x = xy
    }
}

문자열을 변경할 수 없으므로 x의 "x"가 "xy"로 변경된 것이 아니다. 새로운 문자열 "xy"가 생긴 뒤 다시 그 주소를 x가 참조하는 것이다. 그림으로 그리면 아래와 같다.

 

 

 

2. String 생성 방법 비교

String을 생성하는 데에는 리터럴을 지정하는 방법과, String 클래스 생성자를 사용하는 두 가지 방법이 있다.

 

코드 예제

public class StringEx2 {
    public static void main(String[] args) {
        // 문자열 리터럴 사용하기
        String a = "hello";
        String b = "hello";
        
        // String 생성자 사용하기
        String c = new String("hello");
        String d = new String("hello");

    }
}

 

그렇다면 차이점은 무엇인가? 아래의 그림을 보며 이해해보자. 아래의 그림은 위 코드가 실행되 었을 때를 나타낸 것이다.

같은 문자열 리터럴은 컴파일 시 클래스 파일에 하나만 올라간다. 따라서 a,b는 같은 주소의 "hello"를 참조하게 되는 것이다. 한편 c, d는 직접 new 연산자를 통해 메모리에 서로 다른 객체를 할당한 것이므로 다른 주소의 "hello"를 참조하게 된다.

 

 

3. 자주 사용하는 String 메서드

 

메서드 설명
char charAt() 지정된 위치에 있는 문자를 알려준다.
int compareTo() 파라미터로 들어온 문자열과 사전순서를 비교한다. 같으면 OO, 사전순으로 앞이면 -1, 뒤면 + 1을 return한다.
String concat() 문자열을 뒤에 덧붙인다.
boolean contains() 지정된 문자열이 포함되어 있는지 검사한다.
boolean equals() 매개변수의 문자열과 현재 인스턴스의 문자열(value)를 비교한다.
int indexOf() 주어진 문자가 문자열에 존재하는지 확인하여 그 위치를 반환한다. 없으면 -1 반환
String intern() String 객체의 intern 메서드가 호출되면 이 풀에 해당 문자열과 같은(String.equals() 반환값이 true인) String 객체가 존재하는 경우 해당 객체를 반환하고, 존재하지 않는 경우 해당 객체를 풀에 추가하고 해당 객체를 반환하게 된다.
int lastIndexOf() 지정된 문자 또는 문자열을 문자열의 오른쪽 끝에서부터 찾아 위치를 반환한다. 없으면 -1 반환
int length() 문자열의 길이 반환
String replace() 특정 문자를 모두 새로운 문자로 변경
String[] split() 문자열을 기준에 맞춰 분리
String substring() 파라미터로 들어온 index사이의 문자열을 추출하기
String toLowerCase() 문자열을 소문자로 모두 변환
String trim() 좌우에 있는 공백 모두 제거 ( 중간 공백은 제거 X) 
static String valueOf() 파라미터를 String으로 변환해 반환

 

코드 예제

public class StringEx3 {

    public static void main(String[] args) {
        String test = "";

        //chatAt() - 지정된 위치에 있는 문자를 알려준다.
        test = "abcd";
        System.out.println(test.charAt(3));
        //index 3에 있는 d를 출력

        //compareTo - 파라미터로 들어온 문자열과 사전순서를 비교한다.
        test = "aaa";
        System.out.println(test.compareTo("bbb"));
        // a보다 사전 순으로 앞이므로- 1을 출력

        //concat - 문자열을 뒤에 덧붙인다.
        String tmp = "bbb";
        System.out.println(test.concat(tmp));
        // aaabbb

        //contains - 지정된 문자열이 포함되어 있는지 검사한다.
        test = "abcddd";
        System.out.println(test.contains("ab"));
        // ab를 포함하므로 true 출력

        //equals 생락

        //indexOf - 주어진 문자가 문자열에 존재하는지 확인하여
        // 그 위치를 반환한다. 없으면 -1 반환
        test = "aaa";
        System.out.println(test.indexOf("a"));
        // a가 여러 개면  가장 맨앞에 있는 것의 위치 출력

        //intern 생략

        //lastIndexOf - 지정된 문자 또는 문자열을
        // 문자열의 오른쪽 끝에서부터 찾아 위치를 반환한다. 없으면 -1 반환
        test = "aaa";
        System.out.println(test.lastIndexOf("a"));
        // 2

        //length - 문자열의 길이 반환
        test = "aaa";
        System.out.println(test.length());
        // 3

        //replace - 특정 문자를 모두 새로운 문자로 변경
        test = "abc";
        System.out.println(test.replace("a","c"));
        // "abc" -> "cbc"

        //split - 문자열을 기준에 맞춰 분리
        test = "a,b,c";
        String[] arr = test.split(",");
        System.out.println(arr[0] + arr[1] + arr[2]);
        //arr = {a,b,c}

        //substring - 파라미터로 들어온 index 사이의 문자열 추출
        test = "aaabbbccc";
        System.out.println(test.substring(3,6));
        // 3에서 시작하여 6 전까지 출력 3,4,5
        //bbb

        //toLowerCase - 소문자로 변환
        test = "ABC";
        System.out.println(test.toLowerCase(Locale.ROOT));
        //abc

        //trim - 좌우 공백 제거
        test = " a ";
        System.out.println(test.trim());

        //valueOf - 파라미터를 String으로 변환해 반환
        int a = 35;
        System.out.println(String.valueOf(a));
        // String 형의 a 출력

    }
}

 

 

 

 

4. join()과 StringJoiner 메서드

join()

join은 특정한 구분자를 문자열 사이사이에 넣어 하나로 결합하는 메서드이다.

 

코드 예제

public class StringEx4 {
    public static void main(String[] args) {
        String a = "a";
        String b = "b";
        String c = "c";
        System.out.println(String.join("-", a,b,c));
        //a-b-c
    }
}

 

배열로 만든 뒤 배열을 넣어도 가능하다.

 

코드 예제

String[] arr = {"a", "b", "c"};
System.out.println(String.join("-", arr));
//a-b-c

 

 

StringJoiner() 메서드

join과 비슷하지만, 양쪽 끝을 지정해줄 수 있다.

 

코드 예제

 

/**
 * StringJoiner 클래스
 * 양쪽 맨 끝을 정해줄 수 있다.
 */
public class StringEx5 {
    public static void main(String[] args) {
        String[] arr = {"a", "b", "c"};
        StringJoiner stringJoiner = new StringJoiner(",", "[", "]");

        for (String s : arr) {
            stringJoiner.add(s);
        }

        System.out.println(stringJoiner);
        //[a,b,c]
    }
}

 

 

5. string을 기본형으로 변경하기

기존에 기본형을 string으로 변경하기위해 String.valueOf()를 사용하였다. 반대로 string으르 기본형으로 변경하기 위해서 변경하고자 하는 기본형의 parse메서드를 사용하면 된다.

 

문자열 -> 기본형

문자열 -> 기본형
boolean Boolean.parseBoolean(String s)
byte Byte.parseByte(String s)
short Short.parseShort(String s)
int Integer.parseInt(String s)
long Long.parseLong(String s)
float Float.parseFloat(String s)
double Double.parseDouble(String s)