개발은 재밌어야 한다
article thumbnail
반응형

String 문자열에서 원하는 특정 문자들을 잘라서 사용해야 할 때가 자주 있습니다.

이번 포스팅은 이런 문자열을 자르는 방법들에 대해서 알아보겠습니다.

 

substring() - 특정 인덱스를 기준으로 자른 문자열을 반환

📄substring(int index) - index부터 문자열 끝까지 문자열을 리턴(String)

📄substring(int beginIndex, int endIndex) - beginIndex 부터 endIndex전까지 문자열을 리턴(String)

String으로 구성된 문자열은 기본적으로 char형태의 한개의 문자를 여러개로 구성한 형태인데

이러한 String을 특정 index를 중심으로 자르는 방법으로 substring() 메소드를 사용합니다.

 

subString은 특정 인덱스의 숫자를 기준으로 문자열을 자르기 때문에 특정 문자에 대한 인덱스를 구하는 indexOf()함수도 사용되니 알아 둘 필요가 있습니다.

 

substring(int index) 하나의 인덱스가 올 때에는 해당 인덱스를 포함하지 않는 이후 문자열을 리턴합니다.

substring(int beginIndex, int endIndex) 시작 인덱스와 끝 인덱스를 인자값으로 두개를 지정해주면 beginIndex위치를 포함하고 endIndex의 앞까지의 문자열을 리턴합니다.

예제

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
public class TEST
{
    public static void main(String[] args)
    {
        // 문자열 dream
        String str = "dream coding";
 
        // 원하는 문자열 coding
 
        // 스페이스바의 인덱스 구하기 index = 6
        int index = str.indexOf("c");
 
        // 원하는 인덱스부터 끝까지 문자열 자르기
        // c부터 끝까지 -> c는 index
        String cutStr = str.substring(index);
 
        // 결과값 = coding
        System.out.println(cutStr);
 
        // 원하는 문자열 ea
        // start 인덱스부터 end 인덱스 까지 문자열 자르기
 
        // start = 2
        int start = str.indexOf("e");
 
        // end = 4
        int end = str.indexOf("m");
 
        String strartToEnd = str.substring(start, end);
 
        // [결과] ea
        System.out.println(strartToEnd);
    }
}
 
cs

split() - 입력받은 정규표현식 또는 특정 문자를 기준으로 문자열을 나누어 배열(Array)로 반환

📄split(String regex) - 정규표현식 이나 특정 문자를 regex(String) 인자 값을 이용하여 나누어진 문자열을 문자열 배열(String[])로 반환한다.

 

기본적으로 인자값이 하나인 경우 두번째 인자가 0인 경우인 인자값이 2개인 split함수를 호출한다.

과일을 나열하고 split(",") 했을 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class TEST
{
    public static void main(String[] args)
    { 
        String str = "apple,banana,melon,strawberry";
        // ,를 기준으로 문자열 분리
        String [] splitArray = str.split(",");
        
        for (int i = 0; i < splitArray.length(); i++)
        {
            System.out.println(splitArray[i]);
        }
        // 결과
        // apple
        // banana
        // melon
        // strawberry 
    }
}
 
cs

 

한가지의 예제를 더 보면, 휴대폰 번호를 split("-")을 통해 나누어 배열에 저장해봅니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class TEST
{
    public static void main(String[] args)
    {
        // 전화번호 010-1313-3579
        String str = "010-1313-3579";
 
        // -를 기준으로 배열화
        String[] phoneNum = str.split("-");
 
        String first = phoneNum[0]; //010
        String second = phoneNum[1]; //1313
        String third = phoneNum[2]; //3579
 
        System.out.println("first = " + first);
        System.out.println("second = " + second);
        System.out.println("third = " + third);
    }
}
 
 
cs

전화번호 010-1313-3579를 - 기준으로 나눈 String 배열의 값을 phoneNum이라는 String배열의 변수에 담아 각 배열의 값을 살펴보면

first = 010

second = 1313

third = 3579

와 같이 각 배열의 값을 쪼갤 수 있습니다

 

📄split(String regex, int limit) - 정규표현식(regex)에 따라 반환되는 결과 배열(String[])의 길이를 제어(limit)하는 문자열(String[])을 반환한다.

위의 인자값을 하나를 받는 경우과 달리 int형의 두번째 인자값을 받는 split 함수의 경우입니다.

두번째 인자의 값은 split()한 결과 배열의 크기를 결정하는 값입니다.

 

예제

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
public class SplitTest{
 
    public static void main(String[] args){
 
        String str = "a/b/c/d////";
 
        String regex = "/";
 
        int limit = 0;
 
        // limit가 0인 경우
        String[] splitTest1 = str.split(regex, limit);
 
        for(int i=0; i < splitTest1.length; i++)
            System.out.print(splitTest1[i] + "@");
 
        // [결과] a@b@c@d
        // splitTest1의 값은 {"a", "b", "c", "d"}이다
        // limit가 0인 경우에는 무시된다.
 
        limit = 2
        // limit가 양수인 경우 -> 해당 개수까지만의 배열을 리턴한다.
        String[] splitTest2 = str.split(regex, limit);
 
        for(int i=0; i < splitTest2.length; i++)
            System.out.print(splitTest2[i] + "@");
        
        // [결과] a@b@
        // splitTest2의 값은 {"a", "b"}이다.
        
    }
}
 
cs

기본적으로 split함수는 내부적으로 정규식에 알맞는 데이터를 Pattern 객체를 새롭게 생성해 만들어낸 문자열을 리턴하는 방식이므로 substring()에 비해서 성능이 떨어지는 방식이므로 가급적이면 substring()을 사용하는 경우라면 굳이 split()함수를 사용하는것은 성능 측면에서는 비효율적입니다.

 

StringTokenizer - 문자열을 구분자로 분리한 StringTokenizer 객체 생성

StringTokenizer 클래스는 문자열을 우리가 지정한 구분자로 문자열을 쪼개주는 클래스입니다. 그렇게 쪼개어진 문자열을 토큰(token)이라고 부릅니다.

 

생성자(Constructor)

📄public StringTokenizer(String str)  : 파싱 할 문자열을 인자로 받는다. 구분자를 지정하지 않았으므로 스페이스, 탭, 줄바꿈, 캐리지 리턴 등 기본 구분자가 적용된다.

📄public StringTokenizer(String str, String delim)  : 파싱할 문자열과 구분자를 인자로 받는다.

📄public StringTokenizer(String str, String delim, boolean returnDelims)  : flag는 구분자 자체도 토큰으로 인식하게 할지 여부를 정한다.

 

Parameters

str : 분리할 문자열

delim : 문자열을 분리할 문자

returnDelims : 분리문자까지 토큰으로 포함할지 여부를 결정 true이면 delim 포함, false이면 delim미포함 한다. 

 

int countTokens() 

- 남아있는 token의 개수를 반환한다. (현재 남아있는 token의 개수)

 

String nextToken()

- 다음 token을 반환한다. 

 

boolean hasMoreTokens()

- 리턴할 다음 토큰이 있으면 true를 다음 토큰이 없으면 false를 리턴한다.

 

1. Default Delim을 이용 [public StringTokenizer(String str)]

구분자를 지정하지 않으면 기본적으로 공백이 구분자로 문자열이 나누어진다.

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
import java.util.StringTokenizer;
class StringTokenizerExample {
    public static void main(String[] args)
    {
        String str = "123-456-789";
 
        // delim을 따로 지정하지 않으면 default로 공백
        StringTokenizer tokenizer = new StringTokenizer(str);
 
        System.out.println("추출 전 token의 수: " + tokenizer.countTokens());
 
        // 다음 토큰이 있으면 while루프를 탄다.
        while(tokenizer.hasMoreTokens()){ 
            System.out.println(tokenizer.nextToken());
        }
        
        System.out.println("추출 후 token의 수: " + tokenizer.countTokens());
 
/*        실행 결과
        추출 전 token의 수: 3  
        123
        456
        789
        추출 후 token의 수: 0
*/
    }
}
 
cs

2. 특정 Delim을 이용 [public StringTokenizer(String str, String delim)]

문자열을 구분할 구분자 문자를 통해 문자열(토큰)을 분리한다.

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
import java.util.StringTokenizer;
class StringTokenizerExample {
    public static void main(String[] args)    
    {
        String str = "123-456-789";
 
        // "-" 기준으로 문자열을 분리한다.
        StringTokenizer tokenizer = new StringTokenizer(str, "-");
 
        System.out.println("추출 전 token의 수: " + tokenizer.countTokens());
 
        // 다음 토큰이 있으면 while루프를 탄다.
        while(tokenizer.hasMoreTokens()){ 
            System.out.println(tokenizer.nextToken());
        }
        
        System.out.println("추출 후 token의 수: " + tokenizer.countTokens());
 
/*      실행결과
        추출 전 token의 수: 3
        123
        456
        789
        추출 후 token의 수: 0
*/
    }
}
 
 
cs

 

3. Delim까지 포함[public StringTokenizer(String str, String delim, boolean returnDelims)]

구분되는 문자열까지 token으로 포함하여 반환합니다.

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
import java.util.StringTokenizer;
class StringTokenizerExample {
    public static void main(String[] args)    
    {
        String str = "123-456-789";
 
        // "-" 기준으로 문자열을 분리한다.
        StringTokenizer tokenizer = new StringTokenizer(str, "-"true);
 
        System.out.println("추출 전 token의 수: " + tokenizer.countTokens());
 
        // 다음 토큰이 있으면 while루프를 탄다.
        while(tokenizer.hasMoreTokens()){ 
            System.out.println(tokenizer.nextToken());
        }
        
        System.out.println("추출 후 token의 수: " + tokenizer.countTokens());
 
/*      실행결과
        추출전 token의 수:5 
        123
        -
        456
        -
        789
        추출전 token의 수:0
*/
    }
}
 
cs

 

반응형
profile

개발은 재밌어야 한다

@ghyeong

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!