업캐스팅?
인스턴스의 타입을 파생(자식) 클래스 타입에서
기본 클래스 타입으로 변환
다운 캐스팅?
인스턴스의 타입을 기본 클래스 타입에서
파생 클래스 타입으로 변환
업캐스팅은 암시적
다운캐스팅은 명시적
접근 가능한 맴버는 참조변수의 타입에 의해 결정됨
변환할 수 없는 경우 as 연산자가 null을 반환
캐스트 식과 달리 as 연산자는 예외를 throw하지 않는다.
as 연산자 변환 성공한 경우
as 연산자 변환 실패한 경우
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Step38
{
internal class Program
{
static void Main(string[] args)
{
//Marine marine = new Marine();
//marine.Attack();
//marine.StimPack();
//업캐스팅(암시적)
//TerranUnit unit = new Marine();
//unit.Attack();
//unit.StimPack(); //호출 불가
//업캐스팅 (명시적)
//TerranUnit unit = (TerranUnit)new TerranUnit();
//unit.Attack();
//unit.StimPack(); //호출불가
//TerranUnit unit = new Marine(); //암시적 업캐스팅
//Marine marine = (Marine)unit; //다운 캐스팅은 명시적이어야함
//marine변수의 값은 Marine의 인스턴스
//marine.Attack();
//marine.StimPack(); //호출 가능
/*주의 사항*/
//부모 클래스 인스턴스 생성 후
//자식 클래스 타입으로 (다운캐스팅) 할수 없다.
//Marine marine = (Marine)new TerranUnit();
//marine.Attack();
//marine.StimPack(); //호출가능
//is 연산자를 사용해서
//형식 변환이 가능한지 테스트 가능
//TerranUnit unit = new TerranUnit();
//bool canDownCast = unit is Marine;
//Console.WriteLine(canDownCast); //False
//Marine marine = new Marine();
//bool canUpCast = marine is TerranUnit;
//Console.WriteLine(canUpCast); // True
//TerranUnit unit = marine; //암시적 업캐스팅
//TerranUnit unit = new Marine(); //암시적 업캐스팅
//bool canUpCast = unit is TerranUnit;
//Console.WriteLine(canUpCast); //True
//Marine marine = (Marine)unit; //명시적 다운캐스팅
//as 연산자를 사용해 명시적으로 캐스팅 하기
//Marine marine = new Marine();
//TerranUnit unit = marine as TerranUnit;
//Console.WriteLine(unit); //Step38.Marine => 성공
TerranUnit unit = new TerranUnit();
Marine marine = unit as Marine;
Console.WriteLine("marine : {0}", marine); //marine : => 변환이 실패하면 결과값은 null
//즉, 예외를 발생시키지 않는다.
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Step38
{
internal class TerranUnit
{
public void Attack()
{
Console.WriteLine("공격합니다.");
}
//public TerranUnit() { }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Step38
{
internal class Marine : TerranUnit
{
public void StimPack()
{
Console.WriteLine("스팀팩을 활성화합니다.");
}
}
}
'Study > C#' 카테고리의 다른 글
[C#] 구조체 (0) | 2024.06.14 |
---|---|
[C#] 생성자 연결 (0) | 2024.06.12 |
[C#] virtual, override (0) | 2024.06.12 |
[C#] 상속 (1) | 2024.06.03 |
[C#] static 한정자 (0) | 2024.06.02 |