[Java 기본 원리] 자료형의 범위와 형변환 총정리

Java의 자료형 범위와 형변환(명시적vs묵시적)에 대해 상세히 알아보자. 🔍



정수 자료형의 메모리 표현 💡

bit, byte가 뭔지는 안다고 생각하고 설명한다.



byte 타입의 메모리 표현

  1. 일반 byte type

    부호 비트 포함 (=맨 앞 비트)

    • 0000 1001 → 9 // 2³ + 2⁰ = 8 + 1 = 9
    • 1000 1001 → -119 // -2⁷ + 2³ + 2⁰ = -128 + 8 + 1 = -119
  2. 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) 💡

명시적vs묵시적 형변환


묵시적 형변환 (자동)

  • 작은 타입 → 큰 타입으로 자동 변환 (값 손실 없으니까 형변환 연산 생략)
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;

댓글남기기