[Java] 형변환(Type Casting)

Kim Hyen Su·2024년 3월 12일
0

📐Java

목록 보기
4/18

이전 프로젝트와 JPA학습으로 미뤄두었던 Java복습을 드디어 시작하게 됐습니다!! ㅎㅎ
항상 해야지 해야지 하다가 결국 항해99 취업코스 시작하고서 함께 시작을 하네요..ㅜ
그래도 전에 봤었던 내용을 복습하는 것이기 때문에 수월하게 넘어가리라 생각됩니다.

우선, 처음에 자바 실행 과정 및 JVM 구조, 변수에 대해 오랜만에 강의를 들어봤습니다.

처음에는 쉬운 내용이라 빠르게 넘어갔는데 형변환 관련 내용을 보니 몇가지 헤깔렸던 개념들이 있어 이참에 다시한번 테스트 후 블로그에 남깁니다.

형변환에 대해 간단하게 설명 후 바로 테스트한 코드를 보겠습니다.

📐 형변환이란?

  • 자바에서는 두 개 이상의 값을 연산 시에 '동일한 타입으로 맞춰'준 뒤 연산을 수행합니다. 이 과정에서 동일한 타입으로 맞춰주는 것을 형변환 이라고 합니다.

📐 형변환의 기본 원칙

  1. 기본형 끼리만 형변환이 가능합니다.(boolean 제외)
  2. 기본형과 참조형 간에는 형변환이 불가능합니다.
  3. 값의 타입이 다른 경우 형변환이 선행되어야 하지만, 값의 범위가 작은 타입에서 큰 타입으로 형변환은 생략 가능합니다.

📐 형변환 종류

자동 형변환(묵시적)

제가 전에 읽었던 '자바의 정석' 이라는 책에서 자동 형변환이라는 용어를 '묵시적 형변환' 이라고 표현하여 위에 추가로 표기했습니다.

자동 형변환은 위에서 언급한 대로, 값의 범위가 작은 타입에서 큰 타입으로 연산될 경우에는 자동 형변환이 수행됩니다.

이는 실제 형변환이 생략되는 것이 아니라, 자바 컴파일러(javac) 라는 친구가 대신 수행해주기 때문에 가능합니다.

강제 형변환(명시적)

강제 형변환은 반대로 값의 범위가 큰 타입에서 작은 타입으로 연산될 경우에 강제로 형변환을 해줘야 하는 것을 말합니다.

위 그림에서는 화살표의 반대로 연산이 수행될 때 강제 형변환이 수행되어야 합니다.

아래 테스트 코드를 보시면 이해가 조금 더 쉬우실 겁니다.

💻 테스트 코드

		int a = 10;
        double b= 10.0;
        char c = 'a';
        String d = "10";

        // 자동 형변환(대입) : 정수는 기본 타입이 int 이다. 이를 그냥 대입시 long 타입에 int 를 대입하기 때문에 자동 형변환됩니다.
        // 따라서 이는 10 이라는 int 타입이 자동으로 long 타입으로 변형됩니다.
        long e = 10;

        // 강제 형변환(대입) : 소수는 기본 타입이 double 이다. 이를 그냥 대입시 float 타입에 double 을 대입하기 때문에 에러 발생.
        // 이를 해결하기 위해서 'f' 를 통해서 강제로 형변환해줍니다.
        float f = 10.0f;

        // 자동 형변환(연산) : 정수형과 실수형을 연산하면 더 큰 타입으로 자동형변환 된 후에 연산이 수행됩니다.
        double x = a + b;
        System.out.println("x : " + x); // 20.0

        // 강제 형변환(연산) : 정수형 결과를 얻고 싶을 때에는 큰타입을 작은 타입으로 강제 형변환해줘야 합니다.
        int y = a + (int)b; // 20\
        System.out.println("y : " + y);

        // 형변환 주의사항
        // 1. 강제 형변환 시 형변환 되는 것은 type casting 연산의 바로 오른쪽 항만 됩니다.
        //int z = a + (int)b + b; // 오류 발생.

        // 2. 강제 형변환을 하게 되면, 일부 데이터가 손실될 수 있습니다.
        double g = 1.5;
        int q = a + (int)g; // 10 + (int)1.5
        System.out.println("q : " + q);// 11 -> 0.5라는 값이 사라지게 됩니다.

        // 자유 테스트 - char & int
        int i = c + a; // char < int 이므로, char 타입으로 바꾸려면 강제 형변환 해줘야 합니다.
        System.out.println("i : " + i); // a - 97(ASCII) + 10 = 107
profile
백엔드 서버 엔지니어

0개의 댓글