두 변수의 타입이 동일할 경우, 한쪽 변수값을 다른 쪽 변수에 저장할 수 있습니다. 하지만 두변수의 타입이 다르다면 가능할 수도 아닐 수도 있습니다. 타입변환에는 두가지가 있습니다. 하나는 자동타입변환이고 다른 하나는 강제타입변환입니다.
자동 타입 변환
자동타입변환(Promotion)은 말 그대로 자동으로 타입 변환이 일어나는 것을 말합니다. 자동타입변환은 값의 허용범위가 작은 타입이 값이 허용범위가 큰 타입으로 저장될 때 발생합니다. 기본 타입을 허용 범위 크기 순으로 정리하면 다음과 같습니다.
byte < short < int < long < float < double
하지만 자동타입변환에서 예외사항이 있습니다. char 타입보다 허용범위가 작은 byte 타입은 char 타입으로 자동 타입 변환될 수 없습니다. 왜냐하면 char 타입의 허용범위는 음수를 포함하지 않는데 byte 타입은 음수를 포함하기 때문입니다. 아래에 자동 타입변환의 예제가 있습니다.
강제 타입 변환
큰 허용 범위 타입은 작은 허용 범위 타입으로 자동 타입 변환될 수 없습니다. 범위를 넘는 값이 존재하기 때문입니다. 이와 같이 큰 허용범위 타입을 작은 허용 범위타입으로 강제로 저장하는 것을 강제타입변환(casting)이라고 합니다. 강제 타입변환은 캐스팅 연산자 괄호()를 사용하는데, 괄호 안에 들어가는 타입으로 변환됩니다. 다음은 기본적인 강제 타입변환 예제입니다.
위의 예제에서 보듯이 강제 타입변환이라고 할지라도 허용범위 안에 있는 값은 문제가 없습니다. 하지만 라인 14처럼 실수형을 정수형에 넣는다면 값을 잃을 수 있습니다. 일부러 이와같은 일을하는 경우가 종종있지만 정확한 변환을 알고 하는 것이 좋습니다. 위의 예제처럼 int형과 char형은 변환하는 경우가 종종있습니다. 정수형의 값을 문자로 찍기 위함입니다.
정수 연산에서의 자동 타입 변환
정수 타입 변수가 산술연산자에서 피연산자로 사용된다면 int 타입보다 작은 byte, short 타입의 변수는 int 타입으로 자동 타입 변환되어 연산을 수행합니다. 그래서 산술연산자를 사용하는 경우는 int 타입 변수에 저장해야 합니다. 하지만 리터럴의 경우는 int 타입으로 변환되지 않습니다.
다음의 예제에서 살펴보도록 하겠습니다.
위의 예제에서 라인 5는 전혀 문젝자 없습니다. 리터럴 10과 리터럴 20을 더하면 30이 되고 30은 byte 타입의 허용범위이기때문입니다. 하지만 라인 10은 컴파일 오류가 발생합니다. 사람이 보기에는 30으로 값이 같으니까 당연히 문제가 없다고 생각할 수 있지만 산술연산자에 +의 피연산자로 byte 타입변수가 사용되는 경우는 int 타입으로 변환되기 때문입니다. 그래서 라인 12처럼 사용해야합니다. 라인 11 같이 사용해도 컴파일오류는 없지만 값의 허용범위가 넘는 경우는 원치않는 값을 받을 수도 있기 때문입니다.
정수연산식에서 모든 변수가 int 타입으로 변환되는 것은 아닙니다. 두 피연산자 중 허용범위가 큰 타입으로 변환되어 연산을 수행합니다. 이는 long 변수가 존재한다면 long으로 변환된다는 뜻입니다.
위의 예제에서 value3가 long 타입이기 때문에 연산식에서 피연산자는 모두 long 타입으로 바뀌고 long 타입으로 저장되어야만 합니다.
'프로그래밍 > Java 프로그래밍' 카테고리의 다른 글
자바의 연산자와 연산식1 (0) | 2020.06.25 |
---|---|
자바의 변수와 시스템 입출력 (0) | 2020.06.24 |
자바의 실수형과 논리형 변수 (0) | 2020.06.21 |
자바의 문자열 타입과 String 타입 (0) | 2020.06.20 |
자바의 정수형 타입과 char 타입 (0) | 2020.06.20 |