해당 글은 (주)인실리코젠 이병준 주임님께서 작성해주신 리뷰에 대한 답변입니다.
Programmers Lv2.JadenCase 문자열 만들기

문제를 접하고 가장 먼저 든 생각은 "split 함수와 subString을 사용하면 풀 수 있겠다!" 였다.
하지만 보다 나은 방법을 고민하다가 StringBuilder 와 StringTokenizer를 발견하였다.
StringTokenizer는 C언어의 strtok()의 로직과 유사하지만 원본을 훼손하지 않는다.
Split VS StringTokenizer
StringTokenizer 클래스
- 문자열을 구분자를 이용해 분리할 때 사용
- 토큰은 분리된 문자열 조각으로, StringTokenizer 클래스는 하나의 문자열을 여러 개의 토큰으로 분리하는 클래스

StringTokenizer 클래스의 생성자
생성자 | 설명 |
StringTokenizer (String str) | 공백 기준으로 문자열 분리 |
StringTokenizer (String str,String delim) | 두 번째 문자열에 속한 구분자를 기준으로 문자열 분리 |
StringTokenizer (String str,String delim, boolean returnDelims) | 구분자를 포함할 것인지 여부 결정 |
- 새로운 인스턴스를 생성하면 인스턴스에 생성자로 넘겨준 원본 문자열과 구분자 문자열이 그대로 저장
- String 클래스의 split()메소드는 한 번에 잘라서 배열로 반환해주는 것과 달리, 우선 자르지 않고 그대로 저장
StringTokenizer 클래스의 주요 메소드
메소드명 | 설명 |
countToken() | 현재 남아있는 Token 갯수 반환 |
hasMoreTokens() | 현재 커서 기준으로 더 반환할 수 있는 Token이 남았는가에 대한 여부 boolean 타입으로 true,false 반환 |
nextToken() | 현재 커서를 다음 구분자 위치로 이동시킨 후, 그 이전의 문자열을 반환 |
공백을 기준으로 잘라진 문자열 마다 마다의 변환이 필요했기 때문에 StringTokenizer를 사용하였다.
그렇다면, String 클래스가 아닌 왜 StringBuilder를 사용하였나?
이에 대한 대답은 String 클래스와 StringBuilder 클래스의 차이점을 살펴보면서 해답을 찾았다.
우선, String 클래스는 문자열 변화를 할 수 없고 StringBuilder 클래스는 문자열 변화가 가능하다.
간단히, String 클래스의 동작과정을 살펴보면
- 문자열 리터럴 방식으로 문자열 생성
- JVM은 String Pool에 문자열이 존재하는지 확인
- 존재하지 않는다면 String Pool에 해당 문자열 저장
- 만약 += 연산자를 사용하여 문자열에 문자열을 추가
- += 연산자를 사용하면 String Pool에 생성되는 것이 아니라 외부 영역에 생성
- 따라서 JVM은 더해진 문자열이 존재하는지 확인하지 않음
String의 문제는 문자열을 추가하거나 변경할 경우 Heap 영역에 메모리를 불필요하게 낭비한다는 점
불필요한 메모리 공간은 가비지 컬렉션에 의해 처리되지만, 이는 가비지 컬렉션이 많은 작업을 하게 된다는 뜻
StringBuilder를 사용하면 하나의 메모리 공간만 사용하므로 메모리 공간을 효율적으로 사용할 수 있음
StringBuilder 클래스는 버퍼를 활용하여 문자열을 문자 시퀀스로 관리한다.
버퍼의 용량이 가득차면 버퍼의 크기가 (기존용량 + 1)의 두 배로 증가한다.
또한, StringBuilder 클래스는 String Pool을 활용하지 않는다.
StringBuilder 클래스의 생성자
생성자 | 설명 |
StringBuilder() | 초기 용량 16Byte로 설정 |
StringBuilder(int capacity) | capacity 만큼 용량 설정 |
StringBuilder(CharSequence seq) | CharSequence 의 길이 + 16Byte 만큼 설정 |
StringBuilder(String str) | 생성자 함수에 문자열 전달 |
StringBuilder 클래스의 주요 메소드
메소드명 | 설명 |
append() | 문자열 추가 |
capacity() | char() 배열이 가진 사이즈 정보 반환 |
length() | 문자열 자체의 길이 |
insert() | 특정 위치에 문자열 삽입 |
delete() | 인덱스 사이의 문자열 제거 |
String 클래스는 불변의 특성을 지니기 때문에 문자열을 삽입하고 삭제하는 연산에서는 좋지 않은 성능을 나타내게 된다.
따라서 해당 문제는 문자열의 삽입, 삭제 연산이 자주 일어나므로 String 클래스가 아닌 String Builder 클래스를 사용하였다.
단일 쓰레드 ? 멀티 쓰레드 ?
위에서 언급한 String 과 StringBuilder에 대해 공부하면서 StringBuffer에 대한 내용을 지나칠 수 없었다.
간단히 설명하자면,
StringBuilder와 StringBuffer 모두 가변성을 지니지만 동기화의 유무이다.
StringBuffer는 동기화 키워드를 지원하여 멀티쓰레드에 환경에서 안전하다.
StringBuilder는 동기화를 지원하지 않지만 동기화를 고려하지 않는 환경에서는 StringBuffer 보단 환경이 뛰어나다.
StringTokenizer 와 StringBuilder를 선택한 이유에 대한 답변은 모두 마무리 되었다.
이를 코드에 적용시켜 코드를 살펴보자.
package Lv2;
import java.util.Scanner;
import java.util.StringTokenizer;
// 3people unFollowed me
// https://school.programmers.co.kr/learn/courses/30/lessons/12951
public class JadenCase문자열만들기 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
str = str.toLowerCase(); // 전부 소문자로 바꾸기
System.out.println(str);
StringTokenizer st = new StringTokenizer(str, " ", true);
StringBuilder sb = new StringBuilder(); // 문자열을 연결해야 하므로 변경 가능한 문자열을 만드는 StringBuilder 선언
while (st.hasMoreTokens()) {
String nextWord = st.nextToken();
if(nextWord.equals(" ")) { // 공백이면 그대로 출력
sb.append(nextWord);
}else {
sb.append(nextWord.substring(0, 1).toUpperCase() + nextWord.substring(1)); // 첫 번째 요소 대문자로 바꾸고 나머지 이어 붙이기
}
}
sb.toString(); // 반드시 필요
System.out.println(sb);
sc.close();
}
}
크게 어려운 알고리즘은 적용되지 않았던 문제이다. split()과 subString()을 이용해서도 풀이가 가능할 것으로 보이지만
위 코드보단 복잡해질 것이라 예상된다.
BPM(Business Process Managment)란?
조직 내의 비지니스 프로세스를 관리, 개선 및 최적화하기 위한 접근 방법
BPM의 핵심 단계
- 프로세스 모델링
- BPMN을 사용하여 플로우 차트 작성 → 구체화된 방식으로 모델링 가능
- 프로세스 실행
- BPM에서 중요한 단계로 실행 엔진 또는 워크 플로우 엔진을 활용하여 프로세스를 실행하는 과정
- 프로세스 모니터링
- 실행 중인 프로세스의 상태를 실시간으로 추적하고 조직에 유용한 정보를 제공
- 프로세스 최적화
- 프로세스 분석과 개선을 통해 조직의 효율성을 향상
JadenCase 문자열 만들기에 대한 BPMN

'인실리코젠' 카테고리의 다른 글
[인실리코젠] WebCrawling - 1 (0) | 2024.01.16 |
---|---|
[인실리코젠] Maven에 대하여 (0) | 2024.01.12 |
[인실리코젠] Apache POI 라이브러리를 이용한 Exel 데이터 읽기 2 (0) | 2024.01.12 |
[인실리코젠] Apache POI 라이브러리를 이용한 Exel 데이터 읽기 (2) | 2024.01.11 |
[인실리코젠] 배열 vs 리스트 (1) | 2024.01.11 |