ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java | Casting 형변환
    JAVA/JAVA 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에서는 서로 다른 자료형의 연산이나 저장시에
    자료형을 바꿔주어야 하는 경우가 생기기 때문에 형변환에 대해서는 꼭 알고 있어야 합니다.

    'JAVA > JAVA' 카테고리의 다른 글

    Java | Switch~Case 선택문 추가  (0) 2020.01.17
    Java | 제어문_조건문, 선택문  (0) 2020.01.16
    Java | Operator 연산자  (0) 2020.01.16
    Java | Data Type 자료형  (0) 2020.01.15
    Java | Variable 변수, Scope, Constant 상수  (0) 2020.01.15

    댓글

Designed by Tistory.