코딩항해기

[JAVA] 자동형변환, 강제형변환, 문자열(String)형변환 본문

JAVA

[JAVA] 자동형변환, 강제형변환, 문자열(String)형변환

miniBcake 2024. 6. 18. 13:51

 

Java에는 데이터 타입을 바꾸는 형변환(casting)이 있다.

 

오늘은 그 중 세 가지 형변환에 대해 정리해보겠다.

 

첫째는 별 다른 조치 없이 자동으로 변환되는 자동형변환,

 

둘째는 특수한 조치를 취해줘야 변환되는 강제형변환,

 

셋째는 String의 메소드를 이용하는 문자열형변환이다.

 


 

[자동형변환]

자동형변환은 특정조건일 때 자동으로 형변환이 이루어진다.

 

정수 실수 연산을 거쳤을 때 (산술변환/일반산술변환)

자바에서 이항연산자는 두 피연산자의 타입이 일치해야 연산이 가능하기 때문에
타입이 다르게 되면 형변환이 필요해지는데, 이때 컴파일러가 자동으로 형변환해주게 된다.

이때 몇 가지 조건에 따라 형변환이 이루어진다.

1. 더 큰 byte를 가진 타입으로 일치 (단, 기본 타입인 int보다 작은 타입끼리의 연산일 경우 int로 통일)

2. 정수 + 실수 연산 시 실수로 변환

3. 문자열과의 연산의 경우 문자열로 변환


ex.
long + int -> long
float + int -> float
double + float -> double
byte + short -> int
char + short -> int
char + char ->int  //아스키코드 값으로 변환됨
long + float -> float

 

문자를 정수로 변환할 때

자동형변환 때  char+char 연산을 할 경우 int로 자동형변환되는 것을 알 수 있다.
이 때 int로 바뀌는 이유는 컴퓨터는 문자를 문자로 저장하지 않고 숫자로 저장하기 때문이다.

숫자의 기준은 코드표에 맞춰서 변환(인코딩)이 되고, 자바에서는 유니코드 사용한다.
유니코드 인코딩에는 UTF-8, UTF-16, UTF-32가 있는데, 자바에서는 UTF-16을 사용한다

 

작은 byte타입의 값을 큰 byte타입을 지닌 변수에 저장할 때

강제형변환을 이용하면 작은 크기의 타입을 가진 변수에도 값을 변환하여 넣을 수 있지만,
큰 크기의 타입의 변수에 넣을 때에는 별 다른 조치 없이 바로 값이 변환되어 넣어진다.
어떤 경우에 자동형변환이 되고, 어떤 경우에 강제형변환이 가능한지는 강제형변환에서 한 번에 정리하겠다.

 


 

[강제형변환]

자동형변환이 되지 않을 때에는 강제형변환을 할 수 있다.

이 방식은 후에 다운캐스팅을 할 때에도 사용된다.

 

타입 자동형변환 가능여부 강제형변환 가능여부
int long O O
double O O
float O O
char O O
boolean X X
long int  X O
double O O
float O O
char X O
boolean X X
double int X O
long X O
flaot X O
char X O
boolean X X
float int X O
long X O
double O O
char X O
boolean X X
char int O O
long X O
double X O
float X O
boolean X X
boolean int X X
long X X
double X X
float X X
char X X

[문자열형변환]

String(문자열)의 경우 형변환 방식이 다른 타입들과는 다른데, 엄밀히 말하면 String은 클래스이기 때문이다.

따라서 강제형변환도 String클래스의 메소드를 사용하게 된다.

 

다른 자료형 > 문자열

문자열과 다른 자료형을 연결(+연산자가 연결연산자가 된다)하면, 자동으로 문자열 타입이 된다

int a = 0;
String b = a + “”;

 

문자열 > 다른 자료형

기본자료형은 기본자료형끼리 형변환이 되지만, 클래스 타입(참조타입)은 기본자료형으로 변환이 불가능하다.

String 타입은 Integer Double Boolean 클래스의 도움을 받아 형변환 할 수 있다.

int msg1 = Integer.parseInt("문자열");
double msg2 = Double.parseDouble("문자열");
...