[JAVA] chapter 9 java.lang 패키지와 유용한 클래스 - 2

WOOK JONG KIM·2022년 9월 22일

자바의 정석

목록 보기
11/25
post-thumbnail

Stringbuffer 클래스

변경 가능한 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에 저장

StringBuffer의 변경

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의 비교

StringBuffer는 String과 다르게 equals 오버라이딩 X

equals 사용시 == 와 같은 결과 얻음

반면 toString은 오버라이딩 되어 있어 문자열을

즉 StringBuffer 인스턴스의 문자열 비교를 위해서는 toStirng을 통해 String 인스턴스 얻은 다음, equals메서드를 사용해 비교해야 함

String s = sb.toString();
String s2 = sb2.toString();

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

StringBuffer의 생성자와 메서드

출처 : https://velog.io/@serringg/StringBuffer의-생성자-메소드


StringBuilder 클래스

StringBuffer -> 멀티쓰레드에 안전하도록 동기화 되어있다

즉 멀티쓰레드로 작성된 프로그램이 아닐 경우 동기화가 성능만 떨어뜨림

동기화 뺀 것이 StringBuilder

성능 향상이 반드시 필요한 경우 아니면 Buffer를 쓰는 것이 좋으며 사용법은 동일하다


Math클래스

수학계산에 유용한 메서드로 구성되어 있다.

생성자가 private이라 다른 클래스에서 Math인스턴스 생성 못함

  • random() : 임의의 수를 얻을 수 있음

  • round() : 반올림에 사용한다.

  • abs() : 절댓값을 반환한다.

  • ceil() 주어진값을 올림 하여 반환한다.

  • floor() : 버림하여 반환한다.

  • 모든 메서드는 static, 상수는 E와 PI 값만 있다.

버림,올림,반올림(round())

그냥 사용 시 소수점 첫째자리에서 반올림하여 정숫값을 결과로 돌려준다!

// 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

이외 필요한 것은 찾아서 구현해보자!


Wrapper 클래스

  • 기본형 변수도 어쩔수 없이 객체로 다뤄야 하는 경우 사용(8개의 기본형 다룸)

  • 래퍼 클래스의 생성자는 매개변수로 문자열이나 각 자료형의 값들을 인자로 받는다.

public final class Integer extends Number implements Comparable
{
...
private int value;
...
}


Number 클래스

숫자와 관련된 래퍼 클래스는 모두 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;  // 참조형을 기본형으로 형변환도 가능(형변환 생략가능)
}
profile
Journey for Backend Developer

0개의 댓글