String은 기본 자료형처럼(= int, float, char, boolean) 자주 사용되는 class이다. 여기서 처럼이란 의미는 String은 이 기본 자료형들과는 다르게 참조 자료형 class라는 것이다. 참조 자료형이란 객체 자체에 값을 가지는 것이 아닌 객체에는 referenece(주소) 값을 갖고 있고 해당 reference에 객체의 값이 있는 형태다. 여기서 String을 생성하는 방법이나 기타 기본이 되는 내용은 생략하고 정리하겠다. 기본 method는 String api를 확인할 것을 추천한다.
위에서 언급한 내용처럼 String은 참조 변수이기 때문에 ==으로 비교시 새로 생성된 두 객체의 주소값은 당연히 다르므로 false가 나온다. 그렇기 때문에 우리가 equal()을 사용하고 있는 이유가 된다. 이점을 기억해두자!
String 객체는 immutable(불변적) 특징을 가지고 있다. 불변적이란 String 객체는 편집할 수 없다는 것을 의미한다. 하지만 우리는 지금까지
String str = "new";
str = str+" world";
이런 방식으로 String 객체의 값을 편집하여 사용한다고 생각하고 있었다. 하지만 이는 우리가 편집이 되는 것처럼 느껴질 뿐 실제로는 기존 String 객체의 참조변수를 버리고 편집된 새로운 String 객체의 참조변수로 바꿔치기 되는 것이다. 그렇다면 String 객체를 가지고 계속해서 편집을 하게된다면 무의미한 객체들이 계속해서 생성된다는 의미이다. 한 두번이면 괜찮을거 같지만 여러번 반복적으로 사용된다면 메모리 관리적으로 한번 고려해야할 부분이다. 그래서 이런 문제점을 해결하기 위해 StringBuffer class가 있다.
String class는 불변적인 특징으로 변경이 불가능하지만 StringBuffer class는 내부적으로 직접 변경할 수 있는 클래스다. 변경이 자주 사용되는 객체일 수록 계속 객체를 새로 생성하는 String보다 메모리의 임시적 공간(buffer)을 사용하는 StringBuffer class를 사용하는 것이 메모리적 측면에서 바람직하다.
StringBuffer class는 생성되어질 때 실제 용량보다 항상 16문자가 더 긴 공간을 메모리로 부터 할당받는데 이 공간이 문자열의 일부분을 삭제하거나 수정할때 또는 특정 위치에 추가할 때 필요로 하는 공간이다.
StringBuffer는 String class와 다르게 무분별한 객체 생성을 하지 않는다는 것이며 직접 수정할 수 있는 가변성의 특징이 있다. 그러므로 빈번한 수정 작업이 필요한 경우에는 StringBuffer class가 좀 더 유리하다는 것을 기억하자.
String은 워낙 자주 사용하는 class라 정리하지 않았지만 StringBuffer는 주요 메서드만 정리하려고 한다.
SpringTokenizer 클래스는 문자열을 분할할 수 있는 기능을 제공하는 클래스이다.
생성자
메서드
이렇게 보면 우리가 주로 사용한 split이라는 메서드와 별 차이점을 느끼지 못하겠다. 하지만 분명 차이가 존재한다. 그것을 코드로 보자
class StringTokenTest{
public static void main(String[] args){
String str = "a,b,c,,,d";
System.out.println("-----split-----");
String[] sp = str.split(",");
for(String s : sp){
System.out.println(s);
}
System.out.println("-----stringTokenizer-----");
StringTokenizer token = new StringTokenizer(str, ",");
while(token.hasMoreTokens()){
System.out.println(token.nextToken());
}
}
}
위 코드를 실행시켜보자
다음과 같은 결과를 확인할 수 있다. 이 결과를 통해 split은 우리가 정해준 ','를 통해 문자열을 구분하고 공백또한 문자로 취급한다. 하지만 StringTokenizer는 공백은 제외하고 문자가 있을때만 문자로 취급한다. 이 둘중에 StringTokenizer가 속도도 더 좋다고 한다. 정확한 이유까진 모르겠다ㅜㅜ 하지만 이 둘은 상황에 맞게 잘 사용하면 좋을것 같다.