참조형 형변환
- 상속 관계에 있는 부모, 자식 클래스간의 형변환(상속관계에 있는것만 참조형 형변환이 가능하다.)
- 부모형 -> 자식형 : 다운캐스팅(Down Casting)
- 자식형 -> 부모형
: 업캐스팅(Up
Casting)
업 캐스팅
- 100% 가능
- 암시적, 명시적 가능
- 캐스팅이 발생해도 객체 자체는 변화 없음
다운 캐스팅
- 상황에 따라 가능
- 반드시 명시적으로 구현
- 예외 발생 가능 -> InvalidCastException
다운캐스팅 100% 불가능
Parent p2;
Child c2;
p2 = new
Parent();
c1 = (Child)p2;
암시적 형변화 : 그냥 선언하지 않아도 형변화가 가능하다
명시적 형변화 : 반드시 명시하여 형변화 해야한다.
하지만 반드시 암시적으로 된다하여도 명시를 하는 습관을 가지도록 하자.
자식객체는 부모변수에 넣을수 있지만 부모객체는 자식객체에 넣을수 없다.
하위객체 인스턴스는 위에있는 객체에 넣을수 있다.
위에있는 인스턴스 객체는 아래있는 인스턴스 객체에는 절대 넣을수 없다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test
{
class Catring01
{
static void Main(string[]
args)
{
//업캐스팅
//자식형 -> 부모형
Parent p1;
Child c1;
c1 = new Child();
//p1:부모객체, c1:자식객체 Up캐스팅 : 100%가능
p1 = (Parent)c1;
p1.a = 10;
p1.M1();
Parent p2;
Child c2;
p2 = new Parent();
//c2 = (Child)p2;
//객체를 다룰때는 인스턴스가 중요한게 아니라 참조변수에 따라 본다.
Parent p3;
Child c3;
Child c4 = new Child();
//100%가능
p3 = (Parent)c4;
//다운캐스팅 아래형태가 많이 사용된다.
c3 = (Child)p3;
}
}
//부모 클래스
class Parent
{
public int a;
public void M1()
{
Console.WriteLine("부모 메서드");
}
}
class Child
: Parent
{
public int b;
public void M2()
{
Console.WriteLine("자식 메서드");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test
{
class Casting01
{
static void Main(string[]
args)
{
C c = new C();
//부모 = 자식
B b = (B)c;
B b2 = new B();
A a = (A)b2;
//추상클래스와 인터페이스는 객체를 생성 못함!!!
//추상클래스의 인터페이스 -> 자료형!!!
//추상클래스와 인터페이스는 참조 변수를 생성할수 있음
A a2 = new A();
A a3 = new B();
//System.Object
object o1 =
(Object)new B();
object o2 =
(Object)new char();
Object o3 = new
Random();
Object o4 = DateTime.Now;
object o5 = 100;
Object o6 = new int[3];
object o7 = true;
object o8 = "하하하";
o1 = 0;
}
abstract class A
{
}
class B : A
{
}
class C : B
{
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test
{
class Casting02
{
static void Main(string[]
args)
{
//대리점 운영
// - 프린터 판매
// - HP640 x 5대
// - LG740 x 3대
//운영 방침
//1. 한달에 한번씩 모든 프린터 점검(출력, 기능)
//M1();
//M2();
M3();
}
private static void M1()
{
HP640 hp1 = new HP640();
HP640 hp2 = new HP640();
HP640 hp3 = new HP640();
HP640 hp4 = new HP640();
HP640 hp5 = new HP640();
LG740 lg1 = new LG740();
LG740 lg2 = new LG740();
LG740 lg3 = new LG740();
//정기 점검
hp1.Print(); hp2.Print(); hp3.Print();
hp4.Print(); hp5.Print();
lg1.Print(); lg2.Print(); lg3.Print();
hp1.Call(); hp2.Call(); hp3.Call();
hp4.Call(); hp5.Call();
lg1.SelfCheck(); lg2.SelfCheck();
lg3.SelfCheck();
}
private static void M2()
{
//배열사용
HP640[] hps = new HP640[5];
LG740[] lgs = new LG740[3];
//hps의 자료형? -> HP640[]
//hps[0]의 자료형?
hps[0] = new HP640();
for (int i = 0; i < hps.Length; i++)
hps[i] = new
HP640();
for (int i = 0; i < lgs.Length; i++)
lgs[i] = new
LG740();
//정기점검
for (int i = 0; i < hps.Length; i++)
{
hps[i].Print();
}
//
for (int i = 0; i < lgs.Length; i++)
{
lgs[i].Print();
lgs[i].SelfCheck();
}
}
private static void M3()
{
//업캐스팅 + 다운캐스팅
//Printer - HP640
//Printer - LG740
Printer p1 = new HP640();
Printer p2 = new LG740();
Printer[] ps =
new Printer[2];
ps[0] = new HP640();
ps[1] = new LG740();
//대리점
Printer[] list
= new Printer[8];
for (int i = 0; i < 5; i++)
{
list[i] = new
HP640();
}
for (int i = 5; i < 8; i++)
{
list[i] = new
LG740();
}
//정기점검
// - 양이 증가해도 OK
// - 메이커가 증가해도 OK (추가되는 프린터는 Printer 추상 클래스를 상속받는다고 가정하에..
for (int i = 0; i < list.Length; i++)
{
list[i].Print();
//다운캐스팅
//is 연산자 2항연산자 왼쪽 피연산자 오른쪽
피연산자 객체 is 타입
Console.WriteLine(list[i]
is HP640);
//상속관계의 서로 다른 하위 클래스의 집합 생성
// -> 업캐스팅
//하위 클래스만의 독자적인 기능을 호출
// -> 다운캐스팅
if
(list[i] is HP640)
{
HP640
hp = (HP640)list[i];
hp.Call();
}
if
(list[i] is LG740)
{
LG740
lg = (LG740)list[i];
lg.SelfCheck();
}
}
}
abstract class Printer
{
//멤버 구현
public string model;
public abstract void
Print();
}
class HP640 : Printer
{
public override void Print()
{
//HP사 내부 기슬
Console.WriteLine("HP640 전용 출력");
}
public void Call()
{
Console.WriteLine("상담원 자동연결..");
}
}
class LG740 : Printer
{
//규칙대로 코딩
public override void Print()
{
Console.WriteLine("LG740 전용 출력..");
}
//LG프린터만 사용할수 있는 독자 기술
public void SelfCheck()
{
Console.WriteLine("자가 진단 기능");
}
}
}
}