본문 바로가기

취미로 하는 게임코딩_gameCodingAsHobby/유니티unity로 게임 만들기

유니티18_C#_11_타입 변환

타입 변환(형 변환)

 

이전 글 '변수'에서 암시적 타입변환과 명시적 타입변환을 알아보았다.

타입 변환은 좁은 범위의 타입을 넓은 범위의 타입에 넣을 때는 자연스럽게 포함할 수 있지만,

그 반대일 경우에는 좁은 범위의 타입이 무엇인지 ( )괄호 안에 명시해야 한다는 규칙이었다.

 

이 규칙은 클래스에서도 적용된다.

베이스(부모)클래스는 파생(자식)클래스를 포함하므로 베이스클래스는 범위가 넓고 파생클래스는 범위가 좁다고 할 수 있다.

 

예를 들어 다음과 같은 객체의 타입 변환이 가능하다.

 

//암시적 타입 변환

Hero ironMan = new Hero("Tony Stark", 53);

MainCharacter star = ironMan;

 

파생(자식)클래스인 Hero의 인스턴스(객체) ironMan을 만들고

이 객체를 베이스(부모)클래스인 MainCharacter의 인스턴스(객체) star에 저장할 수 있다.

암시적 타입 변환이기 때문에 가능하다.

 

다음과 같이 반대인 경우에는 객체의 타입 변환이 안된다.

 

//에러 예

MainCharacter star = new MainCharacter( );

Hero ironMan = (Hero)star;

 

변수 star에 저장된 객체가 부모클래스로 만든 것이기 때문에 자식클래스의 Hero타입으로 타입 변환할 수 없다.

 

그런데 아래와 같은 경우는 명시적 타입 변환이 가능하다.

 

//명시적 타입 변환 가능

MainCharacter star = new Hero( );

Hero ironMan = (Hero)star;

 

위의 경우는 부모클래스인 MainCharacter 타입의 변수 star에 자식클래스인 Hero 타입 객체를 만들어서 저장했다.

즉, 변수star에는 자식클래스 타입의 객체가 들어 있으므로 이것을 다시 자식클래스 타입인 ironMan에 명시적 타입 변환으로 넣을 수 있는 것이다.

 

as 연산자

 

위 '에러 예'의 코드는 컴파일 에러가 발생하지 않지만 실행하면 에러가 발생한다.

 

 

이런 경우 실제로 실행했을 때 타입 변환(캐스팅) 기능도 있으면서 불가능할 경우 에러의 발생을 막을 수 있는 장치가 필요한데 이럴 때 as 연산자를 활용할 수 있다.

 

as는 '~처럼, ~같이'라는 뜻도 있지만 여기서는 '~로서'의 뜻으로 사용했다.

그래서 as Hero 는 'Hero 타입으로서' 라는 뜻이다.

 

as 연산자를 사용하면 타입 변환이 가능하면 타입 변환(캐스팅)을 하고, 불가능하면 null 값을 반환한다.

 

null은 값이 '없다 또는 비어있다'를 나타내기 위해 만든 문자다.

그래서 as를 사용하면 설령 타입 변환이 안돼도 에러가 발생하지는 않는다.

 

위의 '에러 예' 코드를 as 연산자로 바꾼 후 실행해보자.

 

 

10번줄

타입 변환의 결과를 확인하기 위해 if조건문을 만든다.

자식클래스 타입인 Hero 타입으로 변환이 안되면 ironMan변수에는 null값이 저장될 것이다.

그래서 조건은 'ironMan 값이 null과 같다면' 으로 작성한 후 참인 경우 "타입 변환 실패"를 출력하도록 실행 부분에 작성했다. else의 실행 부분에는 null값이 아닐 경우 "타입 변환 성공"을 출력한다.

 

실행하면 결과는 다음과 같다.

 

참고로 as연산자는 클래스 같은 참조형(reference) 변수 타입에만 사용할 수 있다.

타입(Type)은 2가지 유형이 있는데 하나는 value type(밸류 타입)이고 또 하나는 reference type(레퍼런스 타입)이다.

이것에 대해서는 나중에 따로 알아보기로 하고 간단하게 정리하면 다음과 같다.

 

value(값) 타입은 값을 직접 메모리에 저장하는 타입을 말한다.

예를 들면 char , int , long , float , double 등이 value(밸류) 타입이다.

 

반면에 reference(참조) 타입은 값이 저장되어 있는 주소(address)를 저장한다.

예를 들면 string , array , class 등이 참조 타입이다.

 

 

is 연산자

is는 as와 비슷하지만 실제로 타입 변환(캐스팅)하지 않고 타입변환이 가능하면 true, 불가능하면 false 값을 반환한다.

즉, 캐스팅이 가능한 지, 불가능한 지만 확인할 수 있다.

또한 is는 reference 타입에도, value 타입에도 모두 사용할 수 있다.

 

예를 들면 다음과 같이 사용할 수 있다.

 

 

7번줄에서 object타입의 number 변수에 10을 저장한다.

C#에만 있는 object타입은 모든 타입을 넣을 수 있는 타입이다.

이 경우 컴파일러는 값을 보고 어떤 값인지 추론한다.

9번줄에서 조건문으로 만약 number값이 int타입인지 확인한다.

11번줄에서 true(참)이면 "int number값"을 출력하고

15번줄에서 false(거짓)이면 "int 타입 아님"을 출력하라.

 

11번줄에서 처럼 문자열 도중에 변수값을 넣어야 할 경우 $ 기호를 앞에 붙인 후 문자열 중간에는 { } 중괄호 안에 변수명을 넣는다.

 

끝.

 

Wraven...