Java - 형변환, 타입 캐스팅(Primitive Type Casting)

Java는 다음 두개의 타입을 지원합니다.

  • Primitive type
  • Reference type

Primitive type은 int와 같은 자바에서 기본적으로 제공해주는 타입을 말합니다. 이런 타입들은 클래스가 아니며, 상속으로 재가공이 불가능한 타입입니다. Reference type은 클래스로 만들어지는 객체를 의미합니다.

여기서는 Primitive type의 Casting(형변환)에 대해서 알아보겠습니다.

Primitive type

자바는 다음과 같은 Primitive type을 지원합니다.

  • byte: 8bit, signed
  • short: 16bit, signed
  • int: 32bit, signed
  • long: 64bit, signed
  • float: 32bit, signed
  • double: 64bit, signed
  • boolean: true or false
  • char: 16bit, unsigned

Type casting (형변환)

위의 Primitive type에서 소개한 것처럼, 각각의 Type은 표현할 수 있는 데이터 크기가 다릅니다.

따라서, 서로 다른 Type의 변수를 할당하려면 Type casting을 해야 합니다. 그리고 Type casting을 할 때 경우에 따라서 데이터가 손실될 수도 있고, 손실되지 않을 수도 있습니다.

더 큰 타입으로 캐스팅

다음과 같이 더 큰 범위의 타입으로 변환하는 경우, 데이터는 손실되지 않습니다. long보다 float 또는 double이 더 큰 범위의 데이터를 저장하기 때문에 데이터는 손실되지 않습니다. 이런 경우 아래와 같이 그냥 할당하면 됩니다.

long longNum = 10;

float floatNum = longNum;
double doubleNum = longNum;

System.out.println("floatNum: " + floatNum);
System.out.println("doubleNum: " + doubleNum);

실행 결과를 보면 실수로 표현되지만 원본 데이터인 10은 보존됩니다.

floatNum: 10.0
doubleNum: 10.0

더 작은 타입으로 캐스팅

다음과 같이 더 작은 범위의 타입으로 변환하는 경우 데이터는 손실될 수 있습니다. float의 소수는 int로 표현할 수 없기 때문에 변환 중에 손실됩니다. 이렇게 작은 범위로 캐스팅을 할 때 (long)처럼 변환하려는 타입을 입력해야 합니다. 그렇지 않으면 컴파일 에러가 발생합니다.

float floatNum = 10.1f;
long longNum = (long) floatNum;
int intNum = (int) floatNum;

System.out.println("longNum: " + longNum);
System.out.println("intNum: " + intNum);

결과를 보면 정수 부분만 변환이 되었습니다. 그 외의 실수 부분은 표현할 수 없기 때문에 버려졌습니다.

longNum: 10
intNum: 10

Boxing, Unboxing

자바는 Primitive type의 데이터를 내부에 갖고 있는 Wrapper class들을 제공합니다.

  • Byte
  • Short
  • Integer
  • Long
  • Float
  • Double
  • Boolean

Primitive type의 객체는 Reference type의 객체가 아니기 때문에, Generic 클래스를 만들 때 Primitive type을 사용하지 못할 때가 있습니다. 이런 문제를 해결하기 위해 Wrapper class를 제공합니다. 이 클래스들은 Object를 상속하는 클래스입니다.

Wrapper 클래스와 Primitive type은 아래와 같이 간단히 서로 변환할 수 있습니다. 이런 것을 Boxing, Unboxing이라고 합니다.

int intNum = 10;

Integer integerReference = intNum;

int myIntNum = integerReference;

String 변환

Wrapper class는 parseInt()와 같이 문자열을 파싱하여 Primitive type으로 변환해주는 메소드를 제공합니다.

int intNum = Integer.parseInt("1234");
long longNum = Long.parseLong("12345");

float floatNum = Float.parseFloat("1234.5678");
double doubleNum = Double.parseDouble("1234.5678");

boolean booleanType= Boolean.parseBoolean("false");

System.out.println("intNum: " + intNum);
System.out.println("longNum: " + longNum);
System.out.println("floatNum: " + floatNum);
System.out.println("doubleNum: " + doubleNum);
System.out.println("booleanType: " + booleanType);

다음과 같이 변환됩니다.

intNum: 1234
longNum: 12345
floatNum: 1234.5677
doubleNum: 1234.5678
booleanType: false

Primitive type을 String으로 변환

Wrapper 클래스들은 다음과 같이 Primitive type을 String으로 변환하는 메소드를 제공합니다.

int intNum = 1234;
float floatNum = 1234.5678f;

String intStr = Integer.toString(intNum);
String floatStr = Float.toString(floatNum);

System.out.println("intStr: " + intStr);
System.out.println("floatStr: " + floatStr);

Output:

intStr: 1234
floatStr: 1234.5677

Wrapper를 String으로 변환

다음과 같이 Wrapper object를 String으로 변환할 수도 있습니다.

Integer intNum = 1234;
Float floatNum = 1234.5678f;

System.out.println("intStr: " + intNum.toString());
System.out.println("floatStr: " + floatNum.toString());

Output:

intStr: 1234
floatStr: 1234.5677
Loading script...

Related Posts

codechachaCopyright ©2019 codechacha