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. 이재우
  2. Jack
    2019/10/31 수강완료
  3. 엘비
    20191031 완료
  4. 허공
    감사합니다!
  5. 주닐
    워나님이 말씀하신 부분은 상수의 데이터 타입 강의에 있습니다 'ㅇ' 참고하세요
  6. 워나
    2019/10/04 완료

    제가 아는 것이 맞는지는 모르겠지만, 혹시 몰라 써둡니다.

    Byte와 Short 같은 경우는 명시하지 않아도 int형이 적용이 됩니다.
    (제가 알기로는 묵시적 형 변환이 되는 거라고 알고 있습니다)

    명시적 형 변환에서
    (데이터 타입)데이터 값
    이라는 방법 말고 다른 방법도 있습니다.

    float의 경우
    예) float = 0.1f;
    이처럼 뒤에 'f'를 붙이는 것도 가능합니다.
    long의 경우
    예) long = 1L;
    이처럼 뒤에 'L'을 붙이는 것도 가능합니다.

    long은 int보다 커 자동 형 변환이 되지만 값이 int의 최댓값보다 커지면 명시를 해줘야 합니다.
    예를 들어..
    long = (int형의 최대크기 보다 큰 값)L;
    이렇게요.

    여기 써둔 정보가 정확하다고 말씀드리긴 어렵지만, 혹시 몰라 써둡니다 ^^
    도움이 되면 좋겠네요
  7. PassionOfStudy
    190904 Note
    *형변환
    자동으로 형을 변환해주는 것 : 자동(암시적) 형 변환(implicit Conversion)이라고 부른다.
    @ 자동 형 변환의 원칙은 표현범위가 좁은 데이터 타입에서 넓은 데이터 타입으로의 변환만 허용된다는 것이다.

    수동으로 형을 변환해주는 것 : 명시적(Explicit Conversion)이라고 한다.
    @ 수동으로 형을 변환해줄 때는 데이터 손실이 발생하는지 고려해봐야한다.
  8. 콩지니
    2019-09-02 수강완료
  9. 홍주호
    20190901 완료
  10. doevery
    수강완료
  11. 다나가
    190816 수강완료!!
  12. 김혜민
    위의 내용이 이해가 안된다면,

    형변환이란 무엇인가?
    형변환을 명시적으로 해줘야하는 경우?
    형변환이 자동적으로 이뤄지는 경우?
    형변환을 하는 방법

    을 숙지하고 넘어가면 됩니다.

    요즘 개발툴이 좋아서 형변환 오류는 거의 잡아줍니다.
    주의, 값 손실이 있을 수 있다.
  13. 강민진
    적으신대로 보면 같다고 볼 수도 있겠네요.
    하지만 만약에
    double b = 100.0;이라고 쓰였고
    float a = b; 를 한다고 해봅시다.
    이 경우에는 double 을 float 에 저장하는 것(double -> float)이므로, 자동 형변환이 일어나지 않아 컴파일 오류가 생기겠죠.
    그래서 float a = (float)b; 라고 적어줘야 합니다.
    첫줄에 적어주신 방법은 이 경우에는 활용할 수 없어요.
    상수를 어떤 변수에 대입하는 경우에만 첫번째 방법을 쓸 수 있고, 나머지 많은 경우(변수를 변수에 대입하는 경우 but, 자동 형변환이 일어나지 않는 경우)에는 두번째 방법을 활용할 수 있다고 생각하시면 되겠네요.
    대화보기
    • 초보
      float a = 100.0f;
      float a = (float)100.0;
      은 같은건가요??
    • BrianJeong
      완료~ 감사합니다.
    • Hyeon-Jun Ha
      완료
    • 얼그레이
      190629 감사합니다!
    • 6/17시작
      6/18 완료
    • 목단비국화차
      완료
    • 김성규
      byte나 short에 정수값을 할당할 때
      정수 상수의 default 타입인 int 형 상수로 값이 들어가는 것도 JAVA에서 허용한다고 하셨었는데...

      byte나 short 에 int형 상수 값이 들어갈 때 에도 암시적(묵시적) 형변환이 일어나는 건 아닌가요?

      조금 의문이 들었던 점이라 질문드립니다..
    • 김동현
      감사합니다
    • 꼬맹이
      System.out.println("a+b="+ ((int)a+(int)b));
      a+b=300 이렇게 나오네요
      대화보기
      • ZANYABI
        형변환 Type Conversion
        컴퓨터가 숫자 200을 저장할때 정수 200은 00000000 11001000
        실수 200.0은 01000011 01001000
        이렇게 같은 숫자지만 전혀 다르게 저장한다.

        만약 우리가 200과 200.0 을 더하고 싶으면 한쪽의 데이터 타입을 다른 한쪽으로 맞춰줘야 컴퓨터는 계산을 처리할수 있을것이다.


        암시적 형 변환 implicit Conversion
        [ double a = 3.0F ] 를 살펴보자. 변수는 타입이 double 이지만, 상수는 float 이다. 하지만 이 코드는 오류가 발생하지 않는다.
        데이터 타입 double 은 데이터 타입 float 보다 많은 수를 표현할수 있기 때문에 java가 자동으로 상수의 데이터타입을 double로 바꿔줍니다.

        byte < short, char < int < long < float < double 순으로 형변환이 가능합니다.


        명시적 형 변환 Explicit Conversion
        앞서 변수의 데이터타입이 더 많은 값을 표현할수 있으면, java가 상수의 데이터타입을 자동으로 바꿔준다고 배웠다.
        [ float a = 100.0 ] 처럼 정보의 손실이 발생하는 경우는 자동형변환이 이루어지지 않는다. 이런경우는 어떻게 해야할까?

        float a = (float)100.0; 처럼 명시해주면 해결됩니다.
        int a = (int)100.1; 의 경우 double 데이터타입을 강제로 int로 명시해줄 경우 정보의 손실이 발생해 int가 표현가능한 100 으로 출력됩니다.
      • 라또마니
        1200명 봤어요! 돌파입니다.
      • 공부하는데 많은 도움이 됬습니다 감사드려요 ~
      • DongYoon Seo
        마지막의 a+b를 int 형으로 명시적 형변환을 해주면 되는 문제입니다.
        System.out.println((int)(a+b)); <<<<<<이런식으로 써주시면 해결됩니다.

        System.out.println((int)a+b); 는 a라는 변수에만 적용되므로 a+b를 괄호로 묶어주어야합니다.
        대화보기
        • anteater87
          저기요 그러면요
          int a = (int)100.0F;
          float b = (float)200.0;
          에서 둘을 더한 값은 당연히 데이터 크기가 더 큰 b의 float 타입으로 형변환이 되잖아요.

          System.out.println(a+b);를 float타입이 아닌 int타입으로 출력할 수는 없나요??
        • 감사합니다
          궁금했던 점 알려주셔서 너무 감사합니다~~
          대화보기
          • j-graphy
            저도 배우는 입장이라 정확한 답변이 될지 모르겠으나, 부동소수점의 문제입니다.
            컴퓨터는 0,1로 소수점도 표현하기 때문에 수 없이 많은(무한한) 소수점의 세계를 정확하게 표현하기에 벅차겠죠.
            그렇기 때문에 이용하는 것이 ‘근삿값’입니다.
            최대한 해당 실수에 근사한 값으로 계산하는 거죠.
            즉 a+b를 하는 순간 a가 float로 형변환을 하여 3.2F라는 float형태의 데이터를 갖게 되는데,
            이를 double형으로 바꿀 때 double의 공간(float보다 더 큰 공간)에 float 형태의 3.2와 가장 근사한 값을 담는 방식으로 저장되기 때문이라고 알고 있습니다. 그 말은 3.2F는 double의 공간에서 3.200000047~~이 가장 근사한 값인거겠죠.

            저도 배우는 입장이라 정확한 부분일지 모르겠으나 제가 이해하고 있는 것은 이와 같습니다!
            대화보기
            • j-graphy
              2019. 2. 1. 학습 완료
            • 궁금해요
              int a = 1;
              float b = 2.2F;

              double c = a + b;

              system.out.println(c);

              결과 : 3.200000047683716

              이렇게 나오는 이유는 뭔가요? 그냥 3.200000 이렇게 나오지 않네요??


              이렇게 나오는 이유는 뭔가요?
            • 책보고배낌
              long 타입은 접미사 l 이나 L을 붙이고 float 타입은 접미사 f나 F를 붙입니다. double 타입은 d나 D를 붙이는데 int가 기본형이어서 뒤에 접미사가 없는 것처럼 실수형은 double이 기본형이기 때문에 double은 접미사를 생략할 수 있습니다. 따라서 실수에 접미사가 없는 것은 double이라고 한 것입니다.
            • 고라니
              잘봤습니다

              10년만에 프로그래밍 공부를 다시하는데 정말 보기 좋은 내용이네요 감사합니다
            • 무카
              이번 수업은 진짜 잘 이해가 안되네요ㅠㅠ
            • 왕쵸뵤
              F 붙은 이유가 float형으로 출력하기 위해서 인거 같아요
              대화보기
              • 더티팬더
                18.12.05
              • 왕쵸뵤
                이해됐어요

                3.0 은 더블형이고

                3.0F 는 플로우형인거죠 ?!
                대화보기
                • 왕쵸뵤
                  float b = 1.0F;
                  double a = 3.0F;

                  숫자뒤에 F붙은이유가 뭐에요 ?~!
                • 전민희
                  18.09.28 형변환 완료
                • 0.5528581520359244
                  오오오
                  알기 쉽다
                • 다람쥐
                  감사합니다
                • float a = 3.14f;
                  int b = (int)a;
                  하면
                  System.out.println(b);

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

                  20180828 화요일 완료
                • 이지선
                  2018.08.28 완료!
                • lse000123@naver.com
                  학원가서 듣는 것보다 이해가 잘되네요! 감사합니다
                • 전하연
                  감사합니다
                • 전하연
                  감사합니다
                버전 관리
                egoing
                현재 버전
                선택 버전
                graphittie 자세히 보기