프로그래밍언어/C#

20200213[C#] 캐스팅과 참조 변환 (상향 캐스팅, 하향 캐스팅), as 연산자

HJH0825 2020. 2. 13. 09:49

캐스팅

상향캐스팅

    public class Asset
    {

    }
    public class Stock : Asset
    {

    }

    class Program
    {
        static void Main(string[] args)
        {
            Stock stock = new Stock();
            Asset asset = stock;
            
        }
    }

 상향 캐스팅 연산은 파생 클래스 참조로부터 기반 클래스 참조를 생성한다.

stock 와 asset가 가리키는 객체는 같다. (stock == asset는 true

    public class Foo
    {
        public static Foo Instance = new Foo();
        public static int X = 3;
        Foo() { Console.WriteLine(X); }
    }
    public class Asset
    {
        public int nInt;
    }
    public class Stock : Asset
    {
        public float fFloat;
    }

    class Program
    {
        static void Main(string[] args)
        {
            Stock stock = new Stock();
            Asset asset = stock; //상향 캐스팅
            Console.WriteLine(asset.fFloat); //컴파일 오류

        }
    }

stock형식의 객체를 가리키긴 하지만 변수 자체의 형식은 Asset이기 때문에 fFloat변수접근이 불가능하다.

하향캐스팅

하향캐스팅 역시 변하는 것은 참조 뿐이다. 하향은 실행시점에서 실패 할 수도 있기 때문에 명시적으로 캐스팅이 필요하다.

 public class Foo
    {
        public static Foo Instance = new Foo();
        public static int X = 3;
        Foo() { Console.WriteLine(X); }
    }
    public class Asset
    {
        public int nInt;
    }
    public class Stock : Asset
    {
        public float fFloat;
    }

    class Program
    {
        static void Main(string[] args)
        {
            Stock stock = new Stock();
            Asset asset = stock; //상향 캐스팅

            Stock a = (Stock)asset; //하향 캐스팅

            Console.WriteLine(a.fFloat); 
            Console.WriteLine(a.nInt);

            Console.WriteLine(asset == stock); // true
            Console.WriteLine(asset == a); // true
            Console.WriteLine(a == stock); // true



        }
    }

 


as 연산자

as 연산자도 하향 캐스팅을 수행한다. 위와 다른점은 실패할 경우 null로 평가된다.

    class Program
    {
        static void Main(string[] args)
        {
            Asset a = new Asset();
            Stock s1 = (Stock)a;
            Stock s2 = a as Stock; // 예외를 발생하지 않음
        }
    }