이전 글에서 형변환 부분을 넘기지 않았다면 캐스팅 연산자를 통해 [명시적 형변환]을 하는 경우
컴파일 단계가 아닌, 프로그램을 실행할 때 오류가 발생한다는 것을 알았다.
닷넷 프로그램에서 오류가 발생하는것은 내부적으로 제법 부하가 큰 동작이다.
따라서 오류가 발생하지 않고 형변환의 필요성이 생겼고 이를 위해
as 연산자가 추가되었다.
다음 코드는 오류가 발생하는 부분을 as 연산자로 수정을 한 코드이다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Project1
{
class desktop
{
bool power;
public bool powerControl
{
get { return power; }
set { power = value; }
}
public void what()
{
Console.WriteLine("데스크탑 입니다.");
}
}
class netbook : desktop
{
bool isPortable = true;
public bool isPort
{
get { return isPortable; }
}
public void whatNetbook()
{
Console.WriteLine("노트북 입니다.");
}
}
class Class1
{
public static void Main(String[] args)
{
desktop pc = new desktop();
netbook notebook = pc as netbook;
if(notebook != null)
{
notebook.whatNetbook(); // 실행되지 않는다.
}
}
}
}
as 연산자는 형변환이 가능하다면 지정된타입의 인스턴스 값을 반환한다.
그렇지 않다면 null을 반환하기 때문에 형변환에 성공했는지를 판단할 수 있다.
위의 코드에서 notebook 은 null 값을 가진다.
as 연산자는 [참조형 변수] 에만 적용할 수 있고, [참조형 타입] 으로의 체크나 가능하다.
잠깐 이 [참조형 변수] 에 대해서 설명을 하고 넘어가겠다.
변수는 크게 2가지로 나눌 수 있다.
[기본형 변수]
[참조형 변수]
기본형 변수는 실제 값(리터럴 이라고 한다) 을 저장하는 공간이다.
int, double 등등이 [기본형 변수] 에 포함된다.
[참조형 변수]는 실제 값이 아닌 [주소 값]을 저장한다.
[주소 값] 에 대한 내용은 C언어 [포인터] 부분에 잘 설명이 되어있으니 [주소 값] 이라는 단어가 이해가 안 된다면 가서 보고 오자.
다시 돌아가서 is 연산자도 있다.
is 는 형변환의 가능 여부를 bool 값으로 리턴한다.
as 와 is 는 언제, 어떤 것을 사용해야 하는가?
형변환된 [인스턴스] 가 필요하다면 as 를 사용하고
필요하지 않다면 is 를 사용하면 된다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Project1
{
class Class1
{
public static void Main(String[] args)
{
int n = 5;
if(n is string)
{
Console.WriteLine("변수 n 은 string 타입으로 형변환이 가능합니다.");
}
string text = "text";
if(text is int)
{
Console.WriteLine("변수 text는 int 타입으로 형변환이 가능합니다.");
}
}
}
}
위의 코드를 실행하면 그 어떤 것도 출력되지 않는다.
C# 7.0 에서 부터 is 연산자는 as 연산자의 기능을 포함한다.
해당 내용의 자세한 내용은 다음에 설명한다.
'C# > 책 정리' 카테고리의 다른 글
| C# 정리 ) GetType (0) | 2021.11.28 |
|---|---|
| C# 정리 ) ToString (0) | 2021.11.28 |
| C# 정리 ) System.Object (0) | 2021.11.28 |
| C# 정리 ) 상속 (0) | 2021.11.28 |
| C# 정리 ) 프로퍼티 (0) | 2021.11.28 |
댓글