개발 지식

[개발 지식, 자바] 캐스팅(Casting)

hminor 2024. 7. 30. 15:06

캐스팅(Casting)은 프로그래밍에서 데이터 타입을 변환하는 중요한 기법 중 하나.
특히 자바와 같은 엄격한 타입 언어에서는 캐스팅이 필수적인 경우가 많이 있다고 한다.
그래서 이번 포스팅에서는 자바에서 캐스팅의 개념, 필요성, 그리고 다양한 활용 사례에 대해 작성.


1. 캐스팅의 개념

캐스팅은 변수나 값을 다른 타입으로 변환하는 것을 의미한다. 기본적으로 두 가지 종류의 캐스팅이 있다:

  • 자동 캐스팅(Implicit Casting): 작은 타입에서 큰 타입으로의 변환은 자동으로 이루어진다
  • 명시적 캐스팅(Explicit Casting): 큰 타입에서 작은 타입으로의 변환은 명시적으로 지정해야 한다

2. 자동 캐스팅

자동 캐스팅은 데이터 손실의 위험이 없기 때문에 컴파일러가 자동으로 처리.
예를 들어, int를 long으로 변환하거나 float를 double로 변환할 때 자동으로 캐스팅이 이루어짐

int i = 100;
long l = i;  // int가 long으로 자동 변환됨
float f = 10.5F;
double d = f;  // float가 double로 자동 변환됨

3. 명시적 캐스팅

명시적 캐스팅은 데이터 손실이 발생할 수 있기 때문에 개발자가 직접 변환을 지정해야 한다.
소수점 이하를 버리거나 큰 타입의 일부 데이터를 잃을 수 있다

double d = 9.99;
int i = (int) d;  // 9.99가 9로 변환됨, 소수점 이하 버림
long l = 1000L;
short s = (short) l;  // long이 short로 변환됨, 데이터 손실 가능성 있음

4. 객체 캐스팅

객체 지향 프로그래밍에서 객체 캐스팅은 상속 관계에서 자주 사용된다.
부모 클래스 타입의 변수를 자식 클래스 타입으로 변환하거나
인터페이스 타입의 변수를 구현 클래스 타입으로 변환할 때 사용한다

class Animal {}
class Dog extends Animal {}

Animal a = new Dog();  // 업캐스팅, 자동으로 수행됨
Dog d = (Dog) a;  // 다운캐스팅, 명시적으로 수행해야 함

5. 캐스팅의 활용 사례

캐스팅은 다양한 상황에서 필요하다. 주요 사례들을 살펴보자

정밀도 손실을 감수한 변환

double d = 5.7;
int i = (int) d;  // 소수점 이하를 버리고 정수 부분만 필요할 때

계산에서 타입 맞추기

int a = 5;
int b = 2;
double result = (double) a / b;  // 실수 나눗셈을 위해 int를 double로 변환

상속 및 인터페이스 구현

List<String> list = new ArrayList<>();
ArrayList<String> arrayList = (ArrayList<String>) list;  // List를 ArrayList로 캐스팅

비트 연산

byte b = 0b0110;
int i = (int) b;  // byte를 int로 변환하여 비트 연산 수행

6. 주의사항

캐스팅을 사용할 때는 몇 가지 주의사항이 있다

  • 데이터 손실: 큰 타입에서 작은 타입으로 변환할 때 데이터 손실이 발생할 수 있다
  • ClassCastException: 객체 캐스팅 시 타입이 맞지 않으면 런타임 오류가 발생할 수 있다
Object obj = "Hello";
Integer i = (Integer) obj;  // 런타임 오류 발생, String을 Integer로 캐스팅할 수 없음

7. 결론

캐스팅은 자바에서 매우 중요한 개념.
자동 캐스팅과 명시적 캐스팅의 차이를 이해하고, 올바르게 활용하는 것이 중요.
특히 객체 캐스팅 시에는 타입 검사를 통해 안전성을 높이는 것이 필요.
이를 통해 더 안정적이고 효율적인 코드를 작성할 수 있을 것.