[국비][JAVA] 가변 객체 StringBuffer 알아보기
▶ (참고) 불변 객체 String 알아보기
https://zoooom-in.tistory.com/114
[국비][JAVA] 불변 객체 String 알아보기
▶ 참고 사이트https://docs.oracle.com/en%2Fjava%2Fjavase%2F17%2Fdocs%2Fapi%2F%2F/java.base/java/lang/String.html String (Java SE 17 & JDK 17)All Implemented Interfaces: Serializable, CharSequence, Comparable , Constable, ConstantDesc The String clas
zoooom-in.tistory.com
toString() 오버라이딩 및 출력 |
- StringBuffer와 StringBuilder는 내부적으로 가변적인 문자열을 처리할 수 있는 클래스 - 이 두 클래스 모두 Object 클래스로부터 상속받은 toString() 메서드를 오버라이딩하여, 저장된 문자열을 반환 - sb.toString()을 호출하면, StringBuffer나 StringBuilder 객체에 저장된 문자열이 반환됩니다. |
[예제 코드]
public class StringBufferMain1 {
public static void main(String[] args) { //멀티 쓰레드에 많이 사용
StringBuffer sb = new StringBuffer(); //이뮤터블 변하는 객체
System.out.println(sb); //참조값 출력
sb.append("hello").append(" java"); //메서드 체이닝 가능
System.out.println("sb = " + sb);
//String type으로 StringBuffer를 담기위해선 toString()을 꼭해야한다!!
//객체 생성시는 toString()이 호출되지만, 어딘가에 담을때 toString()이 호출되지 않는다.
String newSb = sb.toString(); //String으로 변경
System.out.println(newSb);
}
}
StringBuilder 객체를 String으로 형변환 불가 |
- StringBuilder나 StringBuffer 객체를 String 타입으로 직접 형변환(cast)할 수 없는 이유는 이들이 서로 다른 클래스이기 때문 - StringBuilder와 String은 서로 다른 참조 타입이고, 상속 관계에 있지 않음 ∴ 따라서 형변환이 불가능하며, toString() 메서드를 이용해 문자열을 얻어야 함 |
ToString()은 객체의 문자열 표현을 반환하는 역할을 함
[참고하면 좋을 것]
* toString()이란?
- toString() 메서드는 객체의 상태를 사람이 읽기 쉬운 문자열로 표현하는 것을 목표
- 이 메서드는 디버깅, 로깅, 콘솔 출력 등에서 유용하게 사용
- toString() 메서드는 객체를 문자열로 "변환"하는 것이 아니라, 객체의 문자열 표현을 반환하는 것
- System.out.println() 메서드는 객체를 출력할 때 내부적으로 toString() 메서드를 호출
ⓛ 참조형과 'toString()'
- 모든 Java 객체는 Object 클래스를 상속받고, Object 클래스에는 기본적으로 toString() 메서드가 정의되어 있음
- 기본 toString() 메서드는 다음과 같은 형식의 문자열을 반환
getClass().getName() + "@" + Integer.toHexString(hashCode())
② String, StringBuilder, StringBuffer
String str = "example";
System.out.println(str.toString()); // "example" 출력
System.out.println(str); // 내부적으로 str.toString()이 호출되어 "example" 출력
③ 기본형과 'toString()'
- 기본형 타입 (int, char, double 등)은 객체가 아니므로 toString() 메서드를 가지고 있지 않음
- 기본형 값을 문자열로 변환하려면, 래퍼 클래스(Integer, Character, Double 등)의 toString() 메서드를 사용
int number = 42;
System.out.println(Integer.toString(number)); // "42" 출력
System.out.println(number); // "42" 출력, 기본형은 자동으로 문자열로 변환되어 출력
④ StringBuilder.toString()이 String type이 되는 과정
public static void main(String[] args) { //멀티 쓰레드에 많이 사용
StringBuilder sb = new StringBuilder();
sb.append("hello").append(" java");
System.out.println(sb); // 내부적으로 sb.toString()이 호출되어 "hello java" 출력
//sb.toString()은 StringBuilder 객체의 현재 문자열 값을 반환 (==객체 상태를 문자열로 표현)
//StringBuilder나 StringBuffer 객체에 저장된 문자열을 String 타입으로 얻고자 할 때 toString() 메서드를 호출
StringBuilder sb = new StringBuilder();
sb.append("hello").append(" java");
String newSb = sb.toString(); // String으로 변경
System.out.println(newSb); // "hello java" 출력
//toString() 메서드를 호출한다고 해서 StringBuilder 객체 자체가 String 객체로 변환되는 것 아님
//대신, toString() 메서드는 StringBuilder 객체가 내부적으로 가지고 있는 문자열 데이터를 String 객체로 반환
//이 반환된 String 객체는 StringBuilder 객체와는 별개의 새로운 객체
}
∴ sb가 가지고 있는 문자열 데이터를 기반으로 새로운 String 객체가 반환된다는 것