본문 바로가기
Back-End/Java

[java] 자바 String, StringBuffer, StringTokenizer 클래스

by LeeGangEun 2022. 2. 15.

String 클래스

 • String 클래스는 내부 문자열에 대한 수정이 불가능하다. (내용 불변 : Immutable)

 • 문자열의 내용이 변경되면 새로운 객체를 생성하며 참조 대상을 잃어버린 객체는 가비지 값이 된다.

 • String 클래스 간 '+' 연산자를 사용하게 되면 문자열 간의 결합이 가능하다.

 • String클래스와 다른 클래스 객체, 기본형 데이터 간에 '+' 연산자를 사용하는 경우에도 내부적으로 자동 String 클래스로 변환된다.

 • String은 내부 문자열의 내용을 변경할 수 없기 때문에 '+' 연산자를 사용하여 결합하면 내부적으로 StringButter를 생성하여   append() 메서드를 이용해 문자열에 대한 결합을 수행한다.

 • 정적인 문자열을 처리하는 경우 주로 String 클래스를 사용한다.

 • 동적인 문자열을 처리하는 경우 런타임 시 동적으로 처리해주는 StringBuffer 클래스를 사용하는 것이 효율적이다.

String 객체 생성 방법 

// 스트링 리터럴로 스트링 객체 생성
String str1 = "abcd";

// String 클래스의 생성자를 이용하여 스트링 생성
char data[] = {'a', 'b', 'c', 'd'};
String str2 = new String(data);
String str3 = new String("abcd"); // str2와 str3은 모두 "abcd" 스트링

String 객체 수정 불가능

String 주요 메소드

클래스의 객체 생성 및 활용 예시

public class StringEx {
	public static void main(String[] args) {
		String a = new String(" C#");
		String b = new String(",C++ ");
		
		System.out.println(a + "의 길이는 " + a.length()); // 문자열의 길이(문자 개수)
		System.out.println(a.contains("#")); // 문자열의 포함 관계

		a = a.concat(b); // 문자열 연결
		System.out.println(a);

		a = a.trim(); // 문자열 앞 뒤의 공백 제거
		System.out.println(a);

		a = a.replace("C#","Java"); // 문자열 대치
		System.out.println(a);

		String s[] = a.split(","); // 문자열 분리
		for (int i=0; i<s.length; i++)
			System.out.println("분리된 문자열" + i + ": " + s[i]);

		a = a.substring(5); // 인덱스 5부터 끝까지 서브 스트링 리턴
		System.out.println(a);

		char c = a.charAt(2); // 인덱스 2의 문자 리턴
		System.out.println(c);
	}
}

---------------------------------------결과값---------------------------------------------
C#의 길이는 3
true
 C#,C++
C#,C++
Java,C++
분리된 문자열0: Java
분리된 문자열1: C++
C++
+

------------------------------------------------------------------------------------------

indexOf() 메소드

indexOf() 메소드ㅡ는 (indexOf(String s)) 찾고자 하는 대상 문자열에 s 문자열이 존재하는 경우

그 문자열 시작 위치를 반환해준다. 만약 s 문자열을 찾지 못했다면 -1을 반환한다.

(뒤에서부터 검사하고 싶은 경우에는 lastIndexOf() 메서드 사용 가능)

String name = "Lee Gang Eun";

System.out.println(name);
// Lee Gang Eun;

System.out.println(name.indexOf("Lee"));
// 0

System.out.println(name.indexOf("asfda"));
// -1

System. out.println(name.indexOf("Eun"));
// 9

replaceAll(), replace() 메소드

rePlaceAll() 메소드는 (replaceAll(String a, String b), replace(String a, String b)) 해당 객체 문자열에서

a가 들어간 문자열을 b로 바꿔준다. 둘의 차이는 정규식을 사용할 수 있냐에 있다. (replaceAll 정규식 사용가능)

s = "우리나라 대한민국 대한독립 만세";
s = s.replaceAll("대한", "자주");
System.out.println(s);
//--==>> 우리나라 자주민국 자주독립 만세

s = "abcabcabcaaabcd";     
s = s.replace("abc", "T");	
System.out.println(s);
//--==>> TTTaaTd      

s = "abcabcabcaaabcd"; 
System.out.println(s.replace("abc", "T"));
System.out.println(s.replaceAll("[abc]", "T"));
//--==>> TTTaaTd // TTTTTTTTTTTTTTd
//		 TTTTTTTTTTTTTTd

 

StringBuffer 클래스

 • StringBuffer 클래스는 문자열을 처리하는 클래스이다

 • String과 차이점은 String은 내부 문자 수정이 불가능하지만 Buffer는 내부문자열을 변경할 수 있다.

 • 가변적인 길이를 가져 객체를 생성하는 시점에서 크기값을 지정하거나 실행 시점에 버퍼 크기를 바꿀 수 있다.

StringBuffer 주요 메소드

StringBuffer 클래스 메소드 활용 예시

public class StringBufferEx {
	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer("This");

		sb.append(" is pencil"); // 문자열 덧붙이기
		System.out.println(sb);

		sb.insert(7, " my"); // "my" 문자열 삽입
		System.out.println(sb);

		sb.replace(8, 10, "your"); // "my"를 "your"로 변경
		System.out.println(sb);

		sb.delete(8, 13); // "your " 삭제
		System.out.println(sb);

		sb.setLength(4); // 스트링 버퍼 내 문자열 길이 수정
		System.out.println(sb);
	}
}


---------------------------------------결과값--------------------------------------------------

This is pencil
This is my pencil
This is your pencil
This is pencil
This

---------------------------------------------------------------------------------------------

append() 메소드

 • StringBuffer 클래스는 String과 다르게 '+' 연산을 지원하지 않는다. 그렇기 때문에 문자열을 서로 합치는 작업을 할 때엔 append() 메소드를 사용해야 한다.

toUpperCase(), toLowerCase() 메소드

 • toUpperCase() 메소드는 문자열에 존재한 모든 알파벳 문자를 대문자로 변경한다.

 • toLowerCase() 메소드는 문자열에 존재한 모든 알파벳 문자를 소문자로 변경한다.

insert() 메소드

 • insert() 메소드는 (insert(int idx, String s)) 해당 idx 위치에  s 문자열을 추가해주는 기능을 한다.

delete() 메소드

• delete() 메소드는 (delete(int start, int end) start 위치의 문자부터 end 문자 바로 전까지 모든 문자를 삭제한다.

StringTokenizer 클래스

• 문자열 파싱(parsing)을 제공하는 클래스로 파싱하고자 하는 문자열을 인자로 받아 생성한다.

• 파싱 - 하나의 문자열을 여러 문자열로 나누는 작업을 의미하며, 나누는 단위가 되는 문자열을 토큰(token) 이라고 한다.

• 호환성을 유지하는 목적으로 보관 유지되고 있다.

• 문자열을 파싱하기 위해서는 String클래스의 split()이나, java.util.regax 패키지를 사용할 것을 권장하고 있다.

StringTokenizer 클래스 사용 예시

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.StringTokenizer;

public class Test145
{
	public static void main(String[] args) throws IOException
	{
		String strTemp;
        String[] strArr;
		int n;
       
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

	    System.out.print("파싱할 문자열 입력(컴마구분) : ");
		strTemp = br.readLine();

		// 테스트(확인)
        //System.out.println(strTemp);
		//--==>> 사과,딸기,바나나

		// StringTokenizer 클래스 인스턴스 생성
		StringTokenizer st = new StringTokenizer(strTemp, ",");
		//-- strTemp 를 대상 문자열로...
		//   [,]를 구분자로...

		strArr = new String[st.countTokens()];
		// [int countTokens()]
		// : 파싱된 문자열의 갯수를 리턴(반환)한다.
		//-- [String[] strArr = new String[3];] 와 동일한 구문

		n = 0;
        while(st.hasMoreTokens()) // 다음값 있는지 망보는 작업 (true, false)
		{
        		strArr[n++] = st.nextToken();
        }
        // [hasMoreTokens()]
        // : 사용할 수 있는 토큰이 남아있는 경우 true를 반환.
		// 더 이상 사용할 토큰이 남아있지 않은 경우 false를 반환.
		//    확인 결과에 대한 반환만 할 뿐...
		// 실제 내용을 읽어들이는 헤드를 이동시키지 않는다.
		// [nextToken()]
		//  : 다음 토큰을 얻어온다.
		// 다음 토큰을 얻어오며 헤드를 이동시키게 된다.
		// 구분자를 바꾸었을 경우 다음 호출에도 
		// 바뀐 구분자를 이용하여 토큰을 분리한다.

		System.out.println();
		System.out.print("파싱된 토큰(문자열) : ");
		for(String str : strArr)
			System.out.print(str + " ");
		System.out.println();