자바 문자열 자르기 - jaba munjayeol jaleugi

문자열 문제만 나오면 대충은 아는데 제대로 몰라서 항상 검색해서 풀이하게 된다. 이번 기회에 잘 기억해두려고 정리하는 포스팅!

일단 기본

java에서 문자열은 자바에서 제공하는 String 클래스를 사용한다.
String 객체를 생성한 후, 문자열을 조작할 때 사용할 수 있는 메소드를 몇가지 기억해보자.

substring()

원하는 문자열만큼 추출하는 메소드. subsring에는 2가지가 있다.

  • substring (int beginIndex) : 시작 인덱스부터 끝까지
  • substring (int beginIndex, endIndex) : 시작 인덱스부터 끝 인덱스-1까지
String str = "0123456789";

str.substring(5); // 56789
str.substring(1,4); // 123 

split()

  • split(String regex) : 파라미터로 들어오는 문자열을 기준으로 문자열을 쪼갠다. String[]을 리턴함.
String str = "abcd#efg";
String[] splited = str.split("#"); // splited[0]: abcd, splited[1]: efg

String str2 = "aaa bbb ccc";
String[] splited2 = str.split(" "); // splited2[0]: aaa, splited2[1]: bbb, splited2[2]: ccc

replace(), replaceAll(), replaceFirst()

문자열을 다른 문자열로 치환할 때 사용.
치환 메소드이긴 한데 주로 문자열에서 특정 문자를 삭제할때 유용하게 사용한다.

  • replace(CharSequence target, CharSequence replacement) : 모든 target replacement로 치환
String str = "a,b,c,d,e";
System.out.println(str.replace(",", " ")); // a b c d e
System.out.println(str.replace(",", "")); // abcde
  • replaceAll(String regex, String replacement) : replace()와 비슷하나, 첫번째 인자로 정규식을 넣는다.

  • replaceFirst(String target, String replacement) : 첫번째 발견되는 target만 치환한다.

String str = "a,b,c,d,e";
System.out.println(str.replaceFirst(",", " ")); // a b,c,d,e
System.out.println(str.replace(",", "")); // ab,c,d,e

그 외

compareTo(), charAt() 등의 여러 메소드가 더 있지만 나중에 더 정리해보도록 하겠다!

참고 사이트

https://docs.oracle.com/javase/7/docs/api/

자바(Java)에서 문자열을 자르는 방법으로 substring을 제공하고 있다.

substring은 2가지 방식의 인자값을 받고 있으며 방식은 아래와 같다.

substring 사용법

String substring(int startIndex);
String substring(int startIndex, int endIndex);

startIndex는 시작지점의 인덱스 값이고, endIndex는 종료 지점의 인덱스 값이다.

두 방식 모두 return 값으로 문자열(String)이 리턴된다.

사용 예제

public class Main {

    public static void main(String args[]) {
        String example = "동해물과 백두산이 마르고 닳도록";
        System.out.println("example.length->" + example.length());

        System.out.println(example.substring(5));
        System.out.println(example.substring(5,8));
    }
}
example.length->17
백두산이 마르고 닳도록
백두산

example에는 애국가의 일부가 담겨져 있고, 전체 문자열의 크기는 17개의 문자로 되어 있다.

첫번째 substring(5)의 경우 "백두산이 마르고 닳도록"까지 리턴이 되는데 인자값이 하나만 넣을 경우, index 시점부터 마지막 문자열까지 가져오라라는 말과 동일하다.

인덱스는 시작이 0으로 시작되며, 각각 0:동, 1:해, 2:물, 3:과, 4:공백, 5:백으로 인덱스가 잡히기 때문에 백이 있는 위치가 5이다. 8의 위치는 백두산이에서 마지막인 이인데, 이가 위치한 곳까지 가지고 오라고 했기 때문에 이를 시각적으로 보면 다음과 같다.

자바 문자열 자르기 - jaba munjayeol jaleugi
5:8의 인덱스를 표현한 그림

간혹, substring이 시작과 종료 시점이 헷갈릴 때에는 차라리 종료와 시작의 값을 빼서, 시작시점부터 몇글자까지인지 이해하는 것이 쉬울 수 있다. 즉 8에서 5를 빼면, 3이라는 숫자가 남기 때문에 백에서 시작하며 3글자까지인 "백두산"이 뽑힌다는 것을 쉽게 알 수 있다.

에러가 발생할 경우

substring의 경우 초보자분들이 많이 실수 하는 것이 length를 체크하지 않고 막 쓰는 경우이다. 

에러 발생 예제

public class Main {

    public static void main(String args[]) {
        String example = "동해물과 백두산이 마르고 닳도록";
        System.out.println(example.substring(15,18));
    }
}
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 18
at java.lang.String.substring(String.java:1963)
at Main.main(Main.java:5)

substring에서 발생하는 에러는 StringIndexOutofBoundsException이 주로 발생하며, 범위를 벗어난 값을 호출할 때 발생을 한다. 즉, substring을 사용할 때에는 인덱스 값을 명시하지 말고, 값을 체크해서 사용하는 버릇이 중요하다.

Length값을 습관적으로 체크한다

public class Main {

    public static void main(String args[]) {
        String example = "동해물과 백두산이 마르고 닳도록";

        if(example.length() >= 18) {
            System.out.println(example.substring(15, 18));
        } else {
            System.out.println("값이 범위를 벗어 났음");
        }
    }
}
값이 범위를 벗어 났음

위와 같이 substring을 하기 전에는 습관적으로 length값을 체크하는 것이 중요하다.