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. 람보
    2022.8.15 완료
  3. 치키티타
    220615
  4. 20220423
  5. 김은희
    20220330 완료
    형변환 그림 보기
  6. aesop0207
    22.03.12. Sat.
  7. 카멜리안_최유리
    20220225 완료
  8. 행달
    완료
  9. 모찌말랑카우
    22.01.20 완료
  10. 생동태
    22.01.13 완료
  11. 구니
    22.01.04 완료
  12. syh712
    2021-11-25
    1. 형변환: 타입컨버젼.
    (1) 자바는 이러한 형 변환을 자동으로 처리해주는데 이러한 전환작업을 자동(암시적) 형 변환(implicit Conversion)이라고 부른다.
    (2) 3.0F의 값은 자동으로 double 타입으로 형 변환이 일어난다. 이것이 가능한 이유는 double 타입이 float 타입보다 더 많은 수를 표현 할 수 있기 때문이다. 타입을 변경해도 정보의 손실이 일어나지 않는 경우 자동 형 변환이 일어난다.
    (3) float a = 3.0;
    상수 3.0은 상수인데, 이 상수는 double 형이다. 이 값을 표현 범위가 좁은 float에 넣으려고 하기 때문에 오류가 발생함.
    => 자동 형 변환의 원칙은 표현범위가 좁은 데이터 타입에서 넓은 데이터 타입으로의 변환만 허용된다는 것이다.
    int a = 3;
    float b = 1.0F;
    double c = a + b;
    => 형변환은 2번 일어남. 3=> 3.0F => 3.0F+1.0F= 4.0F. => 4.0F가 double 타입으로.

    2. 명시적 형 변환(Explicit Conversion)
    float a = (float)100.0;
    => 100.0은 더블형(넓은실수). 더블형에서 플롯형으로 가면 정보손실. 그래서 100.0 앞에 플롯 명시.
    int b = (int)100.0F;
    => 100.0F 플롯값(좁은실수)을 인티저(정수)로 명시.
  13. 네제가해냈습니다
    211113
  14. 드림보이
    2021.11.10. 형변환 파트 수강완료
  15. IaaS
    byte ㅡ> short,char ㅡ> int ㅡ> long ㅡ> floatㅡ> double

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

    1. a+b를 연산하기 위해서는 같은 데이형이어야지만 연산이가능하다. 때문에 여기서 첫번째 형변환이 일어난다.
    참고자료 : byte - short,char - int - long - float - double 데이터의 크기 오름차순이다.

    a : 3.0F b = 1.0F 로 첫번째 형변환이 이루어져 a+b = 4.0F

    Float은 double형보다 작은 데이터형이기 때문에

    double c = 4.0F 에서 4.0F는 4.0(double)이 되고

    double c = 4.0이 최종적으로 된다.

    이렇게 되서 총 2번의 형변환이 일어나며 이를 "암시적 형변환"이라고 의미한다.

    여담으로 암시적 형변환이 적용되지 않는 경우와 명시적 형변환을 사용하는 예제가 있었으면 좋았을 것 같다.
  16. 성치
    2021-10-13일 완료
  17. 네제가해냈습니다
    211011
  18. H4PPY
    1009
  19. 미NI언
    10.6 완료
  20. 아하
    21.09.27 완료
  21. 오션호스
    210816완료
  22. super1Nova
    210810
  23. 이땅콩
    정수 자료형 : byte, char, short, int, long.
    실수 자료형 : float, double

    암시적 형변환이란 데이터 손실이 일어나지 않는 작은 자료형에서 큰 자료형으로 갈 때 자연스럽게 일어난다.
    예를 들어서 double f = 13.1f; 는 에러가 일어나지 않는다.
    왜냐하면 double은 float을 포함할 수 있는 자료형이기 때문.

    ( byte / char ) -> short -> int -> long -> float -> double 의 방향으로 가능하다.
    여기서 float f = 10; / double f1 = 10; 처럼 실수 자료형은 정수를 받을 수 있지만, 정수 자료형은 실수를 받을 수 없다. ( 데이터 손실이 일어나기 때문 )
    따라이 이때 해주는 것이 명시적 형변환이다.

    int a = 13.1; <ERROR>
    int a = (int) 13.1; <SUCCESS>

    이렇게 우리는 암시적 형변환과 명시적 형변환을 배울 수 있었고, 각 자료형에 대해서 배울 수 있었다.
  24. B=loom
    2021.07.19
  25. 악어수장
    5.11 2회독 완료
  26. 드림보이
    수강완료했습니다...
  27. 코딩마스터__
    !
  28. Ruinark
    21.03.17 완료
  29. kkn1125
    21.02.16.토 완료~!
  30. 하연주
    210202 완료
  31. 윤성원
    21/01/27 감사합니다
  32. 김민혁
    21/1/9 수강완료 감사합니당
  33. 자바남
    수강완료 !
  34. 오석민
    2020.09.17완료
  35. 하늘
    2020 09 16
  36. 모내기
    완료
  37. 김태현
    공부완료
    1, 통이 큰 것에 작은 것을 담을 수 있고
    2, 정수를 실수 통에 담으면 정수가 실수로 자동 형변환 되고
    4, 실수는 정수로 자동 형변환이 않되니 float a = (float)100.0; 식으로 인위적 조치를 해야 하고
    5. float a = 100.0;는 실수만 있어 더블형 / float이면 실수뒤에 f추가
  38. 프로페쎠널
    2020.08.21 - 완료
  39. kairess
    2020.08.12완
  40. hvii
    20200806 완료
  41. yulrinam
    200722 시청완료 감사합니다 :)
  42. 広川
    どもうありがとうございます。
  43. yuji
    자바왕초보 1일차 완료

    형변환은 데이터타입을 변경하는 것이다.
    암시적 형변환은 작은 데이터 타입에서 큰 데이터 타입으로 자동적으로 변환해주지만 큰 데이터 타입에서 작은 데이터 타입으로 바꿀수는 없다.

    명시적 형변환은 자동적으로 형변환이 되지 않을떄 수동적으로 형변환해주는것이다
  44. zinkki
    20200531굳
  45. EunSeok Kang
    2020.05.11. 강은석 보았다. 조선기 보았느냐.
  46. 문재인
    감사해요
  47. 띠용~
    정수의 디폴트 값은 int 이기 때문입니당!
    대화보기
    • 개린이
      아직 초보지만 열심히 할게요
    • 수고했어오늘도
      2020-03-13완료
    • 초보
      버그를 잡기위해선 (int)이나 (float) 붙여줘서 데이터 손실이 일어나지만 결과를 도출 되게 만들 수 있다.
      이것을 명시적 형변환이라고한다.
      대화보기
      버전 관리
      egoing
      현재 버전
      선택 버전
      graphittie 자세히 보기