
변경 가능한 String 클래스
내부적으로 문자열 편집을 위한 버퍼(buffer)를 가짐
public final class StringBuffer impelements java.io.Serializable
{
private char[] value;
...
}
public StringBuffer(int length)
{
value = new char[length];
shared = false;
}
public StringBuffer()
{
this(16); // 버퍼 디폴트 값은 16
}
public StringBuffer(String str)
{
this(str.length() + 16); // 지정 문자열 길이보다 16 더 크게 버퍼 생성
append(str);
}
배열의 길이는 변경 X
새로운 길이의 배열 생성 후 이전 값을 복사해야 함
// 새로운 길이의 배열 생성
char[] newValue = new char[newCapacity];
// 배열 value의 내용을 배열 newValue로 복사한다.
System.arraycopy(value, 0, newValue, 0, count); // count는 문자열의 길이
value = newValue; // 새로 생성된 배열의 주소를 참조변수 value에 저장
append()는 자신의 주소를 반환!!
즉 반환타입이 StringBuffer
StringBuffer sb = new StringBuffer("abc");
sb.append("123");
//sb의 주소 0x100이 sb2 참조변수에 저장됨
// 둘을 서로 같은 인스턴스 가리키고 있음
StringBuffer sb2 = sb.append("ZZ");
System.out.println(sb); // abc123ZZ
System.out.println(sb2); // abc123ZZ
StringBuffer sb = new StringBuffer("abc");
// sb.append("123")이 sb이므로 밑 처럼 사용 가능!
sb.append("123").append("ZZ")
StringBuffer는 String과 다르게 equals 오버라이딩 X
즉 equals 사용시 == 와 같은 결과 얻음
반면 toString은 오버라이딩 되어 있어 문자열을
즉 StringBuffer 인스턴스의 문자열 비교를 위해서는 toStirng을 통해 String 인스턴스 얻은 다음, equals메서드를 사용해 비교해야 함
String s = sb.toString();
String s2 = sb2.toString();
System.out.println(s.equals(s2));
출처 : https://velog.io/@serringg/StringBuffer의-생성자-메소드




StringBuffer -> 멀티쓰레드에 안전하도록 동기화 되어있다
즉 멀티쓰레드로 작성된 프로그램이 아닐 경우 동기화가 성능만 떨어뜨림
동기화 뺀 것이 StringBuilder
성능 향상이 반드시 필요한 경우 아니면 Buffer를 쓰는 것이 좋으며 사용법은 동일하다
수학계산에 유용한 메서드로 구성되어 있다.
생성자가 private이라 다른 클래스에서 Math인스턴스 생성 못함
random() : 임의의 수를 얻을 수 있음
round() : 반올림에 사용한다.
abs() : 절댓값을 반환한다.
ceil() 주어진값을 올림 하여 반환한다.
floor() : 버림하여 반환한다.
모든 메서드는 static, 상수는 E와 PI 값만 있다.
그냥 사용 시 소수점 첫째자리에서 반올림하여 정숫값을 결과로 돌려준다!
// 90.7552라는 값을 소수점 셋째자리에서 반올림 후 두자리 값 까지 얻고 싶은 경우
// 1. 원래의 값에 100을 곱한다.
90.7552 * 100 // 9075.52
// 2. 위의 결과에 Math.round() 사용
Math.round(9075.52) -> 9076
// 3. 위의 결과를 다시 100.0으로 나눈다
9076 / 100.0 // 90.76
9076 / 100 // 90
이외 필요한 것은 찾아서 구현해보자!
기본형 변수도 어쩔수 없이 객체로 다뤄야 하는 경우 사용(8개의 기본형 다룸)
래퍼 클래스의 생성자는 매개변수로 문자열이나 각 자료형의 값들을 인자로 받는다.
public final class Integer extends Number implements Comparable
{
...
private int value;
...
}

숫자와 관련된 래퍼 클래스는 모두 Number 클래스의 자손

public abstract class Number implements java.io.Serializable
{
public abstract int intValue();
public abstract long longValue();
public abstract float floatValue();
public abstract double doubleValue();
public byte byteValue()
{
return (byte)intValue();
}
public short shortValue()
{
reutrn (short)intValue();
}
}
int i = new Integer("100").intValue(); // 래퍼클래스를 기본형으로 바꾸는 방법
// 문자열 "100"으로, 래퍼클래스 객체 new Integer를 만들고, intValue()로 int값을 얻음
int i2 = Integer.parseInt("100"); // 주로 이 방법을 많이 사용
Integer(int도 가능) i3 = Integer.valueOf("100"); // 문자열을 래퍼클래스로 변환
Integer 래퍼클래스는 intValue()메소드를 사용해서 int값을 얻을 수 있음
위와 같이 Long 래퍼클래스 → longValue() → long 값 얻을 수 있음
// 문자열 → 기본형
byte b = Byte.parseByte("100");
// 문자열 → 래퍼클래스
Byte b = Byte.valueOf("100");
// n진법의 문자열을 숫자로 변환
int i = Integer.parseInt("100",2); // 100(2) → 4, 100을 2진수로 해석해서 숫자를 나타내라
int i2 = Integer.parseInt("100",8); // 100(8) → 64
int i3 = Integer.parseInt("100",16); // 100(16) → 256
int i4 = Integer.parseInt("FF",16); // FF(16) → 255 , 16진수는 0~F, 허용됨
int i4 = Integer.parseInt("FF"); // NumberFormatException 발생 (숫자형식이상)
// 안쓰면 10진수로 해석하는데 10진수에는 F가 없음.
JDK1.5 이전에는 기본형과 참조형간의 연산이 불가능

컴파일러가 자동으로 추가!
오토박싱 : 기본형 값 -> 래퍼클래스 객체로 자동 변환
언박싱 : 래프클래스 객체 -> 기본형 값
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(10); // 오토박싱 10 -> new Integer(10)
int value = list.get(0); // 언박싱 new Integer(10) -> 10
class Ex9_16 {
public static void main(String[] args) {
int i = 10;
// 기본형을 참조형으로 형변환(형변환 생략 가능)
// 원래는 기본형을 참조형으로 변경할 때 형변환 연산자 사용 불가(원칙) → 컴파일러가 자동으로 바꿔줌(원칙이 바뀐 것은 아님)
Integer intg = (Integer)i; //컴파일러(실제코드): Integer intg = Integer.valueOf(i);
Object obj = (Object)i; //컴파일러(실제코드): Object obj = (Object)Integer.valueOf(i);
Long lng = 100L; // Long lng = new Long(100L)
int i2 = intg + 10; // 참조형과 기본형간의 연산 가능 (참조형이 자동으로 기본형으로 변환)
long l = intg + lng; // 참조형간의 덧셈도 가능
Integer intg2 = new Integer(20);
int i3 = (int)intg2; // 참조형을 기본형으로 형변환도 가능(형변환 생략가능)
}