프로그래밍 언어/JAVA

[JAVA] 자바의 형변환 Type Casting

Rateye 2021. 1. 18. 12:30
728x90
반응형

형변환 Type Casting

  • 어떤 데이터 타입을 다른 데이터 타입으로 변환하는 것

기본 형변환

  • 기본 데이터 타입 8가지 중 boolean을 제외한 나머지 7가지 타입끼리의 형변환
  • 작은 타입에서 큰 타입으로 변환 시 자동 형변환

    묵시적(암시적) 형 변환 = 자동 형변환
    • 작은 데이터 타입 데이터를 큰 데이터 타입으로 변환하는 것
    • 별다른 추가 작업 없이 그대로 전달하면 컴파일러에 의해 자동으로 변환됨
    • 변환된 후에도 데이터의 변형이 없음
  • 큰  타입에서 작은 타입으로 변환 시 강제 형변환

    명시적 형변환 = 강제 형변환
    • 큰 데이터 타입 데이터를 작은 데이터 타입으로 변환하는 것
    • 값의 손실(= 넘침(Overflow))이 발생할 가능성이 있으므로 컴파일러에 의해 자동으로 형변환 되지 않는다.
    • 형변환 연산자를 사용하여 강제 형변환을 수행해야 한다

      우변 데이터 앞에 소괄호()를 붙이고 괄호 사이에 좌변의 작은 데이터 타입(변환할 타입)의 이름을 명시
    • 강제 형 변환 후에도 Overflow에 의해 값의 손실이 일어나서 원본 데이터가 아닌 다른 데이터가 저장될 수 있음

      단, 작은 데이터 타입에서 표현 가능한 범위일 경우 기존 값이 유지될 수 있음

 

		int a1 = 999;
		short a2 = 100;
		
		System.out.println("a1(int) : " + a1 + ", a2(short) : " + a2);
		
		a1 = a2; // short 타입 변수 a2 의 데이터(100)를 int 타입 변수 a1 에 저장
		// => 이 때, 작은 타입인 short 타입 변수 a2 의 데이터가
		//    큰 타입인 int 타입으로 변환되는 것을 묵시적 형변환(자동 형변환)이라고 한다!
		System.out.println("a1(int) : " + a1 + ", a2(short) : " + a2);
		
		System.out.println("----------------------------------");
		
		int b1 = 99999;
		short b2 = 100;
		
		System.out.println("b1(int) : " + b1 + ", b2(short) : " + b2);
		
		// b2 = b1; // int 타입 변수 b1 의 데이터(999)를 short 타입 변수 b2 에 저장
		// => 오류 발생!
		// => 큰 타입(int) 데이터를 작은 타입(short) 에 저장할 때 
		//    값에 대한 넘침(Overflow)이 발생할 수 있으므로 자동 형변환을 수행하지 않음
		// => 형변환 연산자를 사용하여 명시적 형변환(강제 형변환) 을 수행해야함
		b2 = (short)b1;
		// 강제 형변환 후에는 Overflow 에 의해 원래의 데이터가 아닌
		// 다른 변형된 데이터가 저장될 수 있으므로 주의해야한다!
		System.out.println("b1(int) : " + b1 + ", b2(short) : " + b2);
		// int형 변수 b1 의 99999 정수가 short형 변수 b2 에 저장되면
		// Overflow 에 의해 99999 가 아닌 다른 데이터로 변형됨
		// => 만약, int형 변수 b1 에 short 타입이 표현 가능한 범위의 데이터가 있을 경우
		//    강제 형변환 후에도 원본 데이터가 그대로 유지될 수 있다!
		
		System.out.println("----------------------------");
		
		int c1 = 266;
		byte c2 = 10;
		
		System.out.println("c1(int) : " + c1 + ", c2(byte) : " + c2);
		
		// 작은 타입(byte) -> 큰 타입(int)로 변환
		c1 = c2;
		System.out.println("c1(int) : " + c1 + ", c2(byte) : " + c2);
		
		
		int d1 = 266;
		byte d2 = 10;
		
		System.out.println("d1(int) : " + d1 + ", d2(byte) : " + d2);
		
		// 큰 타입(int) -> 작은 타입(byte)으로 변환
		// d2 = d1; // 오류 발생! 강제 형변환 필요!
		d2 = (byte)d1; // 형변환 연산자를 사용하여 byte 타입으로 강제 형변환
		// => int형 변수에 저장된 정수 266 이 byte 타입 변수에 저장될 때 10 으로 변형됨
		System.out.println("d1(int) : " + d1 + ", d2(byte) : " + d2);
		
		char se = 'A';
	int i1 = 1234;
		long l1 = i1; // int -> long 으로 자동형변환
		System.out.println(i1 + ", " + l1); // 1234, 1234 출력됨
		
	//byte b1 = i1; // int -> byte 로 자동형변환 불가
		byte b1 = (byte)i1; // byte 타입으로 명시적(강제) 형변환 필수!
		// => 변환 과정에서 오버플로우가 발생하므로 다른 값이 저장됨
		System.out.println(i1 + ", " + b1); // 1234, -46 출력됨
		
		double d1 = i1; // int -> double 로 자동형변환(소수점 .0 추가됨)
		System.out.println(i1 + ", " + d1); // 1234, 1234.0 출력됨
		
		double d2 = 0.12345678901234567890;
	//float f1 = d2; // double -> float 로 자동형변환 불가
		float f1 = (float) d2; // float 타입으로 명시적(강제) 형변환 필수!
		System.out.println(d2 + ", " + f1);
		// double 타입은 소수점 18번째자리에서 반올림 17자리로 표시
		// float 타입은 소수점 9번째자리에서 반올림 8자리로 표시
		
		byte b3 = 67;
	//char c1 = b3; // 오류 발생
		// char <-> byte 또는 short 타입 간의 변환은 반드시 명시적 형변환
		char c1 = (char)b3;
		System.out.println(b3 + ", " + c1); // 67, C 출력됨
		
		// boolean 타입은 그 어떤 데이터타입과도 형변환 불가능
728x90
반응형