tostring()은 보통 해쉬코드 값을 리턴함 - > 필요에 따라 오버라이딩하여 값을 리턴하도록 변형.
자바의 모든 클래스는 object클래스를 상속하고, object클래스는 toString 메소드를 가지고 있음.
tostring()은 print 메소드를 실행하면 자동으로 호출되도록 약속되어있다.
int
package ex04.wrapper.interger00;
public class IntWrapperMain {
public static void main(String[] args) {
// 기본자료형 -> 클래스화하려고 wrapper클래스를 이용한다.
int num = 7; //stack에 저장됨
IntWrapper intInst = new IntWrapper(7);
/*
System.out.println(Object obj);
obj.toString();
toString()은 "패키지+클래스+해시코드" 가 default구현
toString()은 종종 객체내의 값을 바로 부여주기 위해
Overriding을 하는 경우가 많다
*/
System.out.println(num);
System.out.println(intInst); // 7 출력
}
}
package ex04.wrapper.interger00;
/*
자바의 기본 자료형 타입(Primitive Type) -> Class
byte 1 byte -> Byte
char 2 byte
short 2 byte -> Short
int 4 byte -> Integer
long 8 byte -> Long
float 4 byte -> Float
double 8 byte -> Double
*/
public class IntWrapper {
private int num; //객체의 필드 -> heap에 저장
public IntWrapper(int num) {
this.num = num;
}
@Override
public String toString() {
return ""+num;
}
}
wrapper 클래스를 이용하면 위의 과정이 필요 없다.
package ex04.wrapper.interger01;
public class UseWrapperClass {
public static void main(String[] args) {
Integer intInst = new Integer(100);
System.out.println(intInst); //100 출력
}
}
Boxing/ Unboxing
package ex04.wrapper.boxing02;
public class BoxingUnboxing {
public static void main(String[] args) {
// Boxing
Integer iValue = new Integer(10);
Double dValue = new Double(3.14);
System.out.println(iValue);
System.out.println(dValue);
// Unboxing
iValue = new Integer(iValue.intValue() + 10); //primitive type으로 변환
dValue = new Double(dValue.doubleValue() + 1.2);
System.out.println(iValue);
System.out.println(dValue);
}
}
jdk 버전이 올라가면서 생성자를 이용하지 않아도 변환 가능
package ex04.wrapper.boxing02;
public class BoxingUnboxing {
public static void main(String[] args) {
// Boxing
Integer iValue = new Integer(10);
Double dValue = new Double(3.14);
System.out.println(iValue);
System.out.println(dValue);
// Unboxing 아래 모두 가능
iValue = iValue.intValue() + 10;
dValue = dValue.doubleValue() + 1.2;
// iValue = iValue + 10; 지금은 이렇게 자유롭게 상호변환 가능해짐.
// dValue = dValue + 1.2;
System.out.println(iValue);
System.out.println(dValue);
}
}
boxing : 스택에 올라가는 기본 자료형들을 박싱해서 heap에 올림
unboxing : 힙에 있는 애들을 언박싱해서 스택으로 데려왔다
package ex04.wrapper.boxing02;
/*
Wrapper클래스는 처음에 jdk존재하지 않다가
Generic 컬렉션에서의 기본자료형 사용을 위한
문법으로 탄생
*/
public class AutoBoxing {
public static void main(String[] args) {
//(Auto)Boxing
Integer iValue = 10; //Integer iValue = new Integer(10);
Double dValue = 3.14; // Double dValue = new Double(3.14);
//(Auto)UnBoxing
int num0 = iValue; // int num0 = iValue.intValue();
double num1 = dValue; // double num1 = dValue.doubleValue();
System.out.println(iValue); //10 출력
System.out.println(dValue); //3.14
System.out.println(num0); //10
System.out.println(num1); //3.14
}
}
package ex04.wrapper.boxing02;
/*
Boxing : Stack -> Heap : Primitive Type => Object
UnBoxing : Heap -> Stack : Object => Primitive Type
중간에 JVM이 관여되어서 Wrapper객체와 PrimitiveType 연산을 많이 쓰면
그냥 PrimitiveType을 사용한 연산보다 성능이 떨어진다
*/
public class AutoBoxingUnBoxing {
public static void main(String[] args) {
Integer num0 = 10; //Interger num0 = new Integer(10);
Integer num1 = 20; //Interger num1 = new Integer(20);
num0++; //num0 = new Integer(num0.intValue()+1);
num1 += 3; //num1 = new Integer(num1.intValue()+3);
int result = num0 + num1; //num0.intValue() + num1.intValue();
System.out.println(num0);
System.out.println(num1);
System.out.println(result);
}
}
BigInteger
범위를 넘어가서 문자열 형으로밖에 표현이 안된다.
아주 큰 숫자를 표현 할 때 쓴다.
package ex04.wrapper.bigInteger06;
import java.math.BigInteger;
public class BigIntegerEx {
public static void main(String[] args) {
System.out.println(Long.MAX_VALUE); //약 900경
System.out.println(Long.MIN_VALUE); //약 -900경
// 상수(literal) = 숫자 = PrimitiveType
BigInteger bigValue0 = new BigInteger("100000000000000000000000");
BigInteger bigValue1 = new BigInteger("-99999999999999999999999");
BigInteger result= bigValue0.add(bigValue1);
System.out.println(result);
result= bigValue0.multiply(bigValue1);
System.out.println(result);
}
}
BigDecimal
package ex04.wrapper.bigDecimal07;
/*
C, C++, Java, C#
실수 0.0 ~ 1.0 사이의 실수의 개수는? 무한대
실수 : 무한대의 값
정수 : 정확히 범위를 가진 값
메모리 : 유한한 공간
float : 4byte 표현
double : 8byte 표현
유한한 공간에 무한대 범위를 수를 표현해야 한다 => 불가능
수학자들은 공식에 의해 소수점 몇째자리까지만 보장하는 근사값으로 저장
*/
public class DoubleError {
public static void main(String[] args) {
double d0 = 1.6;
double d1 = 0.1;
System.out.println(d0+d1); //딱 떨어지는 값이 나오지 x
System.out.println(d0*d1);
}
}
그래서 쓰는 것이 BigDecimal이다.
package ex04.wrapper.bigDecimal08;
import java.math.BigDecimal;
public class BigDecimalEx {
public static void main(String[] args) {
// literal 값이 실수라 이미 전달할 때부터 오차가 발생
// 그래서 결과가 오차
// BigDecimal e0 = new BigDecimal(1.6);
// BigDecimal e1 = new BigDecimal(0.1);
// 문자열로 전달해야 한다
BigDecimal e0 = new BigDecimal("1.6");
BigDecimal e1 = new BigDecimal("0.1");
System.out.println(e0.add(e1));
System.out.println(e0.multiply(e1));
}
}