[Java]STEP1 - 18) String 클래스, StringTokenizer, StringBuffer, StringBuilder
본 게시글은 도서 "이것이 자바다" 동영상 강의를 듣고 기록하는 TIL(Today I Learned) 입니다.
모든 저작권은 출판사 한빛미디어와 신용권님께 있음을 알립니다.👍
이번 게시물에서는 String 클래스에 속한 여러가지 메소드에 대해서 알아보겠습니다.
또한 문자열을 일정 기호 단위로 자르는 StringTokenizer 클래스와
문자열을 자주 변경할 때 메모리를 효율적으로 사용할 수 있는 StringBuffer, StringBuilder 클래스에 대해 알아보겠습니다.
1. String 클래스
자바의 문자열은 java.lang 패키지의 String 클래스의 인스턴스로 관리된다.
String 클래스는 문자열의 추출, 비교, 찾기, 분리, 변환 등과 같은 다양한 메소드를 가진다.
리턴 타입 | 메소드명(매개 변수) | 사용 |
char | charAt(int index) | 해당 index의 문자 리턴 |
boolean | equals(Object obj) | 두 문자열을 비교 |
byte[] | getBytes() | byte[]로 리턴 |
byte[] | getBytes(Charset charset) | 주어진 문자셋으로 인코딩한 byte[]로 리턴 |
int | indexOf(String str) | 문자열 내에서 주어진 문자열의 위치를 리턴 |
int | length() | 총 문자의 수를 리턴 |
String | replace(target, replacement) | target부분을 replacement로 대치한 새로운 문자열 리턴 |
String | subString(int beginIndex) | beginIndex 위치에서 끝까지 잘라낸 문자열 리턴 |
String | subString(int beginIndex, int endIndex) | beginIndex 부터 endIndex 전까지 잘라낸 문자열 리턴 |
String | toLowerCase() | 소문자로 변환한 문자열 리턴 |
String | toUpperCase() | 대문자로 변환한 문자열 리턴 |
String | trim() | 앞뒤 공백을 제거한 문자열 리턴 |
String | valueOf(int i) valueOf(double d) |
괄호 안 기본 타입을 문자열로 리턴 |
String[] | split("정규표현식") | 정규 표현식을 구분자로 하여 문자열을 분리 한 후 배열로 리턴 |
2. StringTokenizer 클래스
문자열이 특정 구분자로 연결되어 있을 경우, 구분자를 기준으로 부분 문자열을 분리하기 위해서는 split() 메소드를 이용하거나 StringTokenizer 클래스를 이용할 수 있다.
split() 메소드는 정규 표현식으로 구분하고, StringTokenizer는 문자로 구분한다는 차이가 있다.
문자열이 한 종류의 구분자로 연결되어 있을 경우, StringTokenizer를 이용하면 손쉽게 문자열을 분리해 낼 수 있다.
String text = "Jason,Kyle,Adam";
StringTokenizer st = new StringTokenizer(text, "/");
이렇게 코드를 작성할 경우, StringTokenizer 객체에는 "Jason" , "Kyle", "Adam" 이렇게 세 개의 토큰이 존재하게 된다.
StringTokenizer 객체에 있는 토큰을 이용할 때 사용할 수 있는 메소드는 다음과 같다.
리턴타입 | 메소드 | 사용 |
int | countTokens() | 꺼내지 않고 남아 있는 토큰의 수 |
boolean | hasMoreTokens() | 남아 있는 토큰이 있는지 여부 |
String | nextToken() | 토큰을 하나씩 꺼내옴 |
nextToken() 메소드로 토큰을 하나씩 꺼내올때 마다, StringTokenizer 객체에는 해당 토큰이 없어진다.
만약 StringTokenizer 객체에서 더 이상 가져올 토큰이 없는데 nextToken() 메소드를 사용하게 되면,
NoSuchElementException이 발생하기 때문에, hasMoreTokens() 메소드를 통해서 토큰이 남아 있는지 여부를 먼저 검사해야 한다.
String text = "Jason,Kyle,Adam";
StringTokenizer st = new StringTokenizer(text, "/");
while (st.hasMoreTokens()) {
String token = st.nextToken();
System.out.println(token);
}
while문에서 hasMoreTokens() 메소드를 통해 StringTokenizer 객체에 토큰이 남아 있는지 먼저 검사한다.
남아 있다면, nextToken() 메소드를 통해 토큰을 가져온다.
3. StringBuffer, StringBuilder 클래스
문자열을 저장하는 String 클래스는 문자열을 수정할 수 없다.
만약 String 클래스의 메소드를 이용해 문자열을 추가하거나 대치하거나 수정하였다면,
그것은 문자열을 변경한 것이 아니라 변경한 것 처럼 보이는 새로운 문자열을 생성한 것이다.
따라서 String 클래스의 메소드를 많이 이용하게 되면, String 객체의 수도 그만큼 많이 늘어나게 된다.
이는 메모리를 낭비하여 프로그램의 성능을 느리게 하는 요인이 될 수 있다.
문자열을 변경하는 작업이 많을 경우에는 java.lang 패키지의 StringBuffer 혹은 StringBuilder 클래스를 사용하는 것이 좋다.
이들은 내부 버퍼(buffer: 데이터를 임시로 저장하는 메모리)에 문자열을 저장해두고 그 안에서 추가, 수정, 삭제 작업을 할 수 있도록 설계되어 있기 때문이다.
StringBuffer와 StringBuilder는 사용 방법이 동일하나, StringBuffer는 멀티 스레드 환경에서, StringBuilder는 단일 스레드 환경에서 사용할 수 있다.
아래는 StringBuffer와 StringBuilder에서 사용할 수 있는 메소드이다.
메소드 | 사용 |
append(...) | 문자열 끝에 주어진 매개값을 추가 |
insert(int offset, ...) | 문자열 중간에 주어진 매개값을 추가 |
delete(int start, int end) | 문자열의 일부분을 삭제 |
deleteCharAt(int index) | 문자열에서 주어진 index의 문자를 삭제 |
replace(int start, int end, String str) | 문자열의 일부분을 다른 문자열로 대치 |
reverse() | 문자열의 순서를 뒤바꿈 |
setCharAt(int index, char ch) | 문자열에서 주어진 index의 문자를 다른 문자로 대치 |
본 게시글은 여기서 마치겠습니다.
읽어주셔서 감사하고, 혹시나 틀린 부분이나 보완해야할 부분이 있다면 댓글에 남겨주세요~!