Java

변수(Variable) - 형변환

제주니어 2022. 8. 16. 22:00

형변환

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

  • 변수 또는 상수의 타입을 다른 타입으로 변환하는 것.

2. 형변환 방법

  • 형변환하고자 하는 변수나 리터럴의 앞에 변환하고자 하는 타입을 괄호와 함께 붙여준다. (타입)피연산자
double d = 84.5;
int score = (int)d; // double 타입의 변수 d를 int 타입으로 형변환

//단계별 과정
int score = (int)d;
-> int score = (int)85.4; // 변수 d의 값을 읽어 와서 형변환한다.
-> int score = 85;        // 형변환의 결과인 85를 변수 score에 저장한다. 
  • 피연산자인 변수 d의 값은 형변환 후에도 아무런 변화가 없다.
  • 기본형에서 boolean을 제외한 나머지 타입들은 서로 형변환이 가능하다.
  • 기본형간의 형변환 예시
  • float →int 변환할 때, 소수점 이하의 값은 반올림이 아닌 버림으로 처리된다.

3. 정수형 간의 형변환

  • 큰 타입에서 작은 타입으로의 변환, int(4byte) → byte(1byte) 은 값손실이 발생할 수 있다.
  • 작은 타입에서 큰 타입으로의 변환, byte(1byte) → int(4byte) 은 값손실이 발생하지 않는다.
  • 원래의 값을 채우고 남은 빈공간은 0으로 채우는 게 보통이지만, 변환하려는 값이 음수인 경우에는 형변환 후에도 부호를 유지할 수 있도록 빈 공간은 1로 채운다.

4. 실수형 간의 형변환

  • 정수형처럼 작은 타입에서 큰 타입으로 변환하는 경우, 빈 공간은 0으로 채운다.
  • float타입의 범위를 넘는 값을 float로 변환하는 경우 ‘±무한대’ 또는 ‘±0’을 결과로 얻는다.

5. 정수형과 실수형간의 형변환

1) 정수형 → 실수형

  • 정수는 소수점 이하의 값이 없으므로 변환이 간단하다.
  • 정수는 2진수로 변환한 다음 정규화를 거쳐 실수의 저장형식으로 저장된다.
  • 실수형은 정수형보다 큰 저장 범위를 갖기 때문에 비교적 간단하지만 실수형의 정밀도의 제한으로 인한 오차가 발생할 수 있다.

2) 실수형 → 정수형

  • 실수형을 정수형으로 변환하면, 정수형의 표현형식으로 소수점 이하의 값은 표현할 수 없기 때문에 실수형의 소수점 이하의 값은 버려진다.

6. 자동 형변환

  • 서로 다른 타입간의 덧셈에서는 두 타입 중 표현범위가 더 넓은 타입으로 형변환하여 타입을 일치시킨 후 연산을 수행한다.
  •   컴퓨터에서의 값의 처리 규칙
    1. 대입 연산자를 사용할 때 대입 연산자를 기준으로 왼쪽과 오른쪽은 같은 자료형이어야 한다.
    2. 같은 자료형끼리만 연산이 가능하다. (연산 결과도 같은 자료형으로 나온다.) 
  • 자동 형변환의 규칙
    • 자동 형변환이 가능한 방향 :
byte (1byte) → short & char (2byte) → int (4byte) → long (8byte) → float (4byte) → double (8byte)
    1. 기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환한다.
    2. 표현범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우에는 값 손실이 없으므로 두 타입 중에서 표현범위가 더 넓은 쪽으로 형변환된다. (자동 형변환)
    3. 실수형은 정수형과 같은 값을 표현하는 방식이 다르기 때문에 값은 크기라도 실수형이 더 큰 표현 범위를 갖고 있다.
    4. char와 short는 서로 범위가 달라서 어느 쪽으로의 형변환도 값 손실이 발생할 수 있어 자동 형변환이 수행될 수 없다.
  • [정리]
    • boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능하다.
    • 기본형과 참조형은 서로 형변환할 수 없다.
    • 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다.

 1) 자동 형 변환(묵시적 형 변환)

  • 자동으로 형 변환이 이루어지기 때문에 개발자가 형 변환을 시켜줄 필요가 없다.
  • 데이터 표현 범위가 작은 자료형을 큰 자료형으로 변환한다. 
public void autoCasting() {
    short s = 12;
    int i = s;   // short -> int 자동 형 변환, 작은 short를 큰 int !
    long l = i;  // int -> long 자동 형 변환

    // float이 long 보다 표현 가능한 수의 범위가 더 크기 때문에 자동 형 변환이 가능하다
//	float f = 1;
    float f = 10000000000000L;
    double d = f;
    double result = 0.0;			
    result = 12 + 3.3; // 정수 < 실수, 12.0 + 3.3 = 15.3
//	long result2 = 30 + 30;  // 30 + 30 = 60, 60을 long로 형 변환해서 저장(60L)
    long result2 = 30 + 30L; // 30L + 30L = 60L

    System.out.println("s : " + s);
    System.out.println("i : " + i);
    System.out.println("l : " + l);
    System.out.println("f : " + f);
    System.out.println("d : " + d);
    System.out.println("result : " + result);
    System.out.println("result2 : " + result2);

    i = '문';
    char ch = 47932; // 범위가 그 사이에 들어가야 한다. 
    byte b1 = 10;
    byte b2 = 20;
//	byte result3 = b1 + b2; // byte, short 타입의 데이터는 연산시 무조건 int 타입으로 처리한다. 
    byte result3 = (byte)(b1 + b2); 

    System.out.println("i : " + i);
    System.out.println("ch : " + ch);
    System.out.println("result3 : " + result3);
}

 2) 강제 형 변환(명시적 형 변환)

[표현법]
(자료형) 데이터;
  • 범위가 큰 크기의 자료형의 데이터를 작은 크기의 자료형으로 변환하려고 할 때 사용한다.
  • (자료형)을 형 변환 연산자라고 한다.
  • 강제 형 변환의 경우 데이터 손실이 발생할 수 있다.
  • boolean은 형 변환이 불가능하다. (true, false 값만 가질 수 있다.)
public void casting() {
    double d = 3.14;
//	float f = d;  // error
    float f = (float) d;
    int i = (int) f;
//	int sum = 0;
    double sum = 0.0;

    System.out.println("d = " + d);
    System.out.println("f = " + f);
    System.out.println("i = " + i);

    i = 10;
    d = 5.76;
    // 1) 수행 결과를 int로 강제 형 변환
//	sum = (int) (i + d); // 10.0 + 5.76 = 15.76 -> 15

    // 2) double 타입의 값을 int로 강제 형 변환
//	sum = i + (int) d; // 10 + 5 = 15

    // 3) double 타입의 변수로 변경한다. 
    sum = i + d;

    System.out.println("sum : " + sum);
    System.out.println((byte) 256);
}