전체 방문자
오늘
어제
21종
종이의 코딩 공부방
21종
  • 분류 전체보기 (171)
    • JAVA (64)
    • Springboot (46)
      • 블로그만들기 (45)
    • Database (60)
      • Oracle (60)
    • 프로젝트 3 (CELOVER) (0)
    • 개발서버 구축 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 글

최근 댓글

hELLO · Designed By 정상우.
21종

종이의 코딩 공부방

JAVA

[자바/JAVA] 프로그래밍 - 형 변환(Casting)

2023. 5. 26. 12:08

형 변환 : 값(Data)의 자료형을 바꾸는 것을 말한다.

왜 형 변환을 해야할까?

1. 대입 연산자를 기준으로 왼쪽과 오른쪽은 같은 자료형이어야 한다!!

=> 즉, 같은 자료형에 해당하는 값만 대입 가능!!
=> 즉, 다른 자료형의 값을 대입하고자 한다면 형 변환이 필수이다!!

 

 * [표현법] 변수명 = (자료형)값;
 * ex) int a = (int)8.0

 

2. 같은 자료형 끼리만 연산이 가능

값 + 값 => 계산 결과도 같은 자료형으로 나옴!!


형 변환 종류

형변환 하고자 하는 값과 자료형의 표현 범위 차이에 따라서 형변환하는 방법이 두가지로 나뉨!!

 

1. 자동 형변환 => 자동으로 형변환이 이뤄져서 우리가 형변환을 시킬 필요가 없음!

 

2. 강제(명시적) 형변환 => 자동형변환이 안돼서 우리가 직접 형변환을 해줘야함

[표현법] (바꿀자료형)값

 

***주의사항***

boolean은 형변환 불가


자동형변환

값의 범위가 작은 자료형과 큰 자료형간의 연산 시 자동으로 범위가 작은 자료형을 큰 자료형으로 변환 후 처리해줌


자료형의 종류와 크기

자료형 키워드 크기 기본값 표현 범위
논리형 boolean 1bit false true 또는 false
정수형 char 2byte = 16bit \u0000 0 ~ 65,535
(2^16 = 65,536)
byte 1byte = 8bit 0 -128 ~ +127
(2^8 = 256)
short 2byte = 16bit 0 -32,768 ~ +32,767
(2^16 = 65,536)
int 4byte = 32bit 0 -2,147,483,648 ~ +2,147,483,647
(2^32)
long 8byte = 64bit 0 -9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807
(2^64)
실수형 float 4byte = 32bit 0.0 -3.4E38 ~ +3.4E38 
(2^32)
double 8byte = 64bit 0.0 -1.7E308 ~ + 1.7E308
(2^64)

 

1.int(4byte) => double(8byte) 반대는 불가능( 강제형변환 사용)

double d1 = /*(double)*/i1;

// 엄청 큰 박스에는  작은 박스 담을 수 있음! 자동형변환 가능!

System.out.println(d1); //출력 결과 12.0

int i2 = 12;
double d2 = 3.3;

double result = /*(double)*/i2 + d2;
System.out.println(result);	//출력 결과 15.3

2. int(4byte) => long(8byte)

int i3 = 1000;
long l3 = /*(long)*/i3;	//출력 결과 1000

3. float(4byte) => double(8byte)

float f4 = 1.0f;	//f를 붙이는 이유 : 1.0은 double 인데 8byte 이기 때문에 4byte인 float에 들어갈 수 없음.
double d4 = f4;
System.out.println(d4);	//출력 결과 1.0

4. long(8byte) => float(4byte)

float이 실수형이기 때문에 long형보다 표현 가능한 수의 범위가 더 커서 자동변환됨

long l5 = 10000000L;
float f5 = /*(float)*/l5;
System.out.println(f5);	//출력 결과 1.0E7

5. char(2byte) <=> int(4byte)

각 문자들마다 고유한 숫자가 지정돼 있기 때문에 쌍방향으로 형변환 가능(아스키 코드표에서 'A'는 65)

 char는 음수값 저장 불가 => 값의 범위가 0~65535

int num = 'A';
System.out.println(num);	//출력 결과 65

char ch = 71;
System.out.println(ch);	//출력 결과 G

 

아스키 코드표


6. * byte 또는 short간의 연산 *

byte b1 = 1;
byte b2 = 10;

//byte b3 = b1 + b2;	// byte나 short는 연산시 무조건 int형으로 처리함.
                    	// 연산 결과가 범위가 더 큰 int 형임. => byte형에 대입 불가.
byte b3 = (byte)(b1 + b2);	// 강제 형 변환
System.out.println(b3);	// 출력 결과 11

강제형변환

큰 크기의 자료형을 작은 크기의 자료형으로 바꾸는 것

강제로 형변환 시 데이터 손실이 발생할 수 있다.

 

1. double(8byte) => float(4byte)

double d1 = 4.0;
//float f1 = d1;	//오류
float f1 = (float)d1;
// 강제형변환 안해주면 오류남 ! 명시적으로 형변환 해줘야함

2.double(8byte) => int(4byte)

int iNum = 10;
double dNum = 5.89;

// int iSum = (double)iNum + dNum;	// 10.0 + 5.89 => 15.89
            // 연산결과인 double형이 int형에 대입 불가 => 에러 발생

 

에러 해결 방법

 

방법1. 연산결과 int형으로 강제형변환

int iSum1 = (int)(iNum + dNum);
System.out.println("iSum1 : " + iSum1);	// 형변환 통해서 정수값만 출력된다. 데이터 손실 발생
// 출력값 : iSum1 : 15

방법2. double형 값 만을 int형으로 강제형변환

int iSum2 = iNum + (int)dNum;	// 10 + 5 = 15
System.out.println("iSum2 : " + iSum2);	// 형변환 통해서 정수값만 출력된다. 데이터 손실 발생
// 출력값 : iSum2 : 15
// 실수 값을 정수형으로 강제형변환시 소수점 아래 부분은 버려짐.(* 데이터 손실이 발생할 수 있다.)

방법3. 연산결과를 아싸리 double 변수에 대입

double iSum3 = iNum + dNum;
System.out.println("iSum3 : " + iSum3);	// 출력값 : iSum3 : 15.89

데이터 손실 테스트

int iNum2 = 290;	
byte bNum2 = (byte)iNum2;	// byte(-128 ~ 127)
System.out.println("bNum2 : " + bNum2);	// 출력값 : bNum2 : 34

 

    'JAVA' 카테고리의 다른 글
    • [자바/JAVA] 프로그래밍 - 논리연산자(Logical operator)
    • [자바/JAVA] 프로그래밍 - 비교연산자(Comparison operator)
    • [자바/JAVA] 프로그래밍 - System.out.printf()
    • [자바/JAVA] 프로그래밍 - Scanner 실습 예제
    21종
    21종
    코딩 공부한 것 정리하려고 만든 블로그

    티스토리툴바