Programing/C#

C# 프로그래밍의 기초: 클래스 형식 변환(is,as)

유니얼 2024. 8. 24. 14:52
728x90

클래스 형식 변환은 객체 지향 프로그래밍에서 중요한 개념으로, 상속 관계에 있는 클래스 간에 객체의 타입을 변환하는 과정을 말합니다. C#에서 이러한 변환은 다형성을 활용하는 데 필수적이며, 코드의 유연성을 크게 증가시킵니다. 이 블로그 포스트에서는 업캐스팅과 다운캐스팅의 개념을 설명하고, 각각의 사용 사례를 통해 이해를 돕고자 합니다.

업캐스팅(Upcasting)

업캐스팅은 서브 클래스(자식 클래스)의 인스턴스를 슈퍼 클래스(부모 클래스) 타입으로 변환하는 과정입니다. 이 변환은 타입 계층에서 아래에서 위로 이동하는 것이며, 안전하고 자동으로 이루어지기 때문에 명시적인 형 변환 연산자를 사용할 필요가 없습니다.

 

업캐스팅의 장점:

  • 슈퍼 클래스 타입으로 일반화하여 여러 서브 클래스 객체를 관리할 수 있습니다.
  • 슈퍼 클래스에서 정의된 메서드와 속성에 접근하여, 코드의 재사용성을 높일 수 있습니다.

다운캐스팅(Downcasting)

다운캐스팅은 업캐스팅의 반대 과정으로, 슈퍼 클래스 타입의 객체를 서브 클래스 타입으로 변환합니다. 이 과정은 명시적으로 형 변환 연산자를 사용해야 하며, 변환하는 타입이 실제 객체의 타입과 호환되지 않는 경우 런타임 오류가 발생할 수 있습니다. 따라서, 다운캐스팅은 안전한 형 변환이 보장될 때만 사용해야 합니다.

 

다운캐스팅의 주의점:

  • 타입 호환성을 체크하지 않고 다운캐스팅을 수행할 경우 InvalidCastException을 일으킬 수 있습니다.
  • is나 as 연산자를 사용하여 안전하게 다운캐스팅을 수행할 수 있습니다.

is 연산자

is 연산자는 객체가 특정 타입과 호환되는지 확인하는 데 사용됩니다. 객체가 지정된 타입으로 변환이 가능한지 여부를 반환하며, 변환이 가능하면 true, 그렇지 않으면 false를 반환합니다. 이를 통해 다운캐스팅이 가능한지 사전에 확인하여 안전하게 형 변환을 수행할 수 있습니다.

as 연산자

as 연산자는 형 변환을 시도하되, 변환이 불가능할 경우 예외를 발생시키는 대신 null을 반환합니다. 이를 통해 형 변환에 실패할 때 예외 처리 없이 null 체크를 통해 안전한 처리를 할 수 있습니다. 단, as는 참조 타입에만 사용이 가능하며, 값 타입에는 사용할 수 없습니다.

전체예제 코드

using System;

namespace CSharp_ProgramingStudy.Chapter5_OOP
{
    class Animal
    {
        public void Eat()
        {
            Console.WriteLine("Animal is eating.");
        }
    }

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

    public class Class9
    {
        public void Run()
        {
            // 업캐스팅 예시
            Dog dog = new Dog();
            Animal animal = dog; // 업캐스팅, 자동으로 이루어짐
            animal.Eat();

            // 다운캐스팅 예시
            Animal animal2 = new Dog();
            Dog dog2 = (Dog)animal2; // 명시적 형 변환 필요
            dog2.Bark();
            
            
            // 다운캐스팅 예시 - is 연산자 사용
            if (animal2 is Dog dog3)
            {
                dog3.Bark(); // 다운캐스팅 성공 시에만 호출 가능
            }
            else
            {
                Console.WriteLine("animal2 is not a Dog.");
            }

            // 다운캐스팅 예시 - as 연산자 사용
            Dog dog4 = animal2 as Dog;
            if (dog4 != null)
            {
                dog4.Bark(); // 다운캐스팅 성공 시에만 호출 가능
            }
            else
            {
                Console.WriteLine("animal2 cannot be cast to Dog.");
            }

            // 다운캐스팅 예시 - 잘못된 형 변환
            Animal animal3 = new Animal();
            Dog dog5 = animal3 as Dog;
            if (dog5 != null)
            {
                dog5.Bark(); // 실행되지 않음
            }
            else
            {
                Console.WriteLine("animal3 cannot be cast to Dog.");
            }
        }
    }
}

결론

C#에서 클래스 형식 변환은 상속 구조 내에서 객체를 유연하게 사용할 수 있는 강력한 기능입니다. 업캐스팅을 통해 여러 서브 클래스의 객체를 부모 클래스 타입으로 다룰 수 있고, 다운캐스팅을 통해 특정 서브 클래스의 기능에 접근할 수 있습니다. is와 as 연산자를 사용하여 다운캐스팅을 안전하게 수행함으로써 코드의 안정성과 유연성을 더욱 높일 수 있습니다.

반응형