본문 바로가기

카테고리 없음

자바의 타입 변환2

실수 연산에서의 자동 타입 변환


실수 타입 변수가 산술 연산식에서 피연산자로 사용될 경우 두 연산자가 동일한 타입이라면 해당 타입으로 연산되지만, 피연산자 중 하나가 double 타입이라면 다른 피연산자도 double 타입으로 자동 타입 변환되어 연산을 수행합니다. 따라서 연산 결과는 double 타입이 됩니다. 


double result = 1.2f + 3.4;


위의 문장에서 1.2f는 float 타입이지만 3.4가 double 타입이므로 1.2가 double 타입으로 변환되어 연산하게되고 그 결과는 double result에 저장됩니다.



int 타입과 double 타입을 연산해도 동일한 과정을 거칩니다. 먼저 int 타입의 피 연산자가 double 타입으로 자동 변환되고 연산을 수행합니다.


int intValue = 10;

double doubleValue = 5.5;

double result = intValue + doubleValue;


위의 경우 intValue가 먼저 double로 변환된 후 연산이 수행됩니다. 하지만 꼭 int 타입으로 연산을 해야한다면 double 타입을 int 타입으로 강제 변환하고 덧셈 연산을 수행하면 됩니다.


int intValue = 10;

double doubleValue = 5.5;

int result = intValue + (int) doubleValue;


이 경우 doubleValue에 있는 5.5가 int 타입으로 먼저 강제 변환되어 5로 바뀌고 덧셈을 수행하여 결과는 15가 됩니다. 이와 같이 강제 변환의 경우 값을 잃어버리게 되는 경우가 생기므로 확실히 알고서 변환해야 합니다.


자바에선 상수 리터럴의 끝에 'f' 또는 "F'가 있는 경우가 아닌 경우는 모두 double 타입으로 해석합니다. 그렇기 때문에 연산결과는 double에 저장해야 됩니다. 그렇기때문에 자바에서는 float을 거의 사용하지않고 double을 주로 사용합니다. 그럼 이제 예제를 보면서 설명해 보겠습니다.




위의 예제어서 라인 7을 주석처리한 것은 컴파일에러가 발생하기 때문입니다. byte 타입 더하기 byte 타입이고 결과도 30이기때문에 문제가 없어 보이지만 덧셈 연산에서 정수형은 자동으로 int 타입으로 변환되기 때문에 byte 타입에 저장이 불가합니다. 하지만 byteValue3 = 10 + 20;으로 한다면 문제가 없이 값이 저장됩니다. 정수 형의 연산에서는 이처럼 자동 형변환으로 문제가 생기는 경우가 종종 있습니다. 그러므로 정수형의 연산의 경우는 int 타입을 사용해주시는 것이 좋습니다. 하지만 만약 long 타입을 사용한다면 long 타입으로 변환이 됩니다.


라인 11부터 16까지의 문장에 헷갈릴 수도 있습니다. 저번에 말씀드렸듯이 char 형은 정수형입니다. 2byte이고 유니코드가 저장됩니다. 값은 2byte유니코드로 저장되지만 출력할때 문자로 출력되는 것입니다. 정수형이므로 연산도 가능하고 int 타입으로 변환도 가능합니다. 여기서도 마찬가지로 덧셈 연산에서 자동으로 정수 형으로 변환되므로 결과는 int 타입으로 저장해야됩니다.


라인 19는 상당히 중요합니다. 자바나 C에서 공통으로 정수 나누기 정수를 하면 정수가 되고 이는 정확한 나누기 값이 아닌 몫을 구하게 됩니다. 이런 정수 연산을 통해 몫을 구하고 나머지 연산자를 이용해 나머지를 구할 수 있습니다. 그래서 10을 4로 나누었지만 2.5가 아닌 2를 구하게 됩니다. 그래서 정확한 값을 구할 것인지 몫을 구할 것인지를 결정하고 몫을 구할때는 양쪽 모두 정수를 사용하고 정확한 값을 구할때는 한쪽을 실수형으로 바꾸어 주면 됩니다. 라인 24에서 보듯이 4가 아닌 4.0으로 나눠야됩니다. 라인 24에서 4.0이 아닌 4로 나눈다면 결과는 2.0이 될 것입니다. 그래서 4.0으로 나누어서 결과가 2.5가 되도록 해야 합니다. 이렇게 리터럴로 나눌 경우는 4.0 같이 실수형으로 쓰면되지만 라인 29처럼 x와 y가 모두 정수형인 경우는 한쪽을 double 형으로 캐스팅해야 합니다.




+ 연산에서의 문자열 자동 타입 변환


자바에서 + 연산자는 두 가지 기능을 가집니다. 피연산자가 모두 숫자인 경우는 덧셈 연산을 수행하지만, 피연산자 중 하나라도 문자열인 경우는 나머지 피연산자도 문자열로 자동 변환되어 문자열 결합 연산을 합니다. 우리 눈에는 숫자로 보이더라도 "34"같이 따옴표로 감싸져있거나 문자열 타입안에 들어있는 값이라면 문자열로 인식합니다. 다음 예제를 보면서 설명해 보겠습니다.



위의 예제는 라인 5는 모두 숫자이므로 덧셈 연산을 수행해서 20을 출력하게됩니다. 하지만 라인11부터는 모두 문자열을 피연산자로 사용하기때문에 결과가 문자열이 되고 String 변수에 저장해야됩니다. +연산자는 왼쪽부터 차례로 연산을 하게 되어있습니다. 그래서 str2, str3와 str4는 모두 10 + 2 + 8의 느낌이지만 문자열의 위치에 따라 결과가 달라집니다. 라인 11은 처음 10 + "2"를 먼저 연산하게 되는데 이 경우 "2"가 문자열이므로 둘다 문자열로 자동 변환되므로 결과는 "102"가 됩니다. 이후에 다시 8을 연산하게 되는데 이 경우 "102" + "8"이 되므로 결과는 "1028"이 됩니다. str3의 경우는 처음 "10"이 문자열이므로 이후는 모두 문자열로 변경되므로 str2와 같이 "1028"이 됩니다. 하지만 str4인 경우는 조금 다릅니다. 연산자에서 괄호는 가장 먼저 연산이 되므로 "10" + (2 + 8)이 "10" + 10으로 연산이 되고 그 다음에 "10"이 문자열이므로 숫자 10이 문자열 "10"으로 변환되어 "1010"이 됩니다. 이렇듯 모든 연산자는 연산자 우선순위가 있고 그것에 따라 연산을 하게 됩니다. 연산자 우선 순위는 나중에 다루겠지만 일반적으로 사람이 하는 것과 비슷하다고 할 수 있습니다.



문자열을 기본타입으로 강제 타입변환

프로그램에서 문자열을 기본 타입으로 변환하는 경우가 매우 많습니다. 기본 타입과 같은 클래스 타입이 있고 그 클래스를 이용해서 기본 타입으로 변환을 합니다. 클래스 타입은 첫문자를 대문자로 사용합니다. 기본 타입과 대응되는 클래스 타입은 다음과 같습니다.

byte --> Byte

short --> Short

int --> Integer

long --> Long

float --> Float

double --> Double

boolean --> Boolean


int 타입을 제외하면 기본타입에서 첫문자만 대문자로 바꾼 것입니다. 각 클래스 타입에있는 메소드를 사용해서 문자열을 기본타입으로 바꿀 수 있습니다. 변환하는 방법은 다음과 같습니다.


변환 타입 

사용 예 

String --> byte 

String str = "10";

byte value = Byte.parseByte(str); 

String --> short 

String str = "200";

short value = Short.parseShort(str); 

String --> int 

String str = "30000";

int value = Integer.parseInt(str); 

String --> long 

String str = "4000000000";

long value = Long.parseLong(str); 

String --> float 

String str = "12.345";

float = Float.parseFloat(str); 

String --> double 

String str = "12.345";

double = Double.parseDouble(str); 

String --> boolean 

String str = "true";

boolean value = Boolean.parseBoolean(str); 


문자열이 숫자가 아닌 문자를 포함하고 있을 경우 숫자 타입으로 변환을 시도하면 숫자 형식 예외(NumberFormatException)가 발생합니다.

반대로 기본 타입(byte, short, char, int, long, float, double, boolean)의 값을 문자열로 변경하는 경우도 있는데, 이 경우는 간단히 String.valueOf() 메소드를 이용하면 됩니다.




위에서는 리터럴을 형변환하지만 실제 프로그래밍에서는 변수에 있는 겻을 형변환합니다. 특히 화면에서 입력받은 값을 숫자로 변환하는 경우에 많이 사용합니다. 나중에 입출력을 다룰때 많이 다루게 될 것입니다.