형변환을 들어가기 전에 자바에서 갖는 문자, 숫자, 논리값에 대해 다시 한 번 짚고 넘어가자. 문자, 숫자, 논리값 이외에 객체형도 있지만 일단 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+s2short result를 충족하지 못한다.

 

오류를 수정하는 방법은 2가지이다. Short resultint 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.11111float f가 될 수 없다. 해결 방법은 2가지다. Float f floatdouble로 변경하면 된다. 아니면 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은 오류가 난다. Boolean1바이트의 논리값을 가진다. 논리값은 숫자와 연산 될 수 없기 때문에 오류가 난다.

 

Q5는 정상 작동한다. Char는 숫자로 표현할 수 있다. 보통 연산에 사용하지는 않고 아스키 코드나 유니코드에 활용하지만 숫자로 표현은 가능하다. Char 2바이트를 가지기에 short s 2바이트와 연산해서 int로 자동형변환 하더라도 int result와 정상 작동한다



+ Recent posts