본문 바로가기

JAVA

java #17 Object 클래스 총 정리 2(StringBuffer, StringBuilder ,Math 클래스, 래퍼 클래스)

11) 문자열과 기본형 간의 변환
- 숫자를 문자열로 바꾸는 방법
ex)
 int i = 100;
 String str1 = i + ""; // 100을 "100"으로 변환하는 방법1 -> 편리,간단
 String str2 = String.valueOf(i);  // 100을 "100"으로 변환하는 방법2 -> 처리속도가 빠름

- 문자열을 숫자로 바꾸는 방법
ex)
 int i = Integer.parseInt("100"); // "100" 을 100으로 변환하는 방법1
 int i2 = Integer.valueOf("100"); // "100" 을 100으로 변환하는 방법2
 Integer i2 = Integer.valueOf("100"); // 원래는 반환 타입이 Integer

12) StringBuffer 클래스
- String처럼 문자형 배열(char[])을 내부적으로 가지고 있다.
public final class StringBuffer implements java.ol.Serializable {
private char[] value;
}
- 그러나 String(변경불가)과 달리 내용을 변경할 수 있다. (mutable)

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

13) StringBuffer의 생성자
- 배열은 길이 변경불가. 공간이 부족하면 새로운 배열생성해야
ex) 1. 새로운 배열생성(보통 두배 크기로 생성)
     2. 내용 복사
     3. 참조 변경
- StringBuffer는 저장할 문자열의 길이를 고려해서 적절한 크기로 생성해야

14) StringBuffer의 변경
- StringBuffer는 String과 달리 내용 변경이 가능하다.
- append()는 지정된 내용을 StringBuffer에 추가 후 StringBuffer의 참조를 반환

15) StringBuffer의 비교
- StringBuffer는 equals()가 오버라이딩되어있지 않다.(주소비교)
- StringBuffer을 String으로 변환 후에 equals()로 비교해야 한다.
ex)
 String s = sb.toString(); // sb를 String으로 변환
 String s2 = sb2.toString();

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

16) StringBuilder -> 동기화 X , 싱글쓰레드에 사용 적합
- StringBuffer는 동기화되어 있다. 멀티쓰레드에 안전(thread-safe)
- 멀티 쓰레드 프로그램이 아닌 경우, 동기화는 불필요한 성능저하 이럴 땐
StringBuffer대신 StringBuilder를 사용하면 성능 향상

17) Math 클래스
- 수학관련 static메서드의 집합
- round()로 원하는 소수점 아래 세 번째 자리에서 반올림하기
 ex) 1. 원래 값에 100을 곱한다. 
90.7552 * 100 -> 9075.52
      2. 위의 결과에 Math.round()를 사용한다.
Math.round(9074.52) -> 9076
      3. 위의 결과를 다시 100.0으로 나눈다.
9076 / 100/0 -> 90/76
9076/ 100 -> 90

18) 래퍼(wrapper) 클래스
- 8개의 기본형을 객체로 다뤄야할 때 사용하는 클래스 (기본형은 객체가 아니기 때문에)

pubilc final class Integer extends Number implenments Comparable {
	private int value;
}


- 기본형: boolean, char , byte, short, int , long, float, double
- 래퍼클래스: Boolean, Character, Byte , Short , Integer , Long , Float , Double
ex) 
char -> Character
생성자 : Character(char value) , 활용 예: Character c = new Character('a');
int -> Integer
생성자: Integer(int value), Integer(String s), 활용 예: Integer i = new Integer(100); , Integer i2 = new Integer("100");

- 모든 숫자 래퍼 클래스의 조상.

19) 문자열을 숫자로 변환하기
- 문자열을 숫자로 변환하는 다양한 방법
ex)
 int i = new Integer("100").intValue(); // floatValue(), longValue(), ...
 int i2 = new Integer.parsInt("100"); // 주로 이 방법을 많이 사용.
 Integer i3 = Integer.valueOf("100");

ex) 
문자열 -> 기본형
: byte b = Byte.parseByte("100");
 short s = Short.parseShort("100");
 int i = Integer.parseInt("100");
 float f = Float.parseFloat("3.14");

문자열 -> 래퍼 클래스
 Byte b = Byte.valueOf("100");
 Short s = Short.valueOf("100");
 Integer i = Integer.valueOf("100");
 Float f = Float.valueOf("3.14");

- n진법의 문자열을 숫자로 변환하는 방법
 int i4 = Integer.parseInt("100",2); // 100(2) -> 4
 int i5 = Integer.parseInt("100",8); // 100(8) -> 64
 int i6 = Integer.parseInt("100",16); // 100(16) -> 256
 int i7 = Integer.parseInt("FF",16); // FF(16) -> 255
 // int i8 = Integer.parseInt("FF"); // NumberFormatException 발생

20) 오토박싱 & 언박싱
- JDK1.5 이전에는 기본형과 참조형간의 연산이 불가능
ex)
 int i =5;
 Integer iObj = new Integer(7);

 int sum = i + iObj; // 에러(JDK1.5 이전) 기본형과 참조형 간의 덧셈 불가

컴파일 전의 코드 
int i = 5;
Integer iObj = new Integer(7);

int sum = i + iObj;

컴파일 후의 코드
int i = 5;
Integer iObj = new Integer(7);

int sum = i + iObj.intValue();

- 기본형의 값을 객체로 자동변환하는 것을 오토박싱, 그 반대는 언박싱
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(10); // 오토박싱 10 -> new Integer(10)
int value = list.get(0); // 언박싱. new Integer(10)