본문 바로가기
Android App/Java

타입 변환-자동, 강제, 연산식, 문자열

by AppJinny 2023. 1. 14.

*타입 변환-자동, 강제, 연산식, 문자열

 

*자동 타입 변환(promotion)

-자동으로 타입 변환이 일어나는 것

-값의 허용범위가 작은 타입이 허용범위가 큰 타입으로 대입될 때 발생

-기본타입의 허용범위 순서 : byte < short, char < int < long < float < double

//int타입이 byte타입보다 허용범위가 큼
//int타입의 변수에 byte타입 변수를 넣으면
//자동으로 타입이 변환되어 int타입으로 복사됨
byte byteValue = 10;
int intValue = byteValue;

//char타입이 int타입으로 자동 변환되면
//유니코드 값이 int타입에 대입됨
char charValue = 'A';
int intValue = charValue;  //65가 저장됨

 

-자동타입변환의 예외 : char타입의 허용범위는 음수를 포함하지 않으므로 음수를 포함하는 byte타입을 char타입으로 자동변환될 수 없음

//자동타입변환 예외
//byte -> char 대입 시 에러
byte byteValue = 65;
char charValue = byteValue; //컴파일 에러

 

 

*강제 타입 변환(casting, 캐스팅)

-큰 허용 범위 타입은 작은 허용 범위 타입으로 자동 변환될 수 없음

-큰 허용 범위 타입을 작은 허용 범위 타입으로 쪼개어 저장할 수는 있으며 이를 캐스팅(강제타입변환)이라고 함

-강제 타입 변환은 캐스팅 연산자로 괄호() 사용

-괄호() 안에 들어가는 타입은 쪼개어 저장되는 타입 적용(작은 허용범위 타입)

-강제 타입 변환 시 작은 허용 범위 타입에 저장될 수 있는 값을 가지고 강제 타입 변환을 해야 함

-(byte 타입은 1byte이고 -128~127범위를 가지고 있지만 int 타입의 값이 범위를 넘거나 2byte이상의 값을 강제 변환 시 1byte의 값만 보존되고 나머지 값은 보존되지 않아 삭제됨)

//int -> byte
//(byte) 캐스팅을 하여 byte타입으로 강제 타입 변환
int intValue = 10;
byte byteValue = (byte)intValue;

//long -> int
//int허용범위 내 이므로 300그대로 유지
long longValue = 300;
int intValue = (int)longValue 

//int -> char
//char타입의 유니코드 허용범위 0~65535사이의 값만 유지
int intValue = 65;
char charValue = (char)intValue;
System.out.println(charValue); //A 출력됨

//실수 -> 정수
//소수점 이하 부분은 버려지고 정수 부분만 저장됨
double doubleValue = 3.14;
int intValue = (int)doubleValue; 
System.out.println(intValue); //3 출력됨

 

 

*연산식에서 자동 타입 변환

-자바는 실행 성능을 향상시키기 위해 컴파일 단계에서 연산을 수행함

-byte result = 10 + 20 -> 컴파일 단계에서 미리 연산하여 30을 만들고 변수에 30을 저장하도록 바이트 코드 생성

-실행 시 이미 컴파일 단계에서 덧셈 연산을 하였으므로 실행 성능이 좋아지게 됨

-변수가 피연산자로 사용되는 경우 실행 시 연산을 수행

 

-연산식에서 정수타입일 경우 기본으로 변수는 int타입으로 자동 타입 변환되어 연산 수행

//정수타입: byte, char, short, int (long제외)
//int보다 허용범위가 큰 long타입을 제외한
//정수타입 변수가 연산식에서 피연산자로 사용될 때
//그 결과값을 저장하는 변수는 자동으로 int타입이 됨

//byte타입 변수가 연산식에서 피연산자로 사용될 때
byte x = 10;
byte y = 10;

//실행 시
//자동 int타입으로 변환되어 byte타입 변수에 저장 불가
//컴파일 에러 발생
byte result = x + y;

//자동 int타입으로 변환되므로 
//int타입의 변수에 저장해야 정상적으로 실행 됨
int result = x + y;

-실행 시 x, y의 타입이 int타입으로 자동 변환이 발생함

-특별한 이유가 없다면 정수 연산에서 변수가 피연산자로 사용될 경우 int타입으로 변수를 선언하는 것이 실행 성능이 좋음

-int타입보다 허용범위가 큰 정수타입 long타입이 피연산자로 사용될 경우 long타입 변수에 저장해야 함

 

-연산식에서 실수타입일 경우 

//실수타입: float, double

//동일한 실수타입이면 해당 타입으로 연산됨
//피연산자에 모두 f가 붙어 float타입 이므로 
//결과는 float타입이 됨
float result = 1.2f + 1.4f;

//피연산자 중 하나가 double타입일 경우 
//double타입의 변수에 저장해야 함
float result = 1.2f + 3.4; //컴파일에러
double result = 1.2f + 3.4; //정상 실행

//int타입과 double타입 연산 시
//자동으로 double타입으로 변환되며
//double타입에 저장
int intValue = 10;
double doubleValue = 5.5;
double result = intValue + doubleValue; //10.0 + 5.5

 

-실수타입을 int타입으로 연산할 경우 강제 타입 변환을 통해 덧셈 연산을 수행해야 함

//int타입으로 연산
//int = bouble + int
//int로 강제 타입 변환
int intValue = 10;
double doubleValue = 5.5;

int result = intValue + (int)doubleValue; //10 + 5

 

-***실수타입 연산 주의

-자바에서 정수 연산의 결과는 항상 정수가 되기 때문에 

-x/y 의 연산 결과는 0이 되고, 0을 double타입 변수 result에 저장하므로 결과는 0.0을 출력함

-결과를 0.5로 출력하기 위해서는 x/y 의 연산을 정수가 아니라 실수 연산으로 변경해야 함

-x또는 y를 실수로 강제 타입 변환 하거나 모두 타입변환을 하면 실수의 결과값 0.5를 얻을 수 있음

-***double result = (double)(x / y); 적용 시 결과는 0.0의 값이 나오게 되므로 주의해야 함

--괄호부분의 (x / y) 연산이 먼저 실행되어 0의 결과값을 얻고 그 값을 double타입으로 변환하므로 0.0이 됨

 

-연산식에서 피연산자 중 하나가 문자열일 경우 나머지 피연산자도 문자열로 자동 변환됨

-앞에서부터 순차적으로 연산을 수행하며 괄호는 항상 최우선으로 연산을 수행함

 

 

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

-문자열을 숫자 타입으로 변환하는 경우가 많음

-변환할타입 변수명 = 변환할타입.parse변환할타입(변환할값); 의 형식으로 변환

 

*기본 타입의 값 문자열로 변환

-String 변수명 = String.valueOf(기본타입값);

 

 

 

 


이 포스팅에 작성한 내용은 신용권, 임경균, ⌜이것이 자바다⌟, 한빛미디어(주), 2022 에서 발췌하였습니다.