join() 과 StringJoiner

 

✔ Join()

: static 메서드

: 여러 문자열 사이에 구분자를 넣어서 결합

String animals = "dogs, cats, bears";
String [] arr = animals.split(","); // 문자열을 ','구분자로 나눠서 배열에 저장
String str = String.join("-",arr); // 클래스메서드니까 클래스명으로 소환
String str2 = String.join("",arr); // 구분자가 없을땐 ""
System.out.println(str); // dogs-cats-bears
System.out.println(str2); // dogscatsbears   buffer 사용으로 좀더 효율적인 코드가 됨
// System.out.println()내부에서 "+"(덧셈)으로 붙이는것과 동일. 객체가 계속 생성되므로 효율이 떨어짐

 

 

 

문자열과 기본형간의 변환

 

✔ 숫자를 문자열로 바꾸는 방법

: 숫자+""(빈문자열)

int i = 100;
String str1 = i+""; // 100을 "100"으로 변환 1 (편리)
String str2 = String.valueOf(i); // 100을 "100"으로 변환 2 (빠름)

 

✔ 문자열을 숫자로 바꾸는 방법

int i=Integer.parseInt("100"); // "100"을 100으로 변환1
int i2=Integer.valueOf("100"); // "100"을 100으로 변환2
Integer i2 = Integer.valueOf("100"); // 엄밀히 말하면 참조형으로 변환되지만 기본형으로 써도 상관없음.
기본형 → 문자열 문자열 → 기본형
String.valueOf(type t) type.parseType(String s) == rapper class
각 타입마다 이름이 다름
type.valueOf(String s)
래퍼클래스가 번거로워서 valueOf로 통일함.
String String.valueOf(boolean b);
String String.valueOf(int i);
String String.valueOf(char c);
String String.valueOf(float f);

* byte,short를 문자열로 변경시
String valueOf(int i) 사용
boolean Boolean.parseBoolean(String s);
int Integer.parseInt(String s);
float Float.parseFloat(String s);
double Double.parseDouble(String s);
Integer.valueOf(String s);
double.valueOf(String s);

 

 


 

 

StringBuffer class

 

✔ StringBuffer

: 문자열을 저장하고 다루기 위한 클래스

: String 처럼 문자형 배열(char []) 을 내부적으로 가지고 있다.

: String은 불변이지만 StringBuffer는 내용을 변경할 수 있다 (mutable) 가변. 변경가능.

👉 기본적인 문자열은 String이지만 변경이 많을 경우는 StringBuffer사용

StringBuffer sb = new StringBuffer("abc");
sb.append("123"); //sb의 내용 뒤에 123을 추가. 배열에 abc123으로 들어감

 

 

 

StringBuffer의 생성자

 

: 배열은 길이 변경불가.

→ 공간이 부족하면 1. 새로운 배열을 생성(tmp)해서 2. 복사  &  3.참조 변경 (새로운 주소를 변수에 저장해줌)

→ StringBuffer는 가변이므로 저장할 문자열의 길이를 고려해서 적절한 크기로 생성

public StringBuffer (int length){ // 길이값인 int를 매개로 갖는다
	value = new char[length];
    shared = false;
}

public StringBuffer(){	// 버퍼의 크기를 지정하지않으면 기본적으로 16이 들어감
	this(16);
}

public StringBuffer(String str){ // 문자열을 넣을시 문자열+16으로 더 크게 버퍼를 생성함
	this(str.length()+16);	// 생성
    append(str);	// append로 문자열을 붙임
}

 

 

 

 

StringBuffer의 변경

: 추가, 삭제, 삽입이 가능한 append(), delete(), insert()를 가지고있다

: 이 메서드들의 반환 타입은 Stringbuffer이므로 자기자신에 대한 참조를 반환한다.

 

✔ append() 

: StringBuffer는 String과 달리 내용 변경이 가능

 

StringBuffer sb  = new StringBuffer("abc");

sb.append("123"); // sb의 내용 뒤에 "123"을 추가

 

: append()는 지정된 내용을 StringBuffer에 추가 후, StringBuffer의 참조를 반환

StringBuffer sb2=sb.append("zz"); // 참조변수 sb가 가리키는 내용 뒤에 "zz"를 추가해서 그 주소를 sb2에 반환.

👉 즉 sb와 sb2는 같은 객체를 가리키고 있게 됨.

System.out.println(sb); //abc123zz

System.out.println(sb2); //abc123zz

 

StringBuffer sb = new StringBuffer("abc");
sb.append("123");
sb.append("ZZ");

// 이는 아래 식과도 동일. 성능상 차이는 없으나 코드가 좀더 간결해짐

StringBuffer sb = new StringBuffer("abc");
sb.append("123").append("ZZ"); // sb.append("ZZ")와 동일

 

 

 

 

 

StringBuffer의 주의점

 

: StringBuffer는 equals()가 오버라이딩 되어 있지 않다. (주소비교)

👉 String은 equals()가 오버라이딩 되어 있어서 내용 비교 됨.

StringBuffer sb = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");

System.out.println(sb==sb2); // false
System.out.println(sb.equals(sb2)); // false

// StringBuffer을 String으로 변환 후에 equals()로 비교해야 한다.

String s = sb.toString(); // sb를 String으로 변환
String s2 = sb2.toString();

System.out.println(s.equals(s2)); // true

 

 

+ Recent posts