JAVA/JAVA

Java | Casting 형변환

pathas 2020. 1. 16. 21:41

Casting 형변환

데이터를 변수에 저장하거나 연산 중간에 데이터의 자료형을 변환하는 것

객체 형변환과 연관(Swing)


종류

  • 자동 형변환(묵시적)
    1. 바이트 크기가 작은 자료형에서 큰 자료형으로 대입하는 경우
      ex) byte → short
    2. 덜 정밀한 자료형에서 더 정밀한 자료형으로 대입하는 경우
      ex) int → float, float는 실수값을 표현하기 때문에 int보다 더 정밀함
    3. 서로 다른 자료형을 가진 데이터들이 연산될 경우
      저장 공간이 더 큰 자료형으로 자동 형변환
    4. 단점 : 메모리 낭비가 심함
  • 강제 형변환(명시적) : 변수 앞에 형변환 연산자 작성
    1. 바이트 크기가 큰 자료형에서 작은 자료형으로 대입하는 경우
    2. 더 정밀한 자료형에서 덜 정밀한 자료형으로 대입하는 경우
    3. 서로 다른 자료형을 가진 데이터들을 연산하는 경우
      바이트 크기가 더 작은 자료형을 가진 변수에 저장하기 위해서는
      강제 형변환으로 자료형을 맞춰 주어야 함
    4. 단점 : 강제로 자료형을 변경하다보니 데이터 손실이 발생할 수 있음
      ex 1) int i = (int)3.5; → 0.5가 탈락되고 3만 저장됨
      ex 2) int iNum = 1000;
      byte bNum = (byte)iNum;
      1000이 byte 저장 용량을 초과해 데이터 손실이 발생하기 때문에
      대입된 값 -24가 저장됨

※ boolean은 형변환에서 사용하지 않음


형변환 연산자

(dataType) : 괄호 안에 형변환을 원하는 자료형을 작성하면 됨

ex) (int), (char), (float),,,


사용례_자동 형변환

public class Op5Cast {
    public static void main(String[] args) {
         // 자동 형변환
        // 1. 데이터를 그보다 큰 자료형에 저장
        short s = 12;
        // 2진수로 저장됨 | short에 저장된 12의 경우 00000000 00001100
        int i = s; 
         // 00000000 00000000 00000000 00001100 → 메모리 낭비가 심해짐

        // 2. 서로 다른 자료형이 연산될 경우
        char c = 'A';
        int n = c + 1; 
         /* char(2byte) + int(4byte) → int(4byte) + int(4byte)
          int 저장 공간이 더 크기 때문에 int 자료형으로 저장해야함 */
        System.out.println("n :" + n); // n: 66

         int x = 123;
        float y = x + 12.3f; // int + float → float + float → float
        System.out.println("y: " + y); // y: 135.3

         byte s2 = 12;
        short s3 = 45;
        int re = s2 + s3; 
        /* 산술연산자 사용시 s2와 s3가 int로 자동 형변환되기 때문에
        변수의 자료형으로 int를 사용해야함 */
        System.out.println("re: " + re); // re: 57
    }
}

사용례_강제 형변환

public class Op5Cast {
    public static void main(String[] args) {
        char c = 'A';
        int n = c + 1; 
        System.out.println("(char)n:" + (char)n); // (char)n: B
         // 변수 n의 자료형을 강제로 int에서 char로 형변환해서 출력

         byte s2 = 12;
        short s3 = 45;
         short re2 = (short) (s2 + s3);
         /* s2, s3가 연산 과정에서 int로 작동하기 때문에 괄호로 묶어
         연산을 먼저 실행한 뒤에 (short)를 작성해주어야 함, int -> short */
        System.out.println("re2: " + re2); // re2: 57
    }
}

사용례_System.out.printf() 활용 (1)

System.out.printf() : 문자열에 양식을 지정해서 출력하는 함수

형식) printf("출력문자열, 출력양식", 출력대상,,,)
출력양식 기호 : %d(정수값), %c(문자), %s(문자열), %f(소수점)
※ 출력양식 기호와 출력대상이 1:1로 대응하기 때문에 개수가 같아야 함

public class Op6Cast2 {
    public static void main(String[] args) {
        int num1 = 20, num2 = 30;

        System.out.printf("첫 번째 숫자=%d, 두 번째 숫자=%d", num1, num2);
         // 첫 번째 숫자=20, 두 번째 숫자=30

        System.out.println(); // 줄바꿈
        System.out.print('\n'); // 줄바꿈 특수기호 사용

         char ch = 'A';
        System.out.println("ch: "+ch); // ch: A
         // println은 내부에 저장된 ASCII 값을 문자로 변환해서 출력

         System.out.printf("문자 %c의 ASCII 값 : %d\n", ch, (int) ch);
         // 문자 A의 ASCII 값 : 65
         /* printf의 %d는 숫자를 그대로 출력하기 때문에
            ch를 int로 형변환 해주어야 함 */

        int ch2 = ch;
         // ch에 담겨있던 문자의 ASCII 코드 값이 정수로 ch2에 저장됨
        System.out.println("ch2: "+ch2); // ch2: 65
    }
}

사용례_System.out.printf() 활용 (2)

public class Op6Cast2 {
    public static void main(String[] args) {
        int java = 90, jsp = 85, oracle = 70;
        int sum = java + jsp + oracle;
        System.out.printf("sum=%d입니다.\n", sum);

        int avg = sum/3;
        double avg2 = sum/3;
        System.out.println("avg: "+avg+", avg2: "+avg2); 
         // avg: 81, avg2: 81.0
         /* avg2: sum/3 에서 int로 변환돼서 계산된 뒤에
            double에 저장되기 때문에 81.0으로 출력됨 */

         double avg3 = (double)sum/3;
        System.out.println("avg3: "+avg3);
         // avg3: 81.66666666666667
        // sum/3 계산시에 sum을 double로 형변환 해주어야 소수점까지 저장됨

         System.out.printf("avg3: %.2f", avg3);
         /* avg3: 81.67, %f로 출력될 소수점 자리수 설정
           형식) "%.소수점자리수f" */
    }
}

자료형이 철저하게 정해져있는 Java에서는 서로 다른 자료형의 연산이나 저장시에
자료형을 바꿔주어야 하는 경우가 생기기 때문에 형변환에 대해서는 꼭 알고 있어야 합니다.