본문 바로가기

프로그래밍/Java

Java_Java.lang패키지와 유용한 클래스(4)_Math클래스와 메서드, 래퍼 클래스, 오토박싱&언박싱

④ Math클래스와 메서드

: Math클래스는 수학 관련 static메서드의 집합이다.

 

- Math클래스의 메서드

메서드//설명 예제 결과
static double abs(double a)
static float abs(float f)
static int abs(int f)
static long abs(long f)
//주어진 값의 절대값을 반환한다.

int i= Math.abs(-10);
double d=Math.abs(-10.0)
i=10
d=10.0
static double ceil(double a)
//주어진 값을 올림하여 반환한다.
double d=Math.ceil(10.1);
double d2=Math.ceil(-10.1);
double d3=Math.ceil(10.000015);
d=11.0
d2=-10.0
d3=11.0
static double floor(double a)
//주어진 값을 버림하여 반환한다.
double d=Math.floor(10.8);
double d2=Math.floor(-10.8);
d=10.0
d2=-11.0
static double max(double a, double b)
static float max(float a, float b)
static int max(int a, int b)
static long max(long a, long b)
//주어진 두 값을 비교하여 큰 쪽을 반환한다.
double d=Math.max(9.5, 9.50001);
int i=Math.max(0, -1);
d=9.50001
i=0
static double min(double a, double b)
static float min(float a, float b)
static int min(int a, int b)
static long min(long a, long b)
//주어진 두 값을 비교하여 작은 쪽을 반환한다.
double d=Math.min(9.5, 9.50001);
int i=Math.min(0, -1)
d=9.5
i=-1
static double random()
//0.0~1.0범위의 임의의 double값을 반환한다.
(1.0은 범위에 포함되지 않는다.)
double d=Math.random();
int i=(int)(Math.random()*10)+1
0.0<=d<1.0
1<=i<11
static double rint(double a)
//반올림하여 반환한다.
단, 정가운데 있는 값(1.5, 2.5, 3.5등)은 짝수를 반환한다.
double d=Math.rint(1.2);
double d2=Math.rint(2.6);
double d3=Math.rint(3.5);
double d4=Math.rint(4.5);
d=1.0
d2=3.0
d3=4.0
d4=4.0
static long round(double a)
static long round(float a)
//반올림하여 반환한다.
long l=Math.round(1.2);
long l2=Math.round(2.6);
long l3=Math.round(3.5);
double d=90.7552;
double d2=Math.round(d*100)/100.0;
l=1
l2=3
l3=4
d=90.7552
d2=90.76

 

- Math클래스 예제

import static java.lang.Math.*;

class JavaJungsuk_MathClass_Ex9_13 {
    public static void main(String args[]){
        double val=90.7552;
        System.out.println("round("+val+")="+round(val));	//반올림
        
        val*=100;
        System.out.println("round("+val+")="+round(val));	//반올림
        
        System.out.println("round("+val+")/100 ="+round(val)/100);
        System.out.println("round("+val+")/100.0="+round(val)/100.0);
        System.out.println();
        System.out.println("ceil(%3.1f)=%3.1f%n", 1.1, ceil(1.1));	//올림
        System.out.println("floor(%3.1f)=%3.1f%n", 1.5, floor(1.5)); 	//버림
        System.out.println("round(%3.1f)=%d%n", 1.1, round(1.1));	//반올림
        System.out.println("round(%3.1f)=%d%n", 1.5, round(1.5));	//반올림
        System.out.println("rint(%3.1f)=%f%n", 1.5, rint(1.5));		//반올림
        System.out.println("round(%3.1f)=%d%n", -1.5, round(-1.5));	//반올림
        System.out.println("rint(%3.1f)=%f%n", -1.5, rint(-1.5));	//반올림
        System.out.println("ceil(%3.1f)=%f%n", -1.5, ceil(-1.5));	//올림
        System.out.println("floor(%3.1f)=%f%n", -1.5, floor(-1.5));	//버림
    }
}

결과
round(90.7552)=91
round(9075.52)=9076
round(9075.52)/100=90
round(9075.52)/100.0=90.76

ceil(1.1)=2.0
floor(1.5)=1.0
round(1.1)=1
round(1.5)=2
rint(1.5)=2.000000
round(-1.5)=-1
rint(-1.5)=-2.000000
ceil(-1.5)=-1.000000
floor(-1.5)=-2.000000

 

 

 

⑤ 래퍼(wrapper) 클래스

: 기본형을 감싸는 클래스.

 

- 기본형 중 char와 int를 제외하고 표기법이 같다.

char → Character

int → Integer

 

- 래퍼클래스를 사용하는 경우

: 기본형 변수도 어쩔 수 없이 객체로 다뤄야하는 경우.

예로들면 매개변수로 객체를 요구할 때, 기본형 값이 아닌 객체로 저장해야할 때, 객체간의 비교가 필요할 때 사용한다.

 

- 래퍼 클래스 예제

class JavaJungsuk_WrapperClass_Ex9_14 {
    public static void main(String[] args) {
    	Integer i =new Integer(100);
        Integer i2=new Integer(100);
        
        System.out.println("i==i2?"+(i==i2));
        System.out.println("i.equals(i2)?"+i.equals(i2));
        //compareTo는 같으면 0, (오른쪽값이) 작으면 양수, (오른쪽값이) 크면 음수 반환
        System.out.println("i.compareTo(i2)="+i.compareTo(i2));	
        System.out.println("i.toString()="+i.toString());
        
        System.out.println("MAX_VALUE="+Integer.MAX_VALUE);	//+20억
        System.out.println("MIN_VALUE="+Integer.MIN_VALUE);	//-20억
        System.out.println("SIZE="+Integer.SIZE+"bits");
        System.out.println("BYTES="+Integer.BYTES+"bytes");
        System.out.println("TYPE="+Integer.TYPE);
    }
}

결과
i==i2?false
i.equals(i2)?true
i.compareTo(i2)=0
i.toString()=100
MAX_VALUE=2147483647
MIN_VALUE=-2147483647
SIZE=32bits
BYTES=4bytes
TYPE=int

→ 래퍼 클래스는 모두 equals()가 오버라이딩되어 있어서 주소값이 아닌 객체가 가지고 있는 값을 비교한다.

또한 toString()도 오버라이딩 되어 있어서 객체가 가지고 있는 값을 문자열로 변환하여 반환한다.

 

 

 

⑥ 오토박싱 & 언박싱

: 기본형 값을 래퍼 클래스의 객체로 자동변환 해주는 것을 오토박싱(int → Integer)이라 하고,

 반대로 변환하는 것을 언박싱(int ← Integer)이라 한다. 

컴파일 전의 코드 컴파일 후의 코드
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(); // 기본형으로 자동변환!

 

- 오토박싱 & 언박싱 예제

class JavaJungsuk_AutoBoxing_UnBoxing_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;
        
        int i2=intg+10;
        long l=intg+lng;
        
        Integer intg2=new Integer(20);
        int i3=(int)intg2;
        
        Integer intg3=intg2+i3;
        
        System.out.println("i="+i);
        System.out.println("intg="+intg);
        System.out.println("obj="+obj);
        System.out.println("lng="+lng);
        System.out.println("intg+10="+i2);
        System.out.println("intg+lng="+l);
        System.out.println("intg2="+intg2);
        System.out.println("i3="+i3);
        System.out.println("intg2+i3="+intg3);
    }
}

결과
i=10
intg=10
obj=10
lng=100
intg+10=20
intg+lng=110
intg2=20
i3=20
intg2+i3=40

 

→ 위 예제에서 알 수 있듯이 기본형과 참조형은 서로 형변환이 가능(형변환 생략가능)하고, 

참조형과 기본형간의 연산도 가능하다.