Java에는 여러 주제의 다양한 타입(형태)이 있다.
예를 들어 숫자에 int, long, double, ...이 있는 것처럼.
굳이 이런걸 왜 나누어 놨겠는가?
용도에 맞게 사용하라는 뜻이다.
지금은 성능이 좋아져서 상관이 없다지만,
과거에는 작은 데이터는 크기가 작은 타입에 보관하고,
형태가 다른건 그에 맞는 타입에 보관하라는 뜻.

하지만 우리가 누구냐.
바로 인간이다.
빨간 통에 담으랬더니 까먹고 파란 통에 담을 수도 있는 법.
그리고 이 과정 속 Java에서는 형변환이 발생한다.
밥 한공기를 세숫대야에 담으면 어떻게 되느냐?
담아진다. 즉, 작은 범위는 큰 범위에 담아도 전혀 상관이 없다.
하지만, 큰 범위를 작은 범위에 담으려고 한다면?
세숫대야의 물을 밥 공기 그릇에 담으려고 한다면?
넘치겠지, 사고 나겠지.
Java 역시 큰 범위에서 작은 범위로 형변환을 할 경우
버그(소수점 버림, 오버 플로우 등)가 발생할 수 있기 때문에 애초에 실행 불가능한 컴파일 오류가 발생된다.
Java에서 위험한 행동이니 컴파일 오류를 발생시키는건데,
굳이 굳이 굳이 써야겠다면 방법이 있다.
바로 명시적 형변환.
intData = (int) longData;
data 앞에 축소해서 변환하고자 하는 타입을 명시적으로 적어주는 것이라 해서
명시적 형변환이라고 부른다.

큰 범위에서 작은 범위로 형변환 하는 경우 대표적인 버그에는 오버플로우가 있다.
예를 들어 보면, int의 범위는 -2,147,483,648부터 2,147,483,647이다.
그렇다면 최대 범위에 1을 더한 2,147,483,648L (int 범위를 벗어난 경우 long의 L을 붙여야 함),
이 숫자를 int에 넣으면 어떻게 될까?
(큰 범위에서 작은 범위로 담으면 어떻게 될까?)
윷 판에서 결승점 다음은 첫번째 칸이다.
이와 유사하게 int 범위보다 큰 숫자를 대입할 경우,
범위 최대 숫자 다음은 만큼 범위 최저 숫자부터 출발한다.
문제는 오류가 발생되는게 아니라, 정상 작동한다는 점.
그렇다면 큰 범위를 작은 범위에 일부로 넣는 것도 아니고,
작은 범위를 큰 범위에 넣어보려는 시도도 아닌,
자연스럽게 계산하는 척을 해버린다면 어떻게 될까?
double data = intData + doubleData;
변수의 타입에서 눈치 채셨겠지만,
서로 다른 타입의 계산은 큰 범위로 자동 형변환이 일어난다.
이전에 복잡한 숫자 계산에서 꼭 결과가 n.0 처럼 소숫점이 붙는 경우가 있었는데, 바로 이것이었다.
작은 문제로 보일 수 있지만, 형변환에 대해 알고 넘어가자.