이 게시글은 이것이 자바다(저자 : 신용권, 임경균)의 책과 동영상 강의를 참고하여 개인적으로 정리하는 글임을 알립니다. 


String은 내부 문자열을 수정할 수 없다.

아래의 코드를 보면 다른 문자열을 결합해서 내부 문자열을 변경하는 것처럼 보이지만 사실 'ABCDEF'라는 새로운 String 객체를 생성하는 것이다. 그리고 data 변수는 새로 생성된 String 객체를 참조하게 된다.

String data = "ABC";
data += "DEF";

문자열의 + 연산은 새로운 String 객체가 생성되고 이전 객체는 계속 버려지는 것이기에 효율이 좋지 못하다.

잦은 문자열 변경 작업을 해야 한다면 String 보다는 StringBuilder를 사용하는 것이 좋다.

 

StringBuilder 클래스

StringBuilder는 내부 버퍼에 문자열을 저장해두고 그 안에서 추가, 수정, 삭제 작업을 하도록 설계되어 있다.

따라서 String처럼 새로운 객체를 만들지 않고도 문자열을 조작할 수 있다.

리턴 타입 메소드(매개변수) 설명
StringBuilder append(문자열) 문자열을 끝에 추가
StringBuilder insert(위치, 문자열) 문자열을 지정 위치에 추가
StringBuilder delete(시작 위치, 끝 위치) 시작 위치 ~ 끝 위치 -1를 삭제
StringBuilder replace(시작 위치, 끝 위치, 문자열) 문자열 일부를 대체
StringBuilder reverse() 문자열 전체를 뒤집음
String toString() 완성된 문자열을 리턴

 

StringBuilder의 객체 생성은 아래와 같이한다.

StringBuilder sb =  new StringBuilder();

 

toString()을 제외한 다른 메소드는 StringBuilder를 다시 리턴하기 때문에 연이어서 다른 메소드를 호출할 수 있는 메소드 체이닝 패턴을 사용할 수 있다.

따라서 문자열로 리턴하고 싶다면 toString() 메소드를 호출하면 된다.

자바 프로그램의 실행시간을 단축시키고 싶다면
System.out.println()보다 아래의 방법을 이용하는 것이 빠르다.
StringBuilder sb = new StringBuilder();
sb.append("출력할 내용\n");​

 

하지만 위 방법보다 아래의 방법이 더 빠르다.
sb.append("출력할 내용").append('\n');​

 

public class StringBuilderExample {
	public static void main(String[] args) {
		String data = new StringBuilder()
				.append("DEF")
				.insert(0, "ABC")
				.delete(3, 4)
				.toString();
		System.out.println(data);
	}
}
/*
ABCEF
*/

 


 

StringTokenizer 클래스

문자열이 구분자로 연결되어 있을 경우, 구분자를 기준으로 문자열을 분리하려면 String의 split() 메소드를 이용하거나 java.util 패키지의 StringTokenizer 클래스를 사용할 수 있다.

 

문자열에서 &, 쉼표 , 하이픈 등으로 정규 표현식으로 구분된 문자열을 뽑아낼 경우, 정규 표현식으로 분리하는 split() 메소드를 사용해야한다.

 

그러나 여러 종류가 아닌 한 종류의 구분자가 있다면 StringTokenizer를 사용할 수도 있다.

String data = "홍길동/이수홍/박연수";
StringTokenizer st = new StringTokenizer(data, "/");

 

매개값을 문자열 하나만 넘기면, 구분자를 지정하지 않았으므로 스페이스, 탭, 줄바꿈, 캐리지 리턴 등 기본 구분자가 적용된다.

 

리턴 타입 메소드 설명
int CountTokens() 분리할 수 있는 문자열의 총 개수
boolean hasMoreTokens() 남아 있는 문자열이 있는지 여부
String nextToken() 문자열을 하나씩 가져옴
  • CountTokens() : 문자열이 몇개로 분리되었는지 리턴
  • nextToken() : 분리된 문자열을 하나씩 가져옴
  • hasMoreTokens() : 더 가져올 문자열이 있는지 true or false로 리턴
import java.util.StringTokenizer;

public class StringTokenizerExample {
	public static void main(String[] args) {
		String data1 = "홍길동&이수홍,박연수";
		String[] arr = data1.split("&|,");
		for(String token : arr) {
			System.out.println(token);
		}
		System.out.println();

		String data2 = "홍길동/이수홍/박연수";
		StringTokenizer st = new StringTokenizer(data2, "/");
		while (st.hasMoreTokens()) {
			String token = st.nextToken();
			System.out.println(token);
		}
	}
}
/*
홍길동
이수홍
박연수

홍길동
이수홍
박연수
*/

'Java Category > Java' 카테고리의 다른 글

[Java] 제네릭(Generic)  (0) 2023.07.31
[Java] 랜덤 숫자(난수) 얻기  (0) 2023.07.30
[Java] 레코드, 롬복(lombok)  (0) 2023.07.28
[JAVA] API Document  (0) 2023.07.27
[JAVA] 사용자 정의 예외  (0) 2023.07.26