-
2024.03.06 - 업캐스팅(Upcasting)C# 2024. 3. 6. 17:46
- 캐스팅(Casting)
캐스팅(Casting)은 어떤 데이터의 타입을 다른 타입으로 바꿔주는 것을 말한다. 캐스팅에는 암시적 변환, 명시적 변환 2종류가 있다.
- 암시적 변환
암시적 변환은 작은 범위의 자료형에서 넓은 범위의 자료형으로 변환할 때 일어난다. 아래의 예시를 보자.
원래 double타입의 변수 a에 int타입의 변수 b를 대입할 수 없다. a에 b를 대입하기 위해서는 b의 타입을 변환해주어야 한다. 그러나 위 코드에서 a에 b를 대입하려고 할 때 오류가 발생하지 않는다. a = b;에서 암시적 변환이 일어나기 때문이다.
작은 범위의 자료형인 int타입의 데이터를 넓은 범위의 자료형인 double타입의 데이터로 변환할 때는 데이터 손실이 없기 때문에 자동으로 a = (double)b;가 수행이 된다.
- 명시적 변환
명시적 변환은 넓은 범위의 자료형에서 좁은 범위의 자료형으로 변환할 때 일어난다. 아래의 예시를 보자.
int타입의 변수 a에 double타입의 변수 b를 대입하려면, b를 int형으로 변환해주어야 한다. 넓은 범위의 자료형인 double타입의 데이터는 작은 범위의 자료형인 int타입의 데이터로 변환시, 데이터 손실이 일어날 수 있다. 이 경우, 데이터 손실이 발생할 수 있다고 컴파일러에 알려주는 명시적 변환을 하여야 한다.
변수 b를 int타입으로 명시적 변환해주어 변수 a에 대입이 가능해졌다. 데이터를 변환하는 과정에서 데이터 2.5는 2로 바뀌었다.
- 업캐스팅(Upcasting)
클래스끼리도 캐스팅(타입 변경)을 할 수 있다. 업캐스팅(Upcasting)이란 부모 클래스의 타입으로 변경을 한다는 뜻이다.
예시를 들기 위해 부모 클래스인 Animal, 자식 클래스인 Dog 클래스를 만들었다.
- 명시적인 업캐스팅
Dog 타입인 dog객체를 부모 클래스인 Animal 타입으로 명시적인 형변환을 해주었다.
- 암시적인 업캐스팅
Dog 타입인 dog객체를 부모 클래스인 Animal 타입으로 암시적인 형변환을 해주었다. 자식클래스는 상속받은 부모클래스의 모든 멤버를 가지고 있어 데이터 손실이 일어나지 않기 때문에, 암시적인 형변환이 가능하다.
- 다이렉트 업캐스팅
Dog 인스턴스를 만들때 바로 Animal 객체로 만들어도 된다.
- 함수의 매개변수, 배열의 요소로 넣을때 업캐스팅
Animal 객체를 매개변수로 받아, Animal 객체의 name을 출력해주는 함수를 만들었다. PrintAnimalName 함수에 Dog 객체가 매개변수로 들어가더라도, Animal타입으로 암시적인 업캐스팅이 일어난다.
Dog객체가 Animal 타입 배열의 요소가 될 때에도 Animal타입으로 암시적인 업캐스팅이 일어난다.
- 그래서 왜 쓰는데?
위와 같이 동물에 관한 클래스가 정의되어 있다. Main에서 각 자식 클래스의 인스턴스를 생성해서, 그 이름을 출력하고 싶다. 그래서 아래와 같은 코드를 작성했다.
음... 좋다. 좋은데 약간 번거롭다는 생각이 든다. 나중에 동물이 종류가 더 많아진다면, 일일히 따로 출력을 하기는 힘들다. 저 객체들이 모두 같은 타입이었으면 반복문을 통해서 더 쉽게 출력할 수 있지 않을까? 이럴때 업캐스팅이 활용된다.
각 객체를 업캐스팅하여 Animal 타입 배열에 넣어 name을 출력하는 반복문을 작성하였다. 이런식으로 자식 객체끼리 반복되는 작업을 할때, 자식 객체끼리 비교하는 작업을 할 때 등등 업캐스팅을 활용할 수 있다.
'C#' 카테고리의 다른 글
2024.03.06 - 인터페이스(interface) (0) 2024.03.08 2024.03.06 - 다형성(Polymorphism) (0) 2024.03.07 2024.03.06 - 추상화(Abstract) (0) 2024.03.06 2024.03.06 - 오버라이딩(Overriding), 가상 함수(virtual) (0) 2024.03.06 2024.03.05 - 상속(inheritance), 접근 제한자 (0) 2024.03.06