Languages/Java

[Java] Casting

dbssk 2023. 8. 10. 15:46

캐스팅 (Casting)

캐스팅은 프로그래밍에서 변수의 타입을 변경하는 것이다.

 

캐스팅이 필요한 이유

1. 다형성

상속과 오버라이딩을 통해 부모 클래스와 자식 클래스 간에 다형성을 구현할 수 있고, 부모 클래스의 레퍼런스로 자식 클래스의 객체를 다룰 수 있다. 이때, 부모 클래스의 레퍼런스로 자식 클래스의 메서드를 호출하면, 오버라이딩된 메서드가 실행된다. 

 

그러나 부모 클래스의 레퍼런스로는 자식 클래스에 추가된 메서드나 속성을 직접 호출할 수 없다. 이때, 캐스팅을 사용하여 부모 클래스의 레퍼런스를 자식 클래스로 캐스팅하면, 추가된 기능에 접근할 수 있다.

class Animal {
    void makeSound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    void makeSound() {
        System.out.println("Dog barks");
    }

    void fetch() {
        System.out.println("Dog fetches a ball");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        myDog.makeSound(); // 다형성에 의해 Dog 클래스의 오버라이딩된 메서드 호출

        if (myDog instanceof Dog) {
            Dog myRealDog = (Dog) myDog; // 캐스팅하여 Dog 클래스의 메서드 사용
            myRealDog.fetch();
        }
    }
}

2. 상속

상속을 사용하여 클래스 간에 공통적인 특성을 추상화할 수 있다. 이때, 캐스팅을 통해 범용적인 코드를 작성할 수 있으며, 런타임에 객체의 실제 타입에 따라 적절한 처리를 할 수 있다.

 

캐스팅의 종류

1. 업 캐스팅 (묵시적 형변환)

데이터를 더 큰 크기를 가진 데이터 타입으로 변환하는 것이다. 더 작은 범위의 값을 더 큰 범위의 타입으로 할당하는 경우에 자동으로 수행된다.

 

아래 코드와 같이 작은 정수 타입에서 큰 정수 타입으로의 캐스팅이 업 캐스팅이다.

int smallInt = 5;
double bigDouble = smallInt; // 업 캐스팅

2. 다운 캐스팅 (명시적 형변환)

데이터를 더 작은 크기를 가진 데이터 타입으로 변환하는 것이다. 더 큰 범위의 값을 더 작은 범위의 타입으로 할당하려면 명시적으로 캐스팅을 수행해야 한다.

 

아래 코드처럼 부동소수점 타입에서 정수 타입으로 변환 시 즉, 다운 캐스팅을 수행하면 소수점 이하의 값이 버려지기 때문에 값의 손실이 발생할 수 있다.

double bigDouble = 5.67;
int smallInt = (int) bigDouble; // 다운 캐스팅