코드일기장

[Java] join(), StringJoiner, StringBuffer 본문

Java

[Java] join(), StringJoiner, StringBuffer

codeStudy123 2022. 2. 17. 16:56

 

 

 

join()

 

join()은 여러 문자열 사이에 구분자를 넣어서 결합하는 메서드이다. 구분자로 문자열을 자르는 split()와 반대의 작업을 한다고 생각하면 이해하기가 쉽다.

 

import java.util.StringJoiner;

public class StringEx {

	public static void main(String[] args) {
		String language = "C,C#,Python,Java";
		String[] strArr = language.split(",");
		for (int i = 0; i < strArr.length; i++) {
			System.out.print(strArr[i]);
		}
		String str = String.join("/", strArr);

		System.out.println("\n" + str);
	}
}
CC#PythonJava
C/C#/Python/Java

 

 

join()과 join()을 사용하지 않고 문자열 결합의 차이

 

 

 

import java.util.StringJoiner;

public class StringEx {

	public static void main(String[] args) {
		String intS = "500";
		String doubleS = "0.85";
		int inum = Integer.valueOf(intS);
		double dnum = Double.valueOf(doubleS);
		String sum = doubleS.valueOf((double) inum + dnum);
		
		System.out.println(intS + "+" + doubleS + "=" + sum + "  +로 결합");  //+ 결합
		System.out.println(String.join("", intS, "+", doubleS, "=", sum, "  join()로 결합"));  //join()으로 결합

	}
}

 

500+0.85=500.85  +로 결합
500+0.85=500.85  join()로 결합

 

 


StringJoiner()

 

join()과 마찬가지로 문자열을 결합할 때 사용하는 메서드이다. java.util.StringJoiner 클래스에서 사용할 수 있는 생성자이다.

 

public class StringEx {

	public static void main(String[] args) {
		StringJoiner sj=new StringJoiner(",", "[" ,"]");
		String[] arr= {"java","db"};
		
		for(String s:arr)
			sj.add(s.toUpperCase());
		System.out.println(sj.toString());
	}
}
[JAVA,DB]

 


 

StringBuffer

String과 달리 StringBuffer는 내용을 변경할 수 있다.

내부적으로 문자열 편집을 위한 버퍼(Buffer)가 존재한다. StringBuffer인스턴스를 생성할 때 그 크기를 지정할 수 있다.

편집할 문자열의 길이를 고려하여 버퍼의 길이를 충분히 잡아주는 것이 좋다. 만약 편집할 문자열이 버퍼의 길이를 넘어서면 버퍼의 길이를 늘려주는 작업을 해야 하기 때문이다.

 

public class final class StringBuffer implements java.io.Serializable{
	private char[] value;
	...
}

String클래스와 StringBuffer클래스는 비슷한 점이 많다. 위에 코드에서처럼 char형 배열을 이용하여 인스턴스 변수 value에 참조하게 된다.

 

 

public class StringEx {

	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer();
		System.out.println(sb.capacity());// buffer=16

		StringBuffer sb2 = new StringBuffer("Hi");
		System.out.println(sb2.capacity());// buffer=18

		StringBuffer sb3 = new StringBuffer(35);
		System.out.println(sb3.capacity());// buffer=35
	}

}
16
18
35
  • 기본적으로 buffer의 길이는 16개의 문자를 저장할 수 있다.
  • 특정 문자열을 넘으면 16+"문자열 길이"만큼 더 해 buffer의 길이를 결정한다.
  • sb3 참조변수처럼 생성부터 buffer의 길이를 설정할 수 있다.

capacity() 메서드는 StringBuffer의 메서드이다 나중에 정리해서 따로 올리겠다.

 

 

 

 

 

내용을 변경할 수 있는 이유는 append()라는 메서드 덕분이다. 반환 타입이 StringBuffer인데 자신의 주소를 반환한다.

public class StringEx {

	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer("Hello");
		StringBuffer sb2 = sb.append(" World");
		sb.append("!!!");
		System.out.println(String.join("", sb, "/ ", sb2));
	}
}
Hello World!!!/ Hello World!!!

 

위 코드처럼 sb에 새로운 문자열이 추가되고 sb자신의 주소를 반환한다. sb.append이기 때문이다. sb 주소를 반환하여 sb2에는 sb의 똑같은 주소가 저장된다.

 

결론적으로 sb와 sb2는 모두 같은 StringBuffer인스턴스를 가리키고 있으므로 같은 내용이 출력되는 것이다.

 

 


 

public class StringEx {

	public static void main(String[] args) {
		StringBuffer sb=new StringBuffer("안녕?");
		sb.append("!!").append("qq");
		System.out.println(sb);
	}
	
}
안녕?!!qq

하나의 StringBuufer인스턴스에 대해 위 코드와 같이 append()를 연속적으로 호출할 수 있다.

 

 


 

마지막으로 StringBuffer의 equals()에 대해 알아보자

 

StringBuffer는 equals()가 오버라이딩되어 있지 않아 내용을 비교하지 않고 주소를 비교한다.

 

 

public static void main(String[] args) {
		StringBuffer sb = new StringBuffer("Hello");
		StringBuffer sb2 = new StringBuffer("Hello");
		System.out.println("sb==sb2? : " + (sb == sb2)); // false
		System.out.println("sb.equals(sb2)? : " + sb.equals(sb2)); // false

		String s = "Hello";
		String s2 = "Hello";
		System.out.println("s==s2? : " + (s == s2));
		System.out.println("s.equals(s2)?  : " + s.equals(s2));

		// equals를 위해 StringBuffer를 toString메서드를 이용해 바꿈
		String s3 = sb.toString();
		String s4 = sb2.toString();

		System.out.println("s3==s4? : " + (s3 == s4));
		System.out.println("s3.equals(s4)?  : " + s3.equals(s4));
}

sb와 sb2는 내용이 같지만 equals()가 StringBuffer에서는 주소를 비교하므로 false가 나왔다.

StringBuffer를 내용으로 비교하고 싶으면 StringBuffer를 String으로 변환해야 한다. (toString())

 

 

sb==sb2? : false
sb.equals(sb2)? : false
s==s2? : true
s.equals(s2)?  : true
s3==s4? : false
s3.equals(s4)?  : true

'Java' 카테고리의 다른 글

[Java] Calendar 클래스  (0) 2022.02.25
[Java] StringBuffer의 생성자와 메서드  (0) 2022.02.18
[Java] String 클래스의 생성자와 메서드  (0) 2022.02.11
[Java] String 클래스  (0) 2022.02.05
[Java] hashCode(), toString()  (0) 2022.02.04
Comments