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. Ryan.L
    감사합니다.!
  3. 잘보고있습니다. 좋은강의 무료로 제공해주셔서 감사합니다!!
  4. 이고잉님 강의 잘 보고있습니다~
    그런데 외람된 얘기지만 기존 페이스북 아이디로 접속을 했었는데
    제 컴이 이상한건지는 모르겠지만 갑자기 페북접속이 불가능하다고 해서
    회원가입으로 수업을 듣게 되었네요
    그래서 기존에 들었던 수업들을 일단 봤어요로 표시를 했습니다.
    오해 없으셨으면 합니다~^^
    언제나 좋은강의 감사드려요~좋은 주말 보내세요~
  5. JustStudy
    고맙습니다
  6. yskioi
    감사합니다.
  7. 덕분에 잘 배워가요

    책을보고하는데도 도통 이해가 안갔는데, 정말 쉽게 설명해주시네요 ㅠㅠ

    감사합니다~
  8. 아리가또고자이마시다!!
  9. Devani0310
    감사합니다
  10. 오빠는다르다
    감사합니다!!!!
  11. 다음 강의의 (2/4) 형변환 강의 하단 글 '암시적 형변환'과 비교해 보시면 될 것 같습니다.
    대화보기
    • 박첩구드
      캐스팅 정말 중요하다구 들었습니다 ㅎㅎ 감사해요!
    • Byunghawk Lee
      보고 다음과정으로 갑니다
    • 현팡
      정주행중입니다
    • 허니버터
      잘보고 갑니다
    • 저도 이게 궁금해요 ㅠㅠ!!!!
      대화보기
      • Jung Hwan Sung
        왜 형변환이란게 필요한건지 궁금하네요~
      • 김도현
        질문이 있습니다.
        float a = 100.0; 이 문장을
        float a = (float)100.0; 으로 명시적 변환하는 것과
        float a = 100.0F;로 바꿔주는 것은 무슨 차이가 있죠?

        둘 다 float이라고 명시해주지 않으면 Double로 인식할 것을
        명시해줌으로써 float로 인식되도록 수정한 것 아닌가요?

        '상수의 데이터타입'에서는 상수 뒤에 F를 적는 방식만 설명해주시고
        '형변환'에서는 앞에 괄호를 붙이는 방식만 설명해주셔서
        두 가지 방식이 서로 다른 것인가 싶네요.
      • 김까망
        100.1F는 어차피 실수니까 더 좁은데이터범위를 가진 정수가 될수없으므로(데이터손실 우려) 오류가 뜹니다.

        강의에서 나온대로, 억지로 int b = (int)100.1F; 하게되면 소수점을버리고 int로서 b로 100이 지정되겠죠.
        대화보기
        • evolve
          int b = 100.1F;
          일때는 어떻게 되는것인가요?
        • 궁그미
          그렇다면,
          int a = 3;
          float b = 1.0F;
          double c = a + b;

          일 때 a+b는 float형이니까 double형 변수 c에 담기기 위해서 자동형변환이 되는건가요?
        • egoing
          맞습니다. 정수는 기본적으로 int형이기 때문에 int a = 3;은 문제가 없는 것이고요.
          실수는 double이기 떄문에 1.0을 float 형으로 지정하기 위해서는 1.0F라고 F를 붙여줘야 합니다.
          대화보기
          • 초보생
            한참 재밌게 공부하는 사람입니다.
            자동 형 변환에 대해서 질문이 있는데요


            위의 예시를 보면

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

            int 즉 정수 타입은 자동 더블로 인식되는 것이고
            float 타입은 자동이 아니라 수동으로 업그래이드를 시켜줘야 한다는 말인가요?

            답변 부탁드립니다:)
          • egoing
            그렇죠. 더 적은 메모리를 사용한다는 의미로 생각하시면 될 것 같습니다.
            대화보기
            • 휴정
              데이터 손실을 최소화로 한다는것은 최적화를 한다는 말과 비슷한 개념인가요?
            • 환글
              Java 를 속속들이 알려 주셔서 고맙습니다.
            • 디지
              예들들어 실수의 경우 int로 명시적 변환을 하게되면
              int 형은 소수점 아래자리를 나타낼수 없기에 그만큼 데이터 손실이 일어나게 됩니다.
              대화보기
              • old 막내
                정말 감사합니다. 이제 책을 봐도 이해가 되겠네요.
              • 히힛
                명시적 형변환에서도 정보의 손실은 발생하는 것 인가요????
              • 동글
                명시적 형변환 아래 설명에서 [ 자동 형 변환이 적용되지 경우에는 -> 자동 형 변환이 적용되지 않는경우에는 ] 이 아닐까 합니다. 강의 잘보고 있습니다!
              • 설림
                ㅡㅜ 감사합니다. 제대로 이해하려면 자료구조도 공부해야겠네요...
                대화보기
                • happydeveloper
                  제가 답글에 설명을 잘 못한 것도 있고 좀 어려운 질문인 것 같기도 해요. 그래도 그런 의문을 가진 것만으로도 대단하신 것 같아요.
                  대화보기
                  • 설림
                    친절한 답변 감사합니다. 제 지식이 부족해 설명을 들어도 이해는 안되네요 ㅜ 그냥 그런가보다 하고 알아두겠습니다. 감사합니다.
                    대화보기
                    • happydeveloper
                      long 타입의 경우 자바 내부적으로 2의 보수를 이용하여 데이타를 표현하므로
                      최대 표현할 수 있는 수는 9223372036854775807 까지 표현 할 수 있습니다.

                      하지만 float의 경우는 자바 내부적으로 부동소수점 표현법을 사용하여 데이타를 표현하고 있습니다. 그래서 최대 표현 가능한 수는 3.4028235 E38이고 정수형으로 변환하면 34028235000000000000000000000000000000 까지 표현할수 있습니다.

                      그러므로 데이타형의 비트 길이는 짧아도 float가 long보다 짧지만 데이타의 표현 방법이 float가 더 큰수와 작은 수를 담을 수 있기 때문에 자동 형변환이 되는 것 같습니다.

                      참고한 문서 - http://docs.oracle.com......tml
                      대화보기
                      • 설림
                        long에서 float으로 형변환하는 경우에는 8byte가 4byte로 되는건데 데이터손실이 일어나지 않나요? 손실이 있으면 자동으로 형변환이 일어나지 않을텐데...
                      • akihaker
                        전 멍청한가봐요. 이해가 안가요..ㅠㅠ 맨붕이에요.^^;;
                      • 김영재
                        와~ 감사합니다.
                        강좌가 머리에 쏙쏙 잘 들어옵니다.
                        감사~!
                      버전 관리
                      egoing
                      현재 버전
                      선택 버전
                      graphittie 자세히 보기