알고리즘 코드카타 중 주어진 문자열을 공백을 기준으로 자르도록 구현해야 하는 상황이 발생했다.
String클래스의 split(” “) 메서드를 사용하여 문자열을 자르긴 했는데, 사용자가 입력하는 문자열인 만큼 가장 앞에 공백문자가 들어오는 경우 “ ”빈 공간도 문자열로 인식해 배열에 입력되었다.
그래서 StringTokenizer를 사용했더니 공백문자를 문자열로 인식하지 않았다.
아래는 테스트용으로 작성한 코드로 , 같은 문장을 split() 메서드와 StringTokenizer 클래스를 사용하여 자른 문자열 개수를 보여주고 있다.
입력 문장 = “ 문자열 개수 구하기 테스트”
split() 메소드 사용 결과 = 5
StringTokenizer 클래스 사용 결과 = 4
" "(공백문자)를 기준으로 문자열을 자른 결과에서 split() 메서드와StringTokenizer 클래스의 결과가 다르게 나온 것을 알 수 있다. 내가 의도한 결과를 도출한 건 StringTokenizer 클래스다.
그렇다면 split() 메서드와 StringTokenizer는 어떻게 다를까?
Split()와 StringTokenizer의 차이
split() | StringTokenizer | |
위치 | String 클래스의 메서드 | java.util에 포함된 클래스 |
문자열 구분자 | 정규표현식 | 문자 또는 문자열 (생략시 공백문자) |
구분자 개수 | 두개 이상 가능 | 1개 |
결과값 형태 | String[] : 문자열 배열 | String : 문자열 |
공백 | 공백 포함 | 공백 생략 |
위 표를 보면 공백문자를 기준으로 문자열을 잘랐을 때 split은 공백문자를 포함시키고, StringTokenizer은 포함시키지 않았던 이유를 알 수 있다.
더 정확히 말하자면, StringTokenizer는 생성방법(생성자)가 3가지인데, 매개변수로는 1. 자를 문자열(str), 2. 구분자(delim), 3. 구분자포함여부(returnDelims) 3가지가 있다.
// 자를 문자열(str), 구분자(delim), 구분자포함여부(returnDelims)
StringTokenizer(String str)
StringTokenizer(String str, String delim)
StringTokenizer(String str, String delim, boolean returnDelims)
여기서 세 번째 returnDelims의 값을 true로 하면 구분자도 토큰으로 간주된다.
하지만 기본값이 false이므로 지정하지 않은 이상 기본구분자인 공백문자를 토큰(자른 문자열)에 포함하지 않는다.
따라서 위 표를 기준으로, 다음과 같은 상황에 맞게 선택해서 메서드와 클래스를 사용하면 될 것 같다.
split()
- 반환 타입으로 배열이 필요할 때(문자열을 계속 사용할 때)
- 구분자를 여러개 쓰고 싶을 때
StringTokenizer
- 반환 타입으로 문자열이 적합할 때(문자열을 보관할 필요 없이 일시적으로 사용하는 경우)
-> 배열로 반환되면 임시로 사용하는 문자열을 배열에 한 번 보관했다가 다시 꺼내야 하는 과정을 거쳐야 한다.
- 구분자가 간단한 하나의 문자/문자열일 때
'TIL' 카테고리의 다른 글
[KPT] 9조 KPT 회고 (0) | 2024.08.08 |
---|---|
[TIL] 팀과제의 정적 메소드(Static Method) 리팩토링 (0) | 2024.08.06 |
[TIL] Github에 올라간 .idea 폴더 삭제 / .gitignore 파일 미적용 해결 (0) | 2024.08.02 |
[TIL] Git LF will be replaced by CRLF in 에러 (0) | 2024.08.01 |