본문 바로가기
C#

C# - 캐스팅 |업캐스팅(UpCasting), 다운캐스팅(DownCasting)

by Classic Master 2024. 5. 16.
728x90

캐스팅이란 무엇인가?

캐스팅 ( Casting )

업캐스팅(Upcasting)과 다운캐스팅(Downcasting)은 객체 지향 프로그래밍에서 클래스 계층 구조 내에서 객체의 타입을 변환하는 방법입니다. 이 두 가지 캐스팅 방법은 부모 클래스와 자식 클래스 간의 관계를 다루며, 유연한 코딩을 가능하게 합니다. 이 글에서는 업캐스팅과 다운캐스팅의 개념, 정의, 표현 방식, 장점, 단점, 그리고 예시를 통해 쉽게 이해할 수 있도록 설명하겠습니다.

정의

업캐스팅 (Upcasting)

  • 업캐스팅은 자식 클래스의 객체를 부모 클래스 타입으로 변환하는 것을 의미합니다. 이는 암묵적으로 수행되며, 명시적인 캐스팅 없이도 가능합니다. 업캐스팅을 통해 자식 클래스 객체를 부모 클래스 타입의 변수에 할당할 수 있습니다.

다운캐스팅 (Downcasting)

  • 다운캐스팅은 부모 클래스 타입의 객체를 자식 클래스 타입으로 변환하는 것을 의미합니다. 이는 명시적으로 수행되어야 하며, 변환이 안전한지 확인하기 위해 is 또는 as 키워드를 사용할 수 있습니다. 다운캐스팅은 업캐스팅된 객체를 다시 원래의 자식 클래스 타입으로 변환할 때 사용됩니다.

is / as 키워드

  • 업캐스팅은 부모 클래스의 객체를 사용하여 자식 클래스의 객체를 참조하는 것으로, 명시적인 형변환 없이 암묵적으로 수행됩니다. 따라서 업캐스팅 과정에서는 is나 as 키워드를 사용할 필요가 없습니다. 업캐스팅은 일반적으로 자식 클래스의 인스턴스를 부모 클래스의 인스턴스로 간주할 수 있도록 하는 것이기 때문에 부모 클래스의 변수에 자식 클래스의 객체를 직접 할당할 수 있습니다. 다만, 이 과정에서 자식 클래스의 고유한 멤버에는 접근할 수 없게 됩니다.

반응형

표현 방식

업캐스팅
업캐스팅은 명시적인 캐스팅이 필요 없으며, 암묵적으로 수행됩니다.

public class Animal
{
    public void Speak()
    {
        Console.WriteLine("Animal sound");
    }
}

public class Dog : Animal
{
    public void Bark()
    {
        Console.WriteLine("Bark");
    }
}

public class Program
{
    public static void Main()
    {
        Dog dog = new Dog();
        Animal animal = dog; // 업캐스팅
        animal.Speak(); // "Animal sound"
    }
}

 

다운캐스팅
다운캐스팅은 명시적인 캐스팅이 필요하며, 캐스팅이 안전한지 확인하는 절차가 필요합니다.

public class Animal
{
    public void Speak()
    {
        Console.WriteLine("Animal sound");
    }
}

public class Dog : Animal
{
    public void Bark()
    {
        Console.WriteLine("Bark");
    }
}

public class Program
{
    public static void Main()
    {
        Animal animal = new Dog(); // 업캐스팅
        Dog dog;

        if (animal is Dog)
        {
            dog = (Dog)animal; // 다운캐스팅
            dog.Bark(); // "Bark"
        }
    }
}

 

캐스팅의 장점 및 단점

장점

업캐스팅

  • 유연성 : 업캐스팅을 통해 다형성을 구현할 수 있습니다. 부모 클래스 타입의 변수를 사용하여 다양한 자식 클래스 객체를 처리할 수 있습니다.
  • 코드 재사용 : 부모 클래스의 메서드를 재사용할 수 있어 코드 중복을 줄일 수 있습니다.
  • 유지보수성 향상 : 부모 클래스 타입을 사용하면 코드가 더 일관되고 유지보수가 쉬워집니다.

다운캐스팅

  • 특정 기능 사용 가능 : 다운캐스팅을 통해 자식 클래스의 고유 기능을 사용할 수 있습니다.
  • 다형성 강화 : 다운캐스팅을 사용하면 상위 클래스 타입의 객체를 다시 자식 클래스 타입으로 변환하여 더 구체적인 작업을 수행할 수 있습니다.

단점

업캐스팅

  • 제한된 접근 : 업캐스팅된 객체는 부모 클래스의 멤버만 접근할 수 있습니다. 자식 클래스의 고유 멤버에는 접근할 수 없습니다.
  • 타입 정보 손실 : 업캐스팅 과정에서 자식 클래스의 타입 정보가 손실될 수 있습니다.

다운캐스팅

  • 안전성 문제 : 다운캐스팅이 잘못된 경우 런타임 오류가 발생할 수 있습니다. 따라서 캐스팅이 안전한지 확인하는 추가적인 코드가 필요합니다.
  • 코드 복잡성 증가 : 다운캐스팅을 위해 추가적인 조건문과 캐스팅 연산이 필요하므로 코드가 복잡해질 수 있습니다.

예시

동물과 개 클래스
이 예제에서는 Animal 클래스와 이를 상속받는 Dog 클래스를 사용하여 업캐스팅과 다운캐스팅을 보여줍니다.

public class Animal
{
    public void Speak()
    {
        Console.WriteLine("Animal sound");
    }
}

public class Dog : Animal
{
    public void Bark()
    {
        Console.WriteLine("Bark");
    }
}

public class Program
{
    public static void Main()
    {
        // 업캐스팅
        Dog dog = new Dog();
        Animal animal = dog;
        animal.Speak(); // "Animal sound"

        // 다운캐스팅
        if (animal is Dog)
        {
            Dog downcastedDog = (Dog)animal;
            downcastedDog.Bark(); // "Bark"
        }
    }
}

 

차량과 자동차 클래스
이 예제에서는 Vehicle 클래스와 이를 상속받는 Car 클래스를 사용하여 업캐스팅과 다운캐스팅을 보여줍니다.

public class Vehicle
{
    public void Drive()
    {
        Console.WriteLine("Driving vehicle");
    }
}

public class Car : Vehicle
{
    public void Honk()
    {
        Console.WriteLine("Honking car horn");
    }
}

public class Program
{
    public static void Main()
    {
        // 업캐스팅
        Car car = new Car();
        Vehicle vehicle = car;
        vehicle.Drive(); // "Driving vehicle"

        // 다운캐스팅
        if (vehicle is Car)
        {
            Car downcastedCar = (Car)vehicle;
            downcastedCar.Honk(); // "Honking car horn"
        }
    }
}

 

결론

업캐스팅과 다운캐스팅은 객체 지향 프로그래밍에서 클래스 계층 구조를 유연하게 다루기 위한 중요한 기법입니다. 업캐스팅을 통해 다형성을 구현하고, 다운캐스팅을 통해 특정 클래스의 기능을 사용할 수 있습니다. 그러나 잘못된 다운캐스팅은 오류를 일으킬 수 있으므로, 항상 안전한지 확인하는 절차가 필요합니다. 이 두 가지 캐스팅 방법을 적절히 사용하면 코드의 유연성과 재사용성을 크게 향상시킬 수 있습니다.

728x90
반응형