1.0 개론
String 클래스는 자기 자신이 변하지 않는(변경이 불가능한 문자열) 불변클래스다.
StringBuilder 클래스는 문자열의 저장 및 변경을 위한 메모리 공간(버퍼)을 내부에 지닌다.
StringBuffer 클래스는 자기 자신이 변하는(변경이 가능한 문자열) 클래스다.
1. StringBuffer 클래스
우리가 흔히 사용하는 버퍼(Buffer)라는 뜻은 버퍼링(Buffering)으로 많이 사용됐을 것이다.
무언가 작업을 할 때, 일시적인 데이터를 기억하는 장치의 의미이다.
StringBuffer 인스턴스를 생성할 때 이 기억장치의 크기를 지정할 수 있다.
1.1 StringBuffer 클래스의 특징
String 클래스는 인스턴스를 생성할 때 지정된 문자열을 변경할 수 없다.
StringBuffer 클래스는 변경이 가능하다. (내부적으로 문자열 편집을 위한 버퍼를 가지고 있음)
여기서 StringBuffer만의 특징이 "메서드 체이닝(Method Chaining)"이다.
자기 자신을 리턴하여 계속해서 자신의 메서드를 호출할 수 있다.
append의 리턴값이 stringbuffer이므로, 계속해서 append 메서드를 사용하는 것이 가능하다.
1.2 StringBuffer 클래스의 생성자
생성자를 이용해서 문자열을 저장하고 편집하기 위한 버퍼의 크기를 지정해준다.
즉, StringBuffer(int length)
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);
}
StringBuffer 클래스의 생성자는 위와 같이 3개가 있다.
1. StringBuffer() : 크기를 지정하지 않으면 16문자를 담을 수 있는 버퍼를 가진 스트링버퍼 인스턴스를 생성
2. StringBuffer (int length) : 지정된 개수의 문자를 담을 수 있는 스트링버퍼 인스턴스를 생성
3. StringBuffer (String str) : 지정된 문자열 값(str)을 갖는 스트링버퍼 인스턴스를 생성
1.3 StringBuffer인스턴스의 비교
String 클래스 : equals 메서드를 오버라이딩 (O), 문자열 내용 비교가 가능
StringBuffer 클래스 : equals 메서드 오버라이딩 (X), 문자열 내용 비교가 불가능
a == b ? false (주소값 비교 연산자)
a.eqauals(b) ? false (내용 비교 메서드)
StringBuffer 클래스는 equals메서드를 오버라이딩하지 않아서 내용값을 비교할 수 없다.
String 클래스와 비교해보도록 하자.
주소값을 비교하는 == 연산자는 false
내용을 비교하는 메서드는 true를 나타낸다.
c == d ? false (주소값 비교 연산자)
c.equals(d) ? true (내용 비교 메서드)
2. Math 클래스
Math 클래스의 생성자는 접근 제어자가 private이기 때문에 다른 클래스에서 Math 인스턴스를 생성할 수 없도록 했다. 그 이유는 클래스 내에 인스턴스변수가 하나도 없어서 인스턴스를 생성할 필요가 없기 때문이다.
인스턴스를 생성할 수는 없지만 모든 메소드와 속성이 static으로 정의되어 있어서 인스턴스 생성 없이 사용이 가능하다.
통계랑 접목하려고 한다면, Math 클래스들을 잘 알아야 겠다.
[ 1~10 까지 임의의 정수 발생 ]
round() 메서드는 항상 소수점 첫째자리에서 반올림을 해서 정수값을 결과로 돌려준다.
3. wrapper 클래스
기본형 데이터 타입의 객체화를 가능하게 도와주는 클래스다.
(1) int i = 5;
(2) Integer i2 = new Integer(5);
(1) int i 는 기본 자료형이다. (객체가 아니다. 즉, 참조형이 아니다.)
만약 참조형으로 사용하고 싶다면 i2처럼 선언해야 사용할 수 있다.
Integer i2는 int를 객체로 바꿔주는 Wrapper 클래스 중 하나인 "클래스"다.
(2) 기본 데이터타입을 객체형으로 바꿀 때는 각각 알맞는
Wrapper 클래스를 이용해 객체로 한번 감싸줘야 사용가능하다.
JDK 1.5 버전 이후부터는 new 연산자를 이용하지 않아도 자동으로 Boxing과 UnBoxing이 가능하다.
이를 "오토박싱(AutoBoxing)" , "오토언박싱(AutoUnBoxing)"이라고 한다.
(3) Integer i3 = 5; 오토박싱
이렇게 자동으로 Integer로 자동으로 형변환해준다. (즉, new Integer(5)라고 쓰지 않아도 된다.)
(4) int i4 = i3; 오토언박싱
Integer 타입을 꺼낼때도 방법은 동일하다. (원래는 int i4 = i3.intValue() 메서드를 이용한다.)
그렇다면, 왜 Wrapper 클래스를 사용해야 하는지는(즉, 왜 객체화가 필요한지) 아래 이유와 같다.
1. 기본형(primitive type) 변수를 객체로 다뤄야 할 때
2. 매개변수로 객체를 요구할 때
3. 기본형 값이 아닌 객체로 저장해야 할 때
4. 객체간의 비교가 필요할 때 등등
기본형 값들을 객체로 변환하여 작업을 수행해야 한다.
'프로그래밍 > JAVA' 카테고리의 다른 글
[JAVA] 캘린더(Calendar) (0) | 2016.08.31 |
---|---|
[jAVA] 해시맵(HashMap) (0) | 2016.08.31 |
[JAVA] String 클래스 (0) | 2016.08.25 |
[JAVA] 내부 클래스(inner class) (0) | 2016.08.13 |
[JAVA} Object 클래스 (1) | 2016.08.09 |