Reference Type
- 값형식 : 메모리 사용 크기 고정
- 참조형식 : 메모리 사용 크기 가변
참조형 변수 선언 및 해제
- Object obj; //참조형 변수 선언
- new + 생성자(); //객체생성
- string str = "ABC";
- int [] row = {1,2,3}; // 편의상 new연산자와 생성자 생략한 경우
- obj = null //해제, 가리키는 참조변수값이 없어짐
잘못된 참조관계
- 참조 변수만 생성되고 객체게 생성되지 않은 시점에서 객체의 멤버를 참조하는 경우...
Object obj;
obj.ToString(); //컴파일에러
참조형 변수 비교
- 참조형 변수가 가지는 메모리 위치를 비교한다.
Reference Type 형변환
- 부모.자식 객체간의 형변환가능(기본클래스: 파생클래스)
- 부모객체 -> 자식객체 : 다운 캐스팅 (Down Casting)
- 자식객체 -> 부모객체 : 업 캐스팅 (Up Casting)
업 캐스팅
- 완전호환
- 명시적, 암시적 둘다 가능
- 직원 m = (직원) s1;
- 단, 객체 자체의 형식을 바꾸는 것은 아니다. (단지 포인터를 다른 객체의 형식으로 변경)
- 그래서 모든 객체는 System.Object클래스로 업캐스팅이 가능하다
다운 캐스팅
- 반드시 명시적으로 변환
- 예외발생 가능하다. -> 예외처리(InvalidCastException)
using System;
namespace ReferenceType
{
class Printer
{
public string name;
public void WhoAmI()
{
Console.WriteLine("{0} Class", this.name);
}
}
class HP640: Printer
{
}
class MainClass
{
public static void Main()
{
Printer p = new Printer();
HP640 hp = new HP640();
Object obj1 = p;
Object obj2 = hp;
//모든 객체는 System.Object클래스로 업캐스팅이 가능하다.
p = (Printer)obj1;
p.name = "Printer";
hp.name = "HP640";
//업캐스팅:하위객체를 상위객체로 형변환
//p = (Printer)hp;
//p.WhoAmI();
//다운캐스팅 : 상위객체를 하위객체로 형변환
//hp = p; //암시적으로 형변환시 컴파일에러
try
{
hp = (HP640)p; //Exception 발생
hp.WhoAmI();
}
catch(InvalidCastException e)
{
Console.WriteLine(e.Message);
}
}
}
}