[Java] Type Casting

형변환이란?

Type Casting

높은 온도에서 가열하여 액체로 만들어 형(型)에 부어 굳히는 가공 방법

변수/상수 타입을 다른 타입으로 변환하는 것

 

형변환 방법

변수 및 리터럴 앞에 괄호 추가

(타입) 피연산자
public class Java_1_Casting {
	public static void main(String[] args) {
		//***변수 파트
		
		//1. 숫자 담기
		int val = 10;
		
		//2. 초기화
		val = 0;
		
		//3. 임의의 숫자 입력
		val = 65;
		
		//4. 문자로 형변환
		char str = (char) val;
		
		//5. 출력
		System.out.println("int val : " + val);
		System.out.println("char str : " + str);
	}
}

피연산자를 형변환을 한다고 하여 기존의 값이 변하지 않는다.

변환한 결과를 반환하는 것과는 별개.

double d = 85.4;
int score = (int) d; ← d는 그대로, score에 변환된 결과를 담는다.

기본형에서 boolean을 제외한 나머지 타입들은 서로 형변환이 가능하다.

기본형과 참조형은 형변환이 불가능하다. (참조형은 7장이므로 보류)

 ▼   기본형의 형변환

int → char : 아스키코드

char → int : 아스키코드 값

float → int : 정수 (소숫점 아래 버림)

int → float : 소숫점 추가 (정수에서 변환되므로 값 자체는 똑같지만 표현은 ".0f" 가 붙는다)

 

정수형 간의 형변환

사람은 수치를 10진수로 생각하지만 컴퓨터는 2진법으로 저장.

오로지 1과 0으로 저장을 하는데, 무한정으로 저장할 수 있는게 아니라, 타입에 따라 사이즈가 다르다.

byte < int < float < double < long

2진수로 나타낼 수 있는 숫자의 크기의 순서이다.

사이즈가 적은 곳에 큰 숫자를 담으려고 할 경우, 형변환을 하게 되면 1로 채워져있는 데이터가 증발.

(음수의 경우, 보수를 나타낼 때에 앞 빈공간에 1로 채워주는 것은 제외)

즉, 값의 손실(loss of data)가 발생하게 된다. 반대의 경우는 손실이 발생하지 않는다.

 

실수형 간의 형변환

지수(E), 가수(M) 로 나누어서 각각 빈공간을 0으로 채운다.

float → double : 가수 52자리중 23자리까지만 저장되고 나머지는 버린다.

double → float : 가수의 24번째 자리에서 반올림 발생할수 있다.

float 타입의 범위를 초과할 경우, 무한소수 or 0이 된다.

무한소수 : 1.99999999999999999

0 : 1.99999990000000000

  

정수형 → 실수형 으로 형변환

: 반올림

 

정수를 2진수로 변환한 다음 정규화를 거쳐 실수의 저장 형식에 맞게 저장.

실수형의 정밀도 제한으로 인해 오차가 발생할 우려 존재.

 

※ 주의! 단어 뜻 헷갈리지 말 것!

정규식 Regular Expression

   특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어

정규화 Normalization

   데이터값의 범위를 compact(치밀,세밀)하게 만들어주기 위해서 사용

 

실수형 → 정수형 으로 형변환

: 소수점 이하 버림

 

명시적 형변환과 묵시적 형변환

명시적: 의도적으로

묵시적: 자동적으로 (=생략)

 

자동 형변환의 규칙

기존의 값을 최대한 보존할 수 있는 타입으로 값의 손실이 없다.

타입이 다른 값들의 계산을 수행하려고 할 경우 형변환을 하는 것이 원칙이지만,

작은 값을 작은 값의 타입과 큰 타입의 연산을 할 경우, 형변환 생략이 가능하다.

아래의 경우 형변환을 하지 않아도 묵시적으로 형변환이 되므로 값의 손실이 발생하지 않는다.

int a1 = 3;
double b1 = 5000.5;
//(생략가능) 
System.out.println((double)(a1 * b1));	//결과: 15001.5
System.out.println(a1 * b1);		//결과: 15001.5

아래의 경우 형변환을 하지 않으면 값의 손실이 발생한다.

int a2 = 3;
double b2 = 5000.5;
//(생략불가능)
System.out.println((int)(a2 * b2));	 //결과: 15001
System.out.println(a2 * b2);		 //결과: 15001.5

 

더보기

참고 서적 : 자바의 정석

 

'Programming Lang > Java' 카테고리의 다른 글

[Java] Inheritance, Overriding  (0) 2022.09.09
[Java] Class, Instance, Constructor  (0) 2022.09.07
[Java] Variable, Method, JVM  (0) 2022.09.05
[Java] String Array  (0) 2022.08.28
[Java] Operator  (0) 2022.08.27