JAVA101

준비중..

JAVA101

자바 프로그래밍 입문

04 타입과 형변환

# 타입과 형(Types)변환 ## 들어가며 --- 앞서 우리는 몇 가지 코드를 작성하며 프로그래머로서의 첫발을 디뎠습니다. 다들 어떠셨나요? “오! 드디어 컴퓨터와 이야기를 나눌 수 있게 되었어!” 라는 분들도 계셨을 것이고, 또 어떤 분들은 예전의 저와 같을 수도 있을 것 같네요. > “좀 더 멋진 프로그램을 만들고 싶은데, > 지금 할 수 있는 건 문자열 출력, 숫자 계산뿐이라니..ㅠ_ㅠ” 라며 다소 실망하신 분들도 있을 겁니다. ![클라우드스터딩-자바-멋진-프로그램-어플-로봇](https://i.imgur.com/TU42AiP.png) 사실 우리는 일상속에서 너무나도 멋진 프로그램들을 이미 접해왔기 때문에, 어쩌면 당연한 반응일 지 모르겠습니다. 하지만 멋진 프로그램을 만들기 위해서는 반드시 *훈련의 시간을 거쳐야 합니다*. 가령 외국인들과 대화를 하고 더 나아가 멋진 연설을 하려면, 먼저는 간단한 단어 또는 문장부터 연습해야 할 겁니다. 프로그래밍 또한 하나의 언어로써 마찬가지인 거죠. 어쩌면 지루하고 재미없을 지금의 훈련들이, 프로그래머로서의 성장 발판이 되어 줄 것입니다. 첫술에 배부를 수 없고, 천 리 길도 한걸음부터라고 하였으니, 계속해서 뚜벅뚜벅 훈련하며 멋진 프로그래머로 성장해봅시다. ![클라우드스터딩-자바-우보천리](https://i.imgur.com/IBVtIc3.gif) 이전 장에서 변수와 타입 그리고 연산자에 대해 배웠습니다. 개념은 간단한데 실습을 진행하다 보면, 생각보다 많은 문제들이 발생합니다. 무엇 때문이었을까요? 다양한 이유가 있겠지만, 아마도 *타입에 숨겨진 몇 가지 원칙들*이 우리를 괴롭혔을 것입니다. 지금부터 타입의 숨겨진 비밀들을 하나씩 파헤쳐보도록 하죠. ## 나눗셈 연산 주의점 --- 나눗셈 연산은 `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가 됩니다. ![클라우드스터딩-자바-정수-연산](https://i.imgur.com/IZl4sNE.png) 다음으로 아래의 변수 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을 대입하고 있습니다. 변수와 값의 타입이 다르죠? 이런 경우 타입 불일치 에러가 발생합니다. ![클라우드스터딩-자바-타입-불일치](https://i.imgur.com/GB1uDEc.gif) 에러를 없애기 위해서는 양쪽의 타입을 맞추어야 합니다. ``` # 해결책 String seven = "7"; // String으로 통일 int seven = 7; // 또는 int로 통일 ``` ## 타입 변환 주의점 --- 앞서 타입 불일치의 문제는 양쪽을 같게 함으로써 해결한다 배웠는데, 이러한 타입 변환은 자동변환과 직접변환(casting)이라는 두 가지 방법이 존재합니다. ![클라우드스터딩-자바-형변환-종류](https://i.imgur.com/OU3Wxx9.png) **자동 변환**이란, 작은 타입이 큰 타입으로 알아서 변환되는 과정입니다. 자바에서 int는 double보다 작습니다. 따라서 아래의 변수 q의 경우 자동 변환이 일어나게 되죠. 이는 마치 작은 컵의 물을 더 큰 컵에 따르는 것과 같습니다. ``` int p = 2; // 2 double q = 2; // 2 -> 2.0 ``` 반대로 큰 타입을 작은 타입으로 대입할 땐 자동 변환은 수행되지 않으며, 에러가 발생합니다. ![클라우드스터딩-자바-형변환](https://i.imgur.com/g6vuhiZ.gif) 가령, 큰 컵의 물을 작은 컵에 붓는다고 한다면 어떤 일이 발생할까요? 맞습니다. 물이 넘치겠죠? 마찬가지로 더 큰 타입을 작은 타입에 대입하려 한다면, 정보의 손실이 일어나게 됩니다. 자바는 이러한 문제 발생을 방지하기 위해 에러를 출력하죠. ``` 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>