-
[Java] Type CastingProgramming Lang/Java 2021. 7. 1. 22:17
형변환이란?
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