Java

형변환

형 변환

형 변환(Type Conversion)이란 데이터의 타입을 변경하는 것이다. 예를 들어 int 타입의 정수 200의 bit 값은 아래와 같다.

00000000 00000000 00000000 11001000

프로그래밍을 처음 시작하는 사람도 컴퓨터는 모든 정보가 0과 1로 만들어진다는 이야기를 들어봤을 것이다. 여러분이 200이라는 숫자를 입력하면 컴퓨터에는 위와 같이 0과 1로 이루어진 조합으로 저장된다. 바로 이 0과 1을 bit라고 부른다. 위의 데이터는 8X4개의 자릿수로 이루어져 있다. 이것을 32bit라고 부른다. 위의 데이터는 int 형으로 숫자 200을 저장했을 때 메모리상에 만들어지는 내용이다. 그럼 실수형인 float 타입으로 정수 200.0을 저장하면 어떻게 될까? 사람에게는 똑같은 수인 정수 200과 실수 200.0을 컴퓨터는 전혀 다른 방식으로 저장한다. float 타입의 정수 200.0의 bit 값은 아래와 같다.

01000011 01001000 00000000 00000000

정수 200과 실수 200.0의 bit 값이 완전히 다른 것을 알 수 있다. 이렇게 형식이 다른 데이터들을 더하려면 한쪽의 데이터 타입을 다른 쪽의 데이터 타입으로 전환(Conversion)해야 한다. 자바는 이러한 형 변환을 자동으로 처리해주는데 이러한 전환작업을 자동(암시적) 형 변환(implicit Conversion)이라고 부른다.

자동 형 변환

아래 예제를 보자. (실행)

double a = 3.0F;

위의 코드는 double 타입의 변수 a에 float 타입의 값을 대입하고 있다. 이 때 3.0F의 값은 자동으로 double 타입으로 형 변환이 일어난다. 이것이 가능한 이유는 double 타입이 float 타입보다 더 많은 수를 표현 할 수 있기 때문이다. 타입을 변경해도 정보의 손실이 일어나지 않는 경우 자동 형 변환이 일어난다.

반대로 아래의 예제는 오류가 발생한다. 상수 3.0은 상수인데, 이 상수는 double 형이다. 이 값을 표현 범위가 좁은 float에 넣으려고 하기 때문에 오류가 발생한다. (실행)

float a = 3.0;

자동 형 변환의 원칙은 표현범위가 좁은 데이터 타입에서 넓은 데이터 타입으로의 변환만 허용된다는 것이다.

아래는 자동 형 변환이 일어나는 규칙을 보여준다.

byte 타입은 short가 될 수 있지만 short는 byte 타입이 될 수 없다. long은 float가 될 수 있지만, float는 long이 될 수 없다.

상수와 상수를 연산한다면 어떻게 될까? 다음 예제를 보자. (실행)

int a = 3;
float b = 1.0F;
double c = a + b;

위의 연산은 두 번의 형 변환이 일어난다. 우선 a와 b를 더하기 위해서 정수 a와 실수 b 중 하나가 형 변환을 해야 한다. 위의 그림에 따르면 int와 float가 붙으면 int가 float가 되기 때문에 변수 a에 담겨있는 값 3은 float 타입이 된다. 연산 결과는 float 타입이다. 하지만 이 값이 담겨질 변수 C의 타입은 double이다. float가 double 타입의 변수에 담기기 위해서는 float가 double로 형 변환을 해야 한다. 이렇게 해서 최종적으로 형 변환된 값이 변수 c에 담겼다.

명시적 형 변환

자동 형 변환이 적용되지 않는 경우에는 수동으로 형 변환을 해야 한다. 이를 명시적(Explicit Conversion)이라고 한다. 아래 예제는 모든 행의 코드에서 오류가 발생한다. 자동 형 변환이 이루어지지 않기 때문이다. (실행)

float a = 100.0;
int b = 100.0F;

위의 예제를 조금 수정해보자. 아래 코드는 오류가 발생하지 않는다. (실행)

float a = (float)100.0;
int b = (int)100.0F;

아래와 같이 괄호 안에 데이터 타입을 지정해서 값 앞에 위치시키는 것을 명시적인 형 변환이라고 부른다.

 

형 변환은 한 번에 설명할 수 있는 주제는 아니다. 여러분이 객체지향까지 진입하면 다양한 방법으로 형 변환이라는 주제가 다시 언급될 것이다. 일단은 이정도로 언급하고 후속 수업을 통해서 형 변환에 대해서 좀 더 심화된 내용을 알아가자.

댓글

댓글 본문
작성자
비밀번호
  1. 전민희
    18.09.28 형변환 완료
  2. 0.5528581520359244
    오오오
    알기 쉽다
  3. 다람쥐
    감사합니다
  4. float a = 3.14f;
    int b = (int)a;
    하면
    System.out.println(b);

    결과 = 3
  5. 이준송
    2바퀴째 ㅎㅎ 감사합니다
  6. 어셔
    감사히 잘 들었습니다. 20180901
  7. Daydream
    오늘도 열공하고 갑니다 20180831
  8. 백선우
    어렵게 어렵게 돌려가면서 이해했슴닷 ㅠㅠ 벌써부터..ㅠㅠ

    20180828 화요일 완료
  9. 이지선
    2018.08.28 완료!
  10. lse000123@naver.com
    학원가서 듣는 것보다 이해가 잘되네요! 감사합니다
  11. 전하연
    감사합니다
  12. 전하연
    감사합니다
  13. 진영
    8/10 완료
  14. 감자감자
    완료!
  15. 다블스타
    완료
  16. Jae Won Jung
    감사합니다
  17. 완료
  18. 야부키죠
    오우 처음엔 개어려웠는데 복습도하다보니 이해도 쏙쏙 ㅎㅎ
  19. 전민희
    7월7일 완료
  20. 멀캠A_Son
    완료
  21. 감사합니다
  22. Bulgogi
    5월7일 형변환
  23. LeeBori
    Good~
  24. 김현태
    오늘은 여기까지
  25. 4월 24일 형변환
  26. 송영일
    20180424
  27. 박현모
    감사합니다~
  28. ㅎㅎ
    열심히 하고있답니다! 감사해여!
  29. 김세창
    제가 이해한 내용과 조금 다른 것 같습니다.

    Float a = 100.0F; 이렇게 되어야하며,
    만약 int를 사용하셔야한다면,

    int a = (int)100.0F 가 되어야하는거 아닌가요?
    대화보기
    • Float a = (int)100.0 -> 100
      즉, Float a = 100 인거 잖아요 그럼 암시적 형변환이되어 동일하게 사용됩니다!

      하지만 Float a = 100.1F
      Float a = (int)100.1은 같은 결과 값이 아니겠죠.
      그러니 (int)100.0 보다는 (float)100.0이 손실이 적은 안전한 방법입니다.
      대화보기
      • 김예슬
        180308
        암시적형변환(자동)
        사용자의 프로그래밍을 편리하게 하기위해.. 자동으로 변환하는것.. 정보의 손실이 일어나지 않는선에서!
        명시적형변환(수동) :D?
      • fANXY님 변수 선언 후 System.out.println(); 을 사용해서 출력하셨나요?
        출력하지 않고 선언만 하게 되면 콘솔창에는 아무 것도 뜨지 않습니다.
        대화보기
        • 유타
          Float a = 100.0F;
          Float a = (int)100.0;

          이 두개는 그럼 동일하게 사용이 되는건가요?? 첫번째와 두번째중 아무거나 사용해도 되는지 궁금합니다
        • 했는데 콘솔창에 아무것도 안뜨는건 뭔가요??ㅜㅜ
        • 2차
        • 자바초보
          어떤 경우에는 자동 변환이 되고 어떤 경우에는 수동 변환을 해야하는지 궁금합니다~ 요약 너무 좋아요ㅠㅠ 감사합니당
        • ㅇㅇ
          이해가 될듯말듯 어렵다
        • 반자동
          으 이건 잘 이해 못했네요 나중에 한번더 !
        • 폭스킴
          부동 소수점 문제를 검색해보세요.
          정밀한 실수 표현을 위해서는 고정 소수점 방식을 쓰면 되는데,
          메모리 낭비를 줄이기 위해서 IEEE에서 표준으로 채택한 부동 소수점 방식을 사용하고 있어요.
          때문에 연산이 일어나면 오차때문에 값이 정확하게 나오지 않아요.
          자바 뿐만 아니라 다른 언어에서도 동일한 문제가 있습니다.
          설명할 능력도 안되지만, 이해하기 힘들 수 있는 부분이라 검색을 해서 공부를 좀 해보시면 재밌으실 거예요~ ^^
          대화보기
          • Narcoker
            이것저것하다가 발견해서 질문드립니다.
            package test;

            public class test {

            public static void main(String[] args) {
            float a;
            a=100.11F;
            double b=a;
            System.out.println(b);
            }

            }

            출력
            100.11000061035156

            이렇게 출력이 되는 이유가 궁금합니다..
          • C랑 너무비슷해서 수월하게 잘하고 있습니다. 물론 다른게 몇가지 보이네요. byte가 새롭고, char이 2바이트인것도 신기하고.. "char a = 3.14;"는 C에서는 자동으로 3으로 변환되지만 자바에서는 아예 안된다는것도 새롭군요. 또 C에는 있는 16바이트 실수형인 long double이 자바에는 없다는것도 그렇고요. 잘배우고갑니다 ^^
          • JeongHo Park
            좋은 강의 감사합니다.
          • GoldPenguin
            감사합니다.
          • 수강완료.!
          • 호빵돌2
            그렇지 않을까요? 변수 a는 데이터 타입이 double이니까?
            대화보기
            • woojs1209@naver.com
              double a = 3.0F; 라고 하면 3.0을 사용자가 float이라고 지정을 했지만 컴퓨터가 알아서 double형으로 형변환을 시켜서 오류가 발생하지 않는다고 하셨는데 그럼 컴퓨터 자체가 double형으로 받아들이기 때문에 변수 a가 차지하는 메모리는 8byte가 되는건가요?
            • ywChoi
              감사합니다!
            • yoon88
              완료
            • 박병장
              완료
            • 미림_likelion
              수강 완료했습니다. 감사합니다.
            버전 관리
            egoing
            현재 버전
            선택 버전
            graphittie 자세히 보기