티스토리 뷰

프로그래밍/Java

7장. 형 변환

_andy_ 2018. 7. 27. 21:59

이전 장 바로가기 >>

1장. 개발환경 세팅하기 (java, eclipse)

2장. Eclipse 기본 사용법

3장. 자바 메인 메소드, 기본 출력

4장. 컴퓨터가 읽지 않는 문자, 주석

5장. 변수와 자료형

6장. 상수


이번 장에서는 '형 변환 (Type Conversion)'에 대해 살펴보겠다.


형 변환? 이게 뭐지....

우리는 앞서 '자료형'이라는 개념을 배웠다. 영어로는 Data Type. 즉 어떤 데이터의 형태를 결정하는 요소이다.

단위로는 int, float, double 등이 있었다.


자료형을 설명하면서, 다음과 같은 설명이 있었다.

"쓸데없이 큰 범위의 자료형에 작은 데이터를 넣을 필요가 없고, 작은 범위의 자료형에 너무 큰 데이터를 넣을 수 없기 때문에 이렇게 많은 자료형이 있다."

오늘은 이 설명에 대해 보다 깊게 살펴보면서, 형 변환에 대해 알아볼 것이다.


아! 우선, 형 변환에 대해 나름대로 정의해 보겠다.

"프로그래머가 선정한 자료형에서 프로그램 내 연산 중 오류가 발생할 경우, 프로그램이 자동으로 자료형을 변환해 주는 기능"


아직은 무슨 말인지 모르겠다.


모르겠으면 예시로 이해하자! 

형 변환을 이해하기 위해 다음 예시를 보겠다.


 int num = 100;

 long num1 = 10000000000000L;

 

 System.out.println(num + num1); 


이 프로그램 내 출력문의 결과는 어떻게 나올까? 몇 가지 가능성을 따져 보자.

  1. num과 num1의 자료형이 달라 '연산을 할 수 없다'는 오류를 출력하고 프로그램이 종료된다.
  2. num1의 값이 num의 자료형인 int가 표현할 수 없는 자료이기 때문에, num1의 값이 강제적으로 int의 최댓값으로 변환되어 연산된다.
  3. num1의 자료형이 long 으로 int형보다 훨씬 더 범위가 넓기 때문에, 연산 시 num이 자동으로 long형으로 변환된다.

이 중 답은 무엇일까? 우선 답은 3번이다.


3번에서 중요하게 봐야 할 단어가 있다. 바로 '자동으로' 이다.

코드를 보면, num은 int형이고, num1은 long형으로 당연히 num1의 자료형이 데이터를 저장할 수 있는 범위가 훨씬 넓다.

그런데 출력문에서는 int형에 담을 수 없는 num1의 큰 수를 무조건 더하라고 명령한다.

그러면 프로그램은 이 연산을 그대로 수행할 수 없기 때문에 더 큰 수의 자료형에 작은 수의 자료형을 맞추도록 변환한다.

이것이 바로 '자동 형 변환(Implicit Conversion)' 이다.


자동 형 변환? 정확히 알아보자!

다음은 '자동 형 변환'의 규칙 몇 가지이다.

  1. 자료형의 크기가 큰 방향부터 형 변환이 일어난다.
  2. 자료형의 크기에 상관없이 정수 자료형보다 실수 자료형이 우선시된다.

1번 문장의 의미가 뭘까? 큰 방향부터? 음... 일단 아래 그림을 보자.



오른쪽으로 갈수록 자료형이 포함하는 범위가 넓어진다. 그럼 당연히, 위 예시를 봤을 때와 같이 자료형이 다른 데이터들의 연산이 필요할 시, int형의 데이터가 자동으로 long형으로 변환된다는 의미이다.


그러면 1번 문장은 해결됐고... 2번 문장을 보자.

어찌 보면 당연한 얘기다. 당연히 정수보다 실수의 범위가 더 크니까 실수 자료형이 우선시된다.

그런데 만약, long형 데이터를 int형 데이터로 변환하고 싶다면 어떻게 해야 할까? 그러라고 '명시적 형 변환(Explicit Conversion)'이라는 친구가 있다!

명시적 형 변환! 필요하면 쓰자~

말 그대로다. 자동 형 변환의 규칙에 부합하지 않지만, 형 변환이 필요한 상황이면 명시적 형 변환을 사용하는 원리라고 보면 된다.

아. 이것도 이해 안되니 예제를 보자.


 double pi = 3.14;

 int num = (int) pi; 


코드 둘째 줄을 보면, pi 앞에 (int)라는 코드가 있다. 이 코드는 pi가 다른 자료형일 때 괄호 안에 있는 자료형으로 명시적 형 변환하겠다는 표시다. 따라서, double형 3.14 데이터가 할당되어 있는 pi를 int형 num 변수에 넣기 위해 int 형으로 형 변환한다는 뜻이겠다.


그런데 3.14가 int형으로 변환이 될까? 라는 의문이 들지 않는가? 다음과 같은 것들을 생각해 볼 수 있겠다.

  1. double형 자료를 int형 자료로 변환할 수 없다는 에러가 뜨고 프로그램이 멈춘다.
  2. 3.14가 int형이 되면서 int형이긴 int형인데 int형 같지 않은 int형이란 개념이 생긴다.
  3. 소수점 뒷자리는 그냥 없어지고 3만 남아서 int형으로 저장된다.

정답은 뭘까? 2번은 아닌 것 같고, 1번이면 예제일 리가 없고, 답은 3번일 수밖에 없을 것 같다.

그렇다. 그래서 자동 형 변환의 규칙에 부합하지 않지만, 형 변환이 필요한 상황이면 명시적 형 변환을 사용하는 원리라는 설명을 한 것이다.

double형을 int형으로 바꾸는 것은 자동 형 변환의 규칙에 부합하지 않는다. 하지만, 어떠한 특성에 따라 반드시 int형으로 변환해야 하거나, 혹은 소수점 뒷자리를 모두 지워 버려야 하는 상황이 온다면 명시적 형 변환을 사용할 수 있다.


지금까지 '형 변환'에 대해 알아보았다. 여러모로 중요하게 쓰이는 부분이 많으니, 알아두길 바란다.


도움받은 책 :

윤성우의 열혈 Java 프로그래밍
국내도서
저자 : 윤성우
출판 : 오렌지미디어 2017.07.05
상세보기

Java의 정석
국내도서
저자 : 남궁성
출판 : 도우출판 2008.03.13
상세보기



다음 장 바로가기 >>

'프로그래밍 > Java' 카테고리의 다른 글

9장. 실행 흐름의 컨트롤 - if문, 삼항 연산자  (0) 2018.07.30
8장. 연산자  (0) 2018.07.27
6장. 상수  (0) 2018.07.27
5장. 변수와 자료형  (0) 2018.07.26
4장. 컴퓨터가 읽지 않는 문자, 주석  (0) 2018.07.25
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함