String, StringBuffer, StringBuilder, StringTokenizer

2019. 5. 22. 11:27JAVA관련

JAVA에서는 문자열 데이터 타입으로 가장 많이 쓰는 것이 String 이다. 그러나 String은 기초데이터가 아니라 객체데이터인데, 특이하게도 생성자(new)를 사용하지 않고 초기화를 한다. 

 

String 변수에는 " "로 문자열을 감싸주면 이를 문자열로 인식해서 값을 넣을 수 있다.

 

String에는 문자열과 관련된 주요 메소드들이 있다.

 

concat(String str) : 저장된 문자열과 str 문자열을 결합

substring(int begin) : 시작 위치부터 마지막까지의 문자열을 반환

int length() : 문자열 길이를 반환

toUpperCase() : 대문자로 반환

toLowerCase() : 소문자로 반환

boolean equals(String str) : 지정된 문자열과 str 문자열이 같은지 비교

boolean equalsIgnoreCase(String str) : 대소문자 구분없이 지정된 문자열과 str문자열이 같은지 비교

trim() : 문자열 앞 뒤 공백제거

replace(char old, char new) : 문자열 내의 old문자를 new 문자로 반환

replaceAll(String old, String new) : 문자열 내의 old문자열을 new로 반환.

 

String 클래스는 위와 같이 편리한 메소드를 많이 갖고 있지만, 메모리와 관련해서 약간의 문제가 있다. String은 위의 메소드를 사용할 경우 기존 메모리에 들어있는 String객체의 문자열을 바꾸는 것이 아니라 바뀐 내용을 같은 String 객체를 새로 생성하기 때문이다. 물론 최근에는 메모리의 크기가 워낙 크게 늘어나서 사실 String을 아무리 많이 만들어도 성능상에 큰 이슈가 생길 가능성은 높지 않다. hashCode()메소드를 통해 본다면, 같은 String 객체의 변수 값을 바꾸었을 때, 주소 값이 바뀌는 것을 확인할 수 있다.

 

따라서 이러한 경우에는 StringBuffer와 StringBuilder 클래스를 사용하는 편이 좀 더 효율적이다.

두 클래스는 문자열 조작에 적합하게 만들어져 있는 클래스로, 객체 내부에 있는 버퍼(데이터를 임시 저장하는 메모리)에 문자열의 내용을 저장해두고 그 안에서 작업을 한다. 이 클래스를 활용하면 새로운 객체를 만들지 않고도 문자열 조작을 할 수 있다. 

 

주요 메소드는 다음과 같다

append(String str) : 문자열 str 추가

insert(int idx, String str) : 특정 index에 문자열 str 추가

deleteCharAt(int idx) : index위치의 특정 문자 한 개 삭제

int capacity() : 문자열 크기를 반환

ensureCapacity(int size) : 버퍼의 크기를 size만큼 늘리는 메소드

trimToSize() : 과도한 버퍼 크기를 적당하게 줄이는 메소드

 

 

	public static void main(String[] args) {
    
		StringBuilder strBuilder = new StringBuilder("abc");
		strBuilder.append("def");
		System.out.println(strBuilder);	//abcdef
        
		strBuilder.insert(3, "AAA");
		System.out.println(strBuilder);	//abcAAAdef
        
		strBuilder.delete(3, 5);	//3번째부터 5앞에까지 삭제
		System.out.println(strBuilder);	//abcAdef
        
		strBuilder.deleteCharAt(5);
		System.out.println(strBuilder);	//abcAdf
        
		int buffersize = strBuilder.capacity();
		System.out.println("빌더 크기 "+buffersize);
        
		strBuilder.ensureCapacity(100);
		buffersize = strBuilder.capacity();
		System.out.println("빌더 크기 "+buffersize);
        
	}

 

문자열을 분할할 때는 또 다른 클래스를 주로 사용하는데, 바로 StringTokennizer 이다. 

 

public class StringTokennizerEx {
	
	public static void main(String[] args) {
		
		String str1 = "유아인 황정민 강동원 김윤석 하정우";
		String str2 = "2019/05/22";
		
        //문자열을 분리한다
		StringTokenizer tokenizer1 = new StringTokenizer(str1);
		StringTokenizer tokenizer2 = new StringTokenizer(str2, "/");
		
		System.out.println("tokenizer1 토큰수 : "+tokenizer1.countTokens());
		System.out.println("tokenizer2 토큰수 : "+tokenizer2.countTokens());
		
        //분리한 문자열을 반복문으로 출력
		while(tokenizer1.hasMoreTokens()){
			System.out.print(tokenizer1.nextToken()+"\t");
		}
		
		while(tokenizer2.hasMoreTokens()){
			System.out.print(tokenizer2.nextToken()+"\t");
		}
	}	
}

위의 예제 코드를 통해 StringTokennizer가 활용되는 방식을 알 수 있다.

 

'JAVA관련' 카테고리의 다른 글

POJO 의 개념  (0) 2019.05.20
Enum  (0) 2019.05.16