형변환을 들어가기 전에 자바에서 갖는 문자, 숫자, 논리값에 대해 다시 한 번 짚고 넘어가자. 문자, 숫자, 논리값 이외에 객체형도 있지만 일단 3가지 값에 대한 정리를 하고 예제를 통해 알아보겠다.
1. 문자 : char, 2바이트
2. 숫자 : 정수 byte(1바이트) < short(2바이트) < int(4바이트) <long(8바이트)
실수: float(4바이트) < double(8바이트)
3. 논리값 : boolean, 1바이트
문제에 들어가기 앞서 정수의 기본형은 int, 실수의 기본형은 double, 논리값은 숫자와 연산할 수 없다는 점을 인지하자.
Q1과 Q2의 오류 여부을 판단하시오
public class Question12 {
public static void main(String[] args) {
short s1=1;
short s2=2;
int i1 = 3;
int i2 = 4;
short result = s1+s2; // Q1
int result = i1+i2; //Q2
}
}
Q1은 오류가 난다. 2바이트의 s1과 s2의 합을 구하는 문제인데 그 과정에서 s1+s2는 자동형변환 되어 int로 바뀐다. 자바 환경에서는 int가 가장 빠르게 작동하기 때문인데, 결국 int로 바뀐 s1+s2는 short result를 충족하지 못한다.
오류를 수정하는 방법은 2가지이다. Short result를 int result로 바꾸면 된다. 아니면 (short)s1+s2로 연산 앞에 (short)를 입력해서 int로의 변환을 제한하는 방법이 있다. 여기서 소괄호로 표현한 내용을 cast 연산자라고 한다.
Q2는 정상 작동한다. Int 값의 연산결과는 그대로 int이므로 int result의 값과 일치한다.
Q3의 오류 여부를 판단하시오
class Question3{
public static void main(String[] args) {
float f = 1.11111; // Q3
System.out.println(f);
}
}
Q3은 오류가 난다. 실수는 float or double을 자료형으로 넣을 수 있는데 그 값은 기본적으로 double이다. 정수에서는 기본이 int지만 실수에서의 기본은 double이라는 뜻이다. 즉, double의 크기를 가진 1.11111은 float f가 될 수 없다. 해결 방법은 2가지다. Float f의 float을 double로 변경하면 된다. 아니면 1.11111 뒤에 f를 붙여 1.11111f 라고 입력하면 입력한 실수를 float으로 변환한다
Q4, Q5의 오류 여부를 판단하시오
class Question4{
public static void main(String[] args) {
int i=1;
short s=2;
boolean b=true;
char c='C';
int result1 = i+b; // Q4
int result2= s+c; // Q5
}
}
Q4은 오류가 난다. Boolean은 1바이트의 논리값을 가진다. 논리값은 숫자와 연산 될 수 없기 때문에 오류가 난다.
Q5는 정상 작동한다. Char는 숫자로 표현할 수 있다. 보통 연산에 사용하지는 않고 아스키 코드나 유니코드에 활용하지만 숫자로 표현은 가능하다. Char는 2바이트를 가지기에 short s의 2바이트와 연산해서 int로 자동형변환 하더라도 int result와 정상 작동한다.
'문돌이의 IT > 자바(Java)' 카테고리의 다른 글
[문돌이의IT] 자바(Java) 반복문 중 for문을 완벽하게 익혀보자 (1) | 2016.02.14 |
---|---|
[문돌이의IT] 자바(Java) 조건문 중 if문, switch문을 알아보자 (3) | 2016.02.13 |
[문돌이의IT] 자바(Java) 변수 타입 별 최대, 최소값 확인하기 (0) | 2016.02.02 |
[문돌이의IT] 자바(Java) 객체자료형을 알아보자 (0) | 2016.01.29 |
[문돌이의IT] 자바(Java) 시작하기! Class, Javac (0) | 2016.01.21 |