# 타입과 형(Types)변환
## 들어가며
---
앞서 우리는 몇 가지 코드를 작성하며 프로그래머로서의 첫발을 디뎠습니다. 다들 어떠셨나요? “오! 드디어 컴퓨터와 이야기를 나눌 수 있게 되었어!” 라는 분들도 계셨을 것이고, 또 어떤 분들은 예전의 저와 같을 수도 있을 것 같네요.
> “좀 더 멋진 프로그램을 만들고 싶은데,
> 지금 할 수 있는 건 문자열 출력, 숫자 계산뿐이라니..ㅠ_ㅠ”
라며 다소 실망하신 분들도 있을 겁니다.

사실 우리는 일상속에서 너무나도 멋진 프로그램들을 이미 접해왔기 때문에, 어쩌면 당연한 반응일 지 모르겠습니다. 하지만 멋진 프로그램을 만들기 위해서는 반드시 *훈련의 시간을 거쳐야 합니다*. 가령 외국인들과 대화를 하고 더 나아가 멋진 연설을 하려면, 먼저는 간단한 단어 또는 문장부터 연습해야 할 겁니다. 프로그래밍 또한 하나의 언어로써 마찬가지인 거죠.
어쩌면 지루하고 재미없을 지금의 훈련들이, 프로그래머로서의 성장 발판이 되어 줄 것입니다. 첫술에 배부를 수 없고, 천 리 길도 한걸음부터라고 하였으니, 계속해서 뚜벅뚜벅 훈련하며 멋진 프로그래머로 성장해봅시다.

이전 장에서 변수와 타입 그리고 연산자에 대해 배웠습니다. 개념은 간단한데 실습을 진행하다 보면, 생각보다 많은 문제들이 발생합니다. 무엇 때문이었을까요? 다양한 이유가 있겠지만, 아마도 *타입에 숨겨진 몇 가지 원칙들*이 우리를 괴롭혔을 것입니다.
지금부터 타입의 숨겨진 비밀들을 하나씩 파헤쳐보도록 하죠.
## 나눗셈 연산 주의점
---
나눗셈 연산은 `int`와 `double`이 각각 다르게 동작합니다.
```
double a = 5.0 / 2.0; // 2.5
int b = 4 / 2; // 2
int c = 5 / 2; // 2
```
위 코드들 중, 변수 c의 연산 과정을 살펴볼까요?
- 5를 2로 나눔 → 2가 반환 됨
- 반환된 2가 정수형 변수 c로 대입 됨
무언가 이상합니다. 5를 2로 나누면 2.5가 나올 거라 예상했는데, 왜 2가 반환되었을까요? 여기에 숨겨진 연산의 법칙이 있습니다. *정수끼리의 연산 결과는 정수입니다*. 따라서, 5 / 2는 소수점 이하가 버려진 2가 됩니다.

다음으로 아래의 변수 d의 연산 과정 또한 눈여겨볼 필요가 있습니다. 앞서 5 / 2의 결과가 2임을 배웠는데, 왜 2.0이 되었을까요? 2는 2.0이라고 보아도 무방하기 때문입니다.
```
double d = 5 / 2; // 2 -> 2.0
```
위 코드는 자동변환의 예로, 아래에서 다시 다루도록 하겠습니다.
> 한 타입이 다른 타입으로 변환 되는 것을 **형변환**(type conversion)이라 합니다.
## 대입 연산 주의점
---
다음으로 변수에 값을 대입할 때, **타입 불일치**(type mismatch) 여부를 주의해야 합니다.
```
# 에러코드
String seven = 7; // 타입 불일치
```
위 코드는 문자열(String) 타입 변수 seven에 정수(int) 값 7을 대입하고 있습니다. 변수와 값의 타입이 다르죠? 이런 경우 타입 불일치 에러가 발생합니다.

에러를 없애기 위해서는 양쪽의 타입을 맞추어야 합니다.
```
# 해결책
String seven = "7"; // String으로 통일
int seven = 7; // 또는 int로 통일
```
## 타입 변환 주의점
---
앞서 타입 불일치의 문제는 양쪽을 같게 함으로써 해결한다 배웠는데, 이러한 타입 변환은 자동변환과 직접변환(casting)이라는 두 가지 방법이 존재합니다.

**자동 변환**이란, 작은 타입이 큰 타입으로 알아서 변환되는 과정입니다. 자바에서 int는 double보다 작습니다. 따라서 아래의 변수 q의 경우 자동 변환이 일어나게 되죠. 이는 마치 작은 컵의 물을 더 큰 컵에 따르는 것과 같습니다.
```
int p = 2; // 2
double q = 2; // 2 -> 2.0
```
반대로 큰 타입을 작은 타입으로 대입할 땐 자동 변환은 수행되지 않으며, 에러가 발생합니다.

가령, 큰 컵의 물을 작은 컵에 붓는다고 한다면 어떤 일이 발생할까요? 맞습니다. 물이 넘치겠죠? 마찬가지로 더 큰 타입을 작은 타입에 대입하려 한다면, 정보의 손실이 일어나게 됩니다. 자바는 이러한 문제 발생을 방지하기 위해 에러를 출력하죠.
```
int r = 10.4; // ERROR: double을 int로 대입불가
```
손실을 감수하고 억지로라도 넣으려고 한다면 어떻게 해야 할까요? 이럴 땐 **직접 변환**, *다른 표현으로 캐스팅*을 선언하면 됩니다. 캐스팅(casting)이란 큰 타입을 작은 타입으로 강제 변환하는 것입니다.
```
int s = (int) 10.4; // 10.4의 소수점 이하를 버리고 정수 10으로 변환
```
자료형을 강제 변환케 하는 캐스팅, 참 편리한 기능입니다. 하지만 모든 타입이 다 변환되는 것은 아님을 주의하세요. 추후 상속과 인터페이스 영역에서 캐스팅에 대해 다시 한 번 다루도록 하겠습니다.
## 요약
---
1. int와 int의 연산 결과는 int이다.
```
int a = 5 / 2; // 2
```
2. 변수에 값이 대입되는 경우, 타입이 같아야 한다.
```
String seven = 7; // ERROR
```
3. 타입변환은 자동변환과 직접변환(캐스팅)이 있다.
```
double p = 2; // 2 -> 2.0
int q = (int) 10.4;
```
## 확인하기
---
<div class="interact_responsive_padding" style="padding:100% 0 0 0;position:relative;margin-bottom:5px;"><div class="interact_responsive_wrapper" style="height:100%;left:0;position:absolute;top:0;width:100%;"><iframe id="interactApp5cb08ba7790970001464d003" width="100%" height="100%" style="border:none;max-width:100%;margin:0;" allowTransparency="true" frameborder="0" src="https://quiz.tryinteract.com/#/5cb08ba7790970001464d003/q/1?method=iframe"></iframe></div></div>