본문 바로가기

프로그래밍/JAVA

[JAVA] StringBuilder & StringBuffer, Math, Wrapper 클래스

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 까지 임의의 정수 발생 ]

0.0 <= Math.random() < 1.0
0.0 <= Math.random() * 10 < 10.0
 1   <= (int)(Math.random()*10) +1 < 11 ( 1,2,3,4,5,6,7,8,9,10의 정수를 임의로 발생)


[ 1~45 까지 임의의 정수 발생 (로또 생성기) ]

0.0 <= Math.random() < 1.0
0.0 <= Math.random()*45 < 45.0
 1  <= (int)(Math.random()*45) + 1 < 46


[ 소수점 n번째 자리에서 반올림 ]

round() 메서드는 항상 소수점 첫째자리에서 반올림을 해서 정수값을 결과로 돌려준다.

 따라서 위 코드의 결과값은 91.0이 출력된다.


소수점 두번째 자리에서 반올림한 결과값을 얻으려면 x100
소수점 세번째 자리에서 반올림한 결과값을 얻으려면 x1000
소숫점 네번째 자리에서 반올림한 결과값을 얻으려면 x10000

소숫점 O번째 자리를 0의 개수라고 생각하면 된다.


90.7552의 소수점 두번째 자리에서 반올림하려고 한다면

1. 원래 값에 100을 곱한다.

a * 100 => 9075.52


2. 위 결과에 Math.round() 를 사용한다

Math.round (a*100) => 9076


3. 위 결과를 다시 100.0으로 나눈다.

(Math.round(a*100)) / 100.0 => 90.76

이때, 100.0이 아닌 100으로 나누지 않도록 주의해야 한다.

정수형간의 연산에서는 반올림이 되지 않는다.



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