Java

[Java] 형 변환

gorusair 2021. 12. 8. 00:04

형변환(캐스팅, casting) 이란

 

형변환이란, 변수 또는 상수의 타입을 다른 타입으로 변환하는 것

 

형변환 방법

 

(타입)피연산자

 

  • 형변환 방법은 아주간단하다. 형변환하고자 하는 변수나 리터럴의 앞에 변환하고자 하는 타입을 괄호와 함께 붙여주기만 하면된다.
  • 여기에 사용되는 괄호()는 '캐스트 연산자' 또는 '형변환 연산자'라고 하며, 형변환을 '캐스팅'이라고도 한다.

double d = 85.4;

int score = (int)d;  // double 타입의 변수 d를 int타입으로 형변환

 

  1. int score = (int)d;
  2. int score = (int)85.4; // 변수 d의 값을 읽어 와서 형변환 한다.
  3. int score = 85;        //형변환의 겨로가인 85를 변수 score에 저장한다.
class CastingEx1 {
	public static void main(String[] args){
    	double d = 85.4;
        int score = (int)d;
        
        System.out.println("score="+score);
        System.out.println("d="+d);
        
        score=85
        d=85.4  <-형변환 후에도 피연산자에는 아무런 변화가 없다

정수형간의 형변환

- 큰 타입에서 작은 타입으로의 변환, 예를 들어 int타입(4byte)의 값을 byte타입(1 byte)으로 변환하는 경우

  같은 크기의 차이 만큼 잘려나간다. 그래서 경우에 따라 '값 손실'이 발생할 수 있다.

 

- 반대로 작은 타입에서 큰 타입으로 변환하는 경우는 값 손실이 없으므로 나머지 빈공간은 0 또는 1로 채워진다.

  (원래의 값을 채우고 남은 빈공간은 0 으로 채우는게 보통이지만, 변환하려는 값이 음수인 경우에는 빈 공간을 1로 
   채운다. 그 이유는 형변환  후에도 부호를 유지할 수 있도록 하기 위함)

 

package ch02;

public class CastingEx2 {
	public static void main(String[] args) {
		int i = 10;
		byte b = (byte)i;
		System.out.printf("[int -> byte] i =%d -> b=%d%n", i,b);
		
		i = 300;
		b = (byte)i;
		System.out.printf("[int->byte] i=%d -> b=%d%n", i,b	);
		
		b = 10;
		i = (int)b;
		System.out.printf("[byte->int] b=%d -> i =%d%n", b, i);
		
		b = -2;
		i  = (int)b;
		System.out.printf("[byte -> int] b=%d ->i =%d%n", b, i);
		
		System.out.println("i="+Integer.toBinaryString(i));
	}
    
    실행결과
[int -> byte] i =10 -> b=10
[int->byte] i=300 -> b=44
[byte->int] b=10 -> i =10
[byte -> int] b=-2 ->i =-2
i=11111111111111111111111111111110

 

실수형 간의 형변환

실수형에서도 정수형처럼 작은 타입에서 큰 타입으로 변환하는 경우, 빈 공간을 0으로 채운다.

 

package ch02;

public class CastingEx3 {
	public static void main(String[] args) {
		float f = 9.1234567f;
		double d = 9.1234567;
		double d2 =(double)f;
		
		System.out.printf("f =%20.18f\n", f);
		System.out.printf("d =%20.18f\n", f);
		System.out.printf("d2 =%20.18f\n", f);
	}
}
f =9.123456954956055000
d =9.123456954956055000
d2 =9.123456954956055000

 

정수형과 실수형간의 변화

package ch02;

public class CastingEx4 {
	public static void main(String[] args) {
		int i =92134567;    // 8자리의 10진수
		float f = (float)i;   // int를 float로 형변환
		int i2 = (int)f;      // float를 다시 int로 형변환
		
		double d = (double)i; // int를 double로 형변환
		int i3 = (int)d;       // double을 다시 int로 형변환
		
		float f2 =1.666f;
		int i4 = (int)f2;
		
		System.out.printf("i=%d\n", i);
		System.out.printf("f=%f i2 =%d\n", f, i2);
		System.out.printf("d=%f i3=%d\n",d,i3);
		System.out.printf("(int)%f =%d\n", f2 , i4);
	}

}
i=92134567
f=92134568.000000 i2 =92134568
d=92134567.000000 i3=92134567
(int)1.666000 =1