7.9 형식 반환 연산자 [is, as]
is : 객체가 해당 형식에 해당하는지 검사하여 그 결과를 bool값으로 환산
as : 형식 반환 연산자와 같은 역할을 함. 다만 형식 변환 연산자가 변환에 실패하는 경우 예외를 던지는 반면에 as연산자는 객체 참조를 null로 만든 다는 것이 차이점.
is 연산자 사용 예제
Mamal mamal = new Dog();
Dog dog;
if (mamal is Dog)
{
dog = (Dog)mamal;
dog.Bark();
}
/mamal객체가 Dog형식임을 확인했으므로 안전하게 형식 변환이 이루어진다.
as 연산자 사용 예제
Mamal mamal2 = new Cat();
Cat cat = mamal2 as Cat;
if (cat != null)
{
cat.Meow();
}
/mamal2가 Cat형식반환에 실패했다면 cat은 null이 된다. 하지만 이 코드에서 mamal2는 Cat 형식에
/해당하므로 안전하게 형식변환이 이루어진다.
일반적으로 형식 변환 대신 as 연산자를 사용하길 권장한다. 이유는 형식 변환에 ㅅ ㅣㄹ패하더라도 예외가 일어나 코드의 실행이 점프하는 일은 없으므로 코드 관리가 더욱 수월하기 때문. 단 as연산자는 참조 형식에서만 사용이 가능하므로 값 형식 객체는 기존의 형식 변환 연산자를 사용해야 한다.
객체 형식 변환 테스트 예제
namespace ConsoleApp10
{
internal class Program
{
class Mammal
{
public void Nurse()
{
Console.WriteLine("Nurse()");
}
}
class Dog : Mammal
{
public void Bark()
{
Console.WriteLine("Bark()");
}
}
class Cat : Mammal
{
public void Meow()
{
Console.WriteLine("Meow()");
}
}
static void Main(string[] args)
{
Mammal mammal = new Dog();
Dog dog;
if (mammal is Dog)
{
dog = (Dog)mammal;
dog.Bark();
}
Mammal mammal2 = new Cat();
Cat cat = mammal2 as Cat;
if (cat != null)
cat.Meow();
Cat cat2 = mammal as Cat;
if (cat2 != null)
cat2.Meow();
else
Console.WriteLine("cat2 is not a Cat");
}
}
}
결과
Bark()
Meow()
cat2 is not a Cat
7.10 오버라이딩과 다형성
객체지향 프로그래밍에서 다형성(Polymorphism)은 객체가 여러 형태를 가질 수 있음을 의미합니다. 또한 메소드를 오버라이딩 하기위해서는 메소드가 virtual 키워드로 한정되어 있어야만 합니다.
다음 예제는 아이언맨의 수트를 업그레이드 하는 예제입니다.
namespace ConsoleApp10
{
internal class Program
{
class ArmorSuite
{
public virtual void Initialize()
{
Console.WriteLine("Armored");
}
}
class IronMan : ArmorSuite
{
public override void Initialize()
{
base.Initialize();
Console.WriteLine("Repulsor Rays Armed");
}
}
class WarMachine : ArmorSuite
{
public override void Initialize()
{
base.Initialize();
Console.WriteLine("Double - Barrel Cannons Armed");
Console.WriteLine("Micro - Rocket Launcher Armed");
}
}
static void Main(string[] args)
{
Console.WriteLine("Creating ArmorSuite...");
ArmorSuite armorsuite = new ArmorSuite();
armorsuite.Initialize();
Console.WriteLine("\nCreating IronMan...");
ArmorSuite ironman = new IronMan();
ironman.Initialize();
Console.WriteLine("\nCreating WarMachine...");
ArmorSuite warmahcine = new WarMachine();
warmahcine.Initialize();
}
}
}
//
Creating ArmorSuite...
Armored
Creating IronMan...
Armored
Creating WarMachine...
Armored
Barrel Cannons Armed
Rocket Launcher Armed
7.10 메소드 숨기기
Armor는 차후 업그레이드가 있을 것을 고려하여 Initialize() 메소드를 virtual로 선언했다.
메소드 숨기기란, CLR에게 기반 클래스에서 구현된 버전의 메소드를 감추고 파생클래스에서 구현된 버전만 보여주는 것을 말한다. 메소드 숨기기 파생 클랫 ㅡ버전의 메소드를 new 한정자로 수식한다. (new 연산자와 동명이인일뿐)
namespace ConsoleApp10
{
internal class Program
{
class Base
{
public void MyMethod()
{
Console.WriteLine("Base.MyMethod()");
}
}
class Derived : Base
{
public new void MyMethod()
{
Console.WriteLine("Derived.MyMethod()");
}
}
static void Main(string[] args)
{
Base baseObj = new Base();
baseObj.MyMethod();
Derived derivedObj = new Derived();
derivedObj.MyMethod();
Base baseOrDerived = new Derived();
baseOrDerived.MyMethod();
}
}
}
//
Base.MyMethod()
Derived.MyMethod()
Base.MyMethod()'C#.' 카테고리의 다른 글
| 이것이 C#이다 9장 ) 인터페이스와 추상클래스의 프로퍼티 (feat:무명형식) (0) | 2023.08.31 |
|---|---|
| 이것이 C#이다 9장) 불변 객체 record (0) | 2023.08.30 |
| 이것이 C#이다 9장) 자동구현 Property (0) | 2023.08.30 |
| 이것이 C#이다 8장) 인터페이스와 추상클래스 (0) | 2023.08.25 |
| 이것이 C#이다 7장) 클래스와 객체, 인스턴스의 차이 (0) | 2023.08.23 |