Java 파트2-2. 타입 변환

1. 타입 변환


자동 타입 변환

값의 허용 범위가 작은 타입이 큰 타입으로 저장될 경우

그림1

기본 타입의 허용 범위 순
byte < short < int < long < float < double

byte byteValue = 10;
int intValue = byteValue; // 자동 타입 변환

long longValue = 5000000L;
float floatValue = longValue; // 5.0E6f로 저장됨
double doubleValue = longValue; // 5.0E6으로 저장됨

char charValue = 'A';
int intValue = charValue; // 65가 저장

byte byteValue = 65;
char charValue = byteValue; // 컴파일 에러
  • char 타입의 경우 int 타입으로 자동변환되면 유니코드 값이 int 타입에 저장된다.
  • char타입은 음수를 가질 수 없는데, byte타입은 음수를 가질 수 있으므로 에러가 발생한다.


강제 타입 변환

큰 허용 범위 타입을 작은 허용 범위 타입으로 강제로 나누어 한 조각만 저장할 경우

int intvalue = 10;
byte bytevalue = (byte) intvalue;

int intvalue = 65;
char charvalue = (char) intvalue;

double doublevalue = 3.14;
int intvalue = (int) doublevalue; // 소수점 이하는 버려지고 정수만 저장

2. 정수 연산에서의 자동 타입 변환


정수 타입 변수가 산술 연산식에서 피연산자로 사용되는 경우

  • byte, char, short 타입 변수는 int 타입으로 자동 변환
    • 특별한 경우가 아니라면 정수 연산에는 int 타입으로 선언하는 것이 효과적
byte x = 10;
byte y = 10;
byte a = 10+20; // byte크기로 저장됨
byte result = x+y; // 컴파일 에러, 연산은 자동으로 int로 변환
int result = x+y;

char c1 = 'A';
char c2 = 1;
char c3 = c1+c2; // 컴파일 에러 // char은 연산에서 int타입으로 바뀐다.
int c3 = c1+c2; 

System.out.println("유니코드=" + c3);
System.out.println("출력문자=" + (char)c3);


피연산자 중 하나가 long 타입이면 다른 피연산자는 long타입으로 자동 변환

long x = 10;
int y =10;
long result = x + y;
int result = x + y; // 컴파일 에러


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


피연산자 중 하나가 double 타입일 경우 다른 피연산자도 double 타입으로 자동 변환

int intvalue = 10;
double doublevalue = 5.5;
double result = intvalue + doublevalue // 10.0 + 5.5 로 자동 처리


다른 타입 연산이 필요할 경우 먼저 강제 변환한 뒤 연산 수행

int intvalue = 10;
double doublevalue = 5.5;
int result = intvalue + (int) doublevalue;


나눗셈 연산

int a1 = 10;
int a2 = a1/4   // 출력 2
double a3 = a1 / 4.0  // 2.5  
double a4 = (double) a1 / 4  // 2.5


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


  • 피연산자가 모두 숫자일 경우 덧셈 연산
  • 피연산자 중 하나가 문자일 경우 나머지 피연산자도 문자열로 자동 변환되고 문자열 결합 연산

덧셈 연산은 왼쪽부터 순차적으로 진행한다. 먼저 수행된 연산이 덧셈이 아니라 결합연산인 경우 뒤에는 쭉 결합연산이 수행된다.

int value = 3 + 7; // 10
String str = "3" + 7; // "3"+"7" -> "37" 문자열 37이 들어감

String str = 1 + 2 + "3"; // 3 + "3" -> "33"
String str = 1 + "2" + 3; // "12" + 3 -> "123"
String str = "1" + 2 + 3; // "12" + 3 -> "123"


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


프로그램에서 문자열을 기본 타입으로 변환하는 경우가 매우 많다. 예를 들어, “12”와 “3.5”같은 문자열을 정수 및 실수 타입으로 변환해서 숫자 연산을 하는 경우이다. 만약 문자열이 숫자 외 요소를 포함할 경우 숫자 타입 변환 시도의 경우 예외가 발생한다.

String -> byte
String str = "10";
byte value = Byte.parseByte(str);

String -> short
short value = Short.parseShort(str);

String -> int
int value = Integer.parseInt(str);

String -> long
long value = Long.parseLong(str);

String -> float
float value = Float.parseFloat(str);

String -> double
double value = Double.parseDouble(str);

String -> boolean
boolean value = Boolean.parseBoolean(str);

parse 앞과 뒤에 대문자로 표기하는 점을 주의하자.

String.valueOf

위와 반대로 기본 타입을 문자열로 변경하는 경우, String.valueOf 사용, O대문자

String str = String.valueOf(기본타입값);
String str = "" + 3 // 빈문자열 사용하여 문자열로 만들기도 가능


String str = String.valueOf(3);


6. 정리하기


  • 자동 타입 변환 : 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 저장될 때 발생
  • 강제 타입 변환 : 값의 허용 범위가 큰 타입을 허용 범위가 작은 타입으로 쪼개어서 저장할 때 발생
  • 문자열 결합 연산 : 문자열과 + 연산을 하면 다른 피연산자도 문자열로 변환되어 문자열 결합이 일어남
  • Integer.parseInt(문자열) : 문자열을 정수 int 타입으로 변환
  • Double.parseDouble(문자열) : 문자열을 실수 double 타입으로 변환

본 포스팅은 ‘혼자 공부하는 자바’를 읽고 공부한 내용을 바탕으로 작성하였습니다.


© 2021. By Backtony