String

최준호·2021년 7월 6일
0

java

목록 보기
8/25

String 이란

String은 기본 자료형처럼(= int, float, char, boolean) 자주 사용되는 class이다. 여기서 처럼이란 의미는 String은 이 기본 자료형들과는 다르게 참조 자료형 class라는 것이다. 참조 자료형이란 객체 자체에 값을 가지는 것이 아닌 객체에는 referenece(주소) 값을 갖고 있고 해당 reference에 객체의 값이 있는 형태다. 여기서 String을 생성하는 방법이나 기타 기본이 되는 내용은 생략하고 정리하겠다. 기본 method는 String api를 확인할 것을 추천한다.

String의 비교

위에서 언급한 내용처럼 String은 참조 변수이기 때문에 ==으로 비교시 새로 생성된 두 객체의 주소값은 당연히 다르므로 false가 나온다. 그렇기 때문에 우리가 equal()을 사용하고 있는 이유가 된다. 이점을 기억해두자!

String 객체의 불변적 특징

String 객체는 immutable(불변적) 특징을 가지고 있다. 불변적이란 String 객체는 편집할 수 없다는 것을 의미한다. 하지만 우리는 지금까지

String str = "new";
str = str+" world";

이런 방식으로 String 객체의 값을 편집하여 사용한다고 생각하고 있었다. 하지만 이는 우리가 편집이 되는 것처럼 느껴질 뿐 실제로는 기존 String 객체의 참조변수를 버리고 편집된 새로운 String 객체의 참조변수로 바꿔치기 되는 것이다. 그렇다면 String 객체를 가지고 계속해서 편집을 하게된다면 무의미한 객체들이 계속해서 생성된다는 의미이다. 한 두번이면 괜찮을거 같지만 여러번 반복적으로 사용된다면 메모리 관리적으로 한번 고려해야할 부분이다. 그래서 이런 문제점을 해결하기 위해 StringBuffer class가 있다.

StringBuffer

String class는 불변적인 특징으로 변경이 불가능하지만 StringBuffer class는 내부적으로 직접 변경할 수 있는 클래스다. 변경이 자주 사용되는 객체일 수록 계속 객체를 새로 생성하는 String보다 메모리의 임시적 공간(buffer)을 사용하는 StringBuffer class를 사용하는 것이 메모리적 측면에서 바람직하다.

StringBuffer class는 생성되어질 때 실제 용량보다 항상 16문자가 더 긴 공간을 메모리로 부터 할당받는데 이 공간이 문자열의 일부분을 삭제하거나 수정할때 또는 특정 위치에 추가할 때 필요로 하는 공간이다.

StringBuffer는 String class와 다르게 무분별한 객체 생성을 하지 않는다는 것이며 직접 수정할 수 있는 가변성의 특징이 있다. 그러므로 빈번한 수정 작업이 필요한 경우에는 StringBuffer class가 좀 더 유리하다는 것을 기억하자.

주요 method

String은 워낙 자주 사용하는 class라 정리하지 않았지만 StringBuffer는 주요 메서드만 정리하려고 한다.

  • append(String str) : StringBuffer
  • StringBuffer에 인자로 전달된 str을 덧붙인다.
  • delete(int start, int end) : StringBuffer
  • 전달된 start와 end 사이의 문자열을 삭제한다.
  • insert(int start, String str) : StringBuffer
  • 전달된 start 위치에 str을 삽입한다.
  • replace(int start, int end, String str) : StringBuffer
  • 전달된 start와 end 사이에 문자열을 str로 변환한다.
  • capacity() : int
  • 현재 용량(buffer의 길이)를 반환한다.
  • setLength(int newLength) : void
  • StringBuffer 객체 내에 포함되어 있는 문자열의 길이를 newLength로 다시 설정한다.
  • toString() : String
  • StringBuffer 객체를 String 객체로 반환한다.

SpringTokenizer

SpringTokenizer 클래스는 문자열을 분할할 수 있는 기능을 제공하는 클래스이다.

생성자

  • StringTokenizer(String str)
  • 전달된 str을 기본 구분자인 공백, 엔터, tab 등의 구분자로 분할하여 토큰을 생성
  • StringTokenizer(String str, String delim)
  • 전달된 str을 delim으로 구분문자로 하여 분할하여 토큰을 생성
  • StringTokenizer(String str, String delim, boolean returnDelims)
  • 전달된 str을 delim으로 구분문자로 하여 분할하고 토큰을 생성할 때 세번째인 returnDelims에 의해 토큰으로 사용할 것인지 결정

메서드

  • countTokens() : int
  • token된 자원의 수를 반환
  • hasMoreTokens() : boolean
  • token할 수 있는 자원이 있을 경우 true, 없으면 false
  • nextToken() : String
  • token된 자원 반환

이렇게 보면 우리가 주로 사용한 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가 속도도 더 좋다고 한다. 정확한 이유까진 모르겠다ㅜㅜ 하지만 이 둘은 상황에 맞게 잘 사용하면 좋을것 같다.

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글