[Java 기본 원리] 자료형의 범위와 형변환 총정리
Java의 자료형 범위와 형변환(명시적vs묵시적)에 대해 상세히 알아보자. 🔍
정수 자료형의 메모리 표현 💡
bit, byte가 뭔지는 안다고 생각하고 설명한다.
byte 타입의 메모리 표현
-
일반 byte type
부호 비트 포함 (=맨 앞 비트)
- 0000 1001 → 9 // 2³ + 2⁰ = 8 + 1 = 9
- 1000 1001 → -119 // -2⁷ + 2³ + 2⁰ = -128 + 8 + 1 = -119
-
unsigned byte type
부호 비트 없음 (=모든 비트가 값)
- 0000 1001 → 9 // 2³ + 2⁰ = 8 + 1 = 9
- 1000 1001 → 137 // 2⁷ + 2³ + 2⁰ = 128 + 8 + 1 = 137
따라서 범위도 달라진다.
참고 범위
- char: -128 ~ 127 // -2⁷ ~ 2⁷-1
- unsigned char: 0 ~ 255 // 0 ~ 28-1
- int: -2³¹ ~ 2³¹-1
- long: -2⁶³ ~ 2⁶³-1
형변환(Type Casting) 💡
묵시적 형변환 (자동)
- 작은 타입 → 큰 타입으로 자동 변환 (값 손실 없으니까 형변환 연산 생략)
byte b = 100;
int i = b; // byte → int 자동 변환
long l = i; // int → long 자동 변환
float f = l; // long → float 자동 변환 (주의!)
double d = f; // float → double 자동 변환
명시적 형변환 (강제)
- 큰 타입 → 작은 타입으로 강제 변환 (값 손실 있어서 프로그래머 책임하에 형변환 연산)
double d = 123.456;
float f = (float)d; // double → float 강제 변환
long l = (long)f; // float → long 강제 변환
int i = (int)l; // long → int 강제 변환
주의사항 ⚡
첫번째 주의사항
// 에러 발생 예시
int num1 = 123;
byte num2 = num1; // 컴파일 에러: 큰 타입에서 작은 타입으로 자동 변환 불가
// 올바른 방법
byte num2 = (byte)num1; // 명시적 형변환 필요
두번째 주의사항
// 에러 발생 예시
byte b1=10;
byte b2=20;
byte b3=b1+b2; // 기본적으로 연산 int 사용(타입mismatch)
// 올바른 방법: int사용
세번째 주의사항
// 에러 발생 예시
int i1=10;
long l1=20;
int i2=i1+l1; // 기본적으로 산술 연산에서 더 큰 자료형으로 반환. 따라서 큰 타입 → 작은 타입 으로 묵시적 형변환 불가 에러
// 올바른 방법: long사용
네번째 주의사항
// 에러 발생 예시
float f1=10.0; // f를 안 붙이면 double형
float f2=f1+20.0;
// 올바른 방법
float f1=10.0f;
float f2=f1+20.0f;
댓글남기기