8월2일 - 캐스팅

Yullgiii·2024년 8월 5일
0

Casting in Java (업캐스팅 & 다운캐스팅)

오늘은 자바에서의 캐스팅(Casting)에 대해 공부해보자. 캐스팅은 변수의 타입을 변환하는 작업으로, 업캐스팅과 다운캐스팅이 있다. 이를 통해 다형성과 상속을 활용한 범용적인 프로그래밍이 가능하다.

캐스팅이란?

캐스팅은 변수의 타입을 변환하여 원하는 정보를 갖도록 하는 것을 의미한다. 이를 통해 타입 간의 변환을 명시적으로 지정할 수 있다.

캐스팅의 필요성

  1. 다형성: 오버라이딩된 메소드를 활용할 수 있다.
  2. 상속: 캐스팅을 통해 더 일반적인 프로그래밍이 가능하다.

형변환의 종류

1. 묵시적 형변환 (Implicit Casting)

  • 업캐스팅(Upcasting): 하위 클래스의 객체를 상위 클래스 타입으로 변환.
  Parent p = new Child(); // (Parent) new Child()로 캐스트할 필요가 없음
  • 상위 클래스의 속성을 하위 클래스가 포함하고 있기 때문에 자동으로 형변환이 가능하다.

2. 명시적 형변환 (Explicit Casting)

다운캐스팅(Downcasting): 상위 클래스의 객체를 하위 클래스 타입으로 변환. 업캐스팅이 발생한 후에만 작용한다.

Parent p = new Child();
Child c = (Child) p; // 명시적으로 캐스트

예제 문제

캐스팅의 동작을 이해하기 위해 다음의 자바 코드를 살펴보자.

class Parent {
    int value;

    Parent() {}

    Parent(int value) {
        this.value = value;
    }

    void displayInfo() {
        System.out.println("Parent Method Call!");
    }
}

class Child extends Parent {
    String description;

    Child() {}

    Child(int value, String description) {
        super(value);
        this.description = description;
    }

    @Override 
    void displayInfo() {
        System.out.println("Child Method Call!");
    }
}

public class CastingExample {
    public static void main(String[] args) {
        Parent p = new Child();
        
        p.displayInfo(); // 문제1: 출력 결과는?
        Child c = (Child) new Parent(); //문제2: 에러 종류는?
    }
}

문제 해설

문제 1: 출력 결과는?

Child Method Call!

자바에서는 메소드가 오버라이딩된 경우, 객체의 실제 타입에 따라 메소드를 호출하는 동적 바인딩(Dynamic Binding)을 사용한다. 따라서 Parent 타입 변수 p가 Child 객체를 참조하고 있으므로 Child의 displayInfo()가 호출된다.

문제 2: 에러 종류는?

Runtime Error: ClassCastException

컴파일러는 (Child) 형변환을 허용하지만, 런타임에서는 Parent 인스턴스를 Child로 캐스팅할 수 없음을 발견한다. 이는 Parent 객체가 실제로 Child 타입의 인스턴스가 아니기 때문이다.

So...

캐스팅은 자바의 다형성과 상속을 활용하는 데 중요한 역할을 한다. 업캐스팅은 안전하게 수행될 수 있지만, 다운캐스팅은 런타임 오류가 발생할 수 있으므로 신중하게 사용해야 한다. 올바른 타입 체크와 명시적 형변환을 통해 코드를 안전하게 유지하는 것이 중요하다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글