Developer/JAVA

JAVA , 자동 형변환과 강제 형변환

단님 2024. 7. 19. 23:35
728x90
자동 형변환

 

큰 자료형에는 작은 자료형을 대입하면 자동으로 형변환이 이루어짐.(= 프로모션 형변환 , 확대 형변환)

	double d = 123.456 ;// 8byte
	int i = 123456; // 4byte
		
	System.out.println("double d="+ d);
	System.out.println("int i ="+ i);
		
	d=i; // 자동 형변환 발생
		
	System.out.println("자동 형변환 double = int ; =>"+ d);

 

 

 

강제 형변환

 

큰 자료형을 작은 자료형에 대입하기 위해 큰 자료형을 강제로 형변환을 명시하여 변환 (=디모션 형변환, 축소 형변환)

 

ex ) double 형을 int 형으로의 변환

		d=555.555 ;
		i =123456;
		System.out.println("double d="+ d);
		System.out.println("int i ="+ i);
		i =(int)d;
		System.out.println("강제 형변환 int =(int)double; =>"+ i);

 

ex) 강제 형변환 불가 (문자형-> 숫자형)

		String sss = "가나다";
		//i = (int)sss; //강제 형변환 불가

 

 

같은 크기의 다른 타입 (int / float : 4byte)

 

		//같은 크기 다른 타입. (int / float - 4byte)
		float f = 123.456f;
		int n = 100;
		System.out.println("float f="+ f);
		System.out.println("int n ="+ n);
		f = n;
		System.out.println("f=n 넣은 후 :float f="+ f);
		System.out.println("f=n 넣은 후 :int n ="+ n);
		
		f=123.456f;
		//n=f; //오류
		System.out.println("float f="+ f);
		System.out.println("int n ="+ n);
		n =(int)f; // 강제적 형변환
		System.out.println("n =(int)f;  후 :float f="+ f);
		System.out.println("n =(int)f;  후 :int n ="+ n);

float 과 int 는 같은 크기를 지녔지만 , float 이 int 보다 표현범위가 넓기에 

float 에 int 는 자동으로 형변환이 되어 들어가지만 , 

반대로 int에 float 을 넣을경우 강제 형 변환이 필요하다.

 

정수형 연산

 

자바에서는 4byte이하의 정수형의 연산결과가 int 타입으로 처리된다.

즉 short 끼리 더하더라도 int 형을 반환하기 때문에 ,

short로 명시적 형변환이 필요하다.

		//정수형 연산
		//4byte 이하의 정수형 연산의 결과는 무조건 int 타입으로 처리됨.
		short s1 =10, s2 = 20 , s3 = 30;
		//s3 = s1+s2; //int 를 short으로 변환할 수없다고 타입 미스매치 오류 뜸.
		s3 =(short)(s1+s2);

 

 

char 와 int 의 사이

char 타입은 int 변환이 가능하다고 했다.

즉, char + int 는 int 로 자동 형변환이 이루어진다.

int를 char 타입으로는 강제형변환을 통해 형변환이 가능하다.

		//char 타입은 int 변환이 가능함
		char c = 'C';
		n = 100;
		System.out.println("(char)c="+ c+", (int)n ="+ n);
		
		n=n+c;
		System.out.println("(int)n=(int)n+(char)c 후: c="+ c+", n ="+ n);
		System.out.println("(char)n ="+ (char)n);

 

다른 타입 다른 크기 (long(정수형 8byte) / float (실수형 4byte))

 

	//long의 자동 형변환
	// long(정수형 8byte) , float(실수형 4byte) 은 타입도 , 크기도 다름.
	long longL = 10000L;
	float fff = longL;
	System.out.println("long longL :"+longL);
	System.out.println("float fff:"+fff);

 

크기는 float 가 작으나 표현 범위는 long 보다 더 크기 때문에 자동으로 형변환이 일어난다.

 


정리

 

  • 자동 형변환
    • 작은 자료형의 값을 큰 자료형 변수에 대입할 때 자동으로 형변환이 이루어진다.
    • 예를 들어, int 타입의 변수 값을 double 타입의 변수에 대입하면 자동으로 형변환이 일어난다.
  • 강제 형변환 
    • 큰 자료형의 값을 작은 자료형 변수에 대입할 때는 자동으로 형변환이 이루어지지 않으며 명시적으로 형변환을 해주어야 한다.
    • 예를 들어, double 타입의 값을 int 타입 변수에 대입하려면 (int)와 같이 명시적으로 형변환을 해주어야 한다.
  • 형변환 불가능한 경우
    • 문자열과 숫자형 간의 형변환은 불가능하다.
    • 예를 들어, String 타입의 값을 int 타입으로 형변환할 수 없다.
  • 같은 크기지만 다른 타입 간의 형변환
    • float와 int는 크기는 같지만 타입이 다르다.
    • 예를 들어 , int 타입의 값을 float 타입 변수에 대입할 때는 자동 형변환이 발생하지만 그 반대의 경우는 명시적 형변환이 필요하다.
  • 정수형 연산
    • 4byte 이하의 정수형 연산의 결과는 무조건 int 타입으로 처리된다.
    • 따라서 short 타입 변수끼리의 연산 결과를 short 변수에 저장하려면 명시적 형변환이 필요하다.
  • char 타입과 int 타입 간의 형변환
    • char 타입은 int로 변환이 가능하.
    • char 타입 변수와 int 타입 변수 간의 연산에서는 char 타입이 int로 자동 형변환된다.
  • long과 float 간의 형변환
    • long(8byte 정수형)과 float(4byte 실수형)은 크기와 타입이 다르다.
    • 하지만 float의 표현 범위가 long보다 크기 때문에 자동 형변환이 된다.