본문 바로가기
유니티 공부/C# 문법

C# 문법 - is, as, typeof 연산자

by 코딩하는 돼징 2023. 5. 17.
반응형

is 연산자

객체가 특정 형식이나 해당 형식의 파생 형식인지 확인하는데 사용한다.

E is T

E : 값을 반환하는 식

T : 형식 또는 매개변수의 이름


is 연산자의 true 조건

01 객체가 해당 형식의 인스턴스인 경우

02 객체가 해당 형식의 파생 형식의 인스턴스인 경우


Code 예시

object obj = 3;
object obj1 = "Pig";

if (obj is int || obj1 is int)
{
    Console.WriteLine($"obj is int {obj}");
}
if (obj is string || obj1 is string)
{
    Console.WriteLine($"obj is string {obj1}");
}


class Pig
{
    public virtual void Eat()
    {
        Console.WriteLine("Pig is eating");
    }
}
class PinkPig : Pig
{
    public override void Eat()
    {
        Console.WriteLine("PinkPig is eating");
    }
}
class Program
{
    static void Main(string[] args)
    {
        Pig pig = new PinkPig();
        if (pig is PinkPig)
        {
            pig.Eat();
        }
    }
}

과정

1. Pig pig = new PinkPig(); : PinkPig클래스의 인스턴스를 생성하여 pig변수에 할당한다. 이때 pig변수는 Pig 형식이지만 PinkPig클래스의 인스턴스를 참조한다.

다형성 알아보러 가기

 

C# 문법 - 다형성(virtual, override)

class Pig { public void Eat() { Console.WriteLine("먹는다"); } } 부모 클래스의 Eat()함수와 다르다는 것을 보여주기 위해 자식 크래스의 Eat() 함수 앞에 new를 붙여준다. class PinkPig : Pig { public new void Eat() { Consol

code-piggy.tistory.com

 

2. if (pig is PinkPig) : is연산자롤 통해서 pig변수가 PinkPig 형식의 인스턴스인지 확인한다.

3. Pinkpig형식의 멤버인 Eat()을 호출한다.


as 연산자

객체를 지정된 형식으로 변환한다.

E as T

E : 값을 반환하는 식

T : 형식 또는 매개변수의 이름

반환

변환이 성공한 경우 변환된 객체, 실패한 경우 null


Code 예시

class Pig
{
    public void Eat()
    {
        Console.WriteLine("Pig is eating");
    }
}
class PinkPig : Pig
{
    public void Jump()
    {
        Console.WriteLine("PinkPig is jumping");
    }
}
class Program
{
    static void Main(string[] args)
    {
        Pig pig = new Pig();
        // pig가 Pinkpig 타입인지 확인 한 후 아니면 null값이 return
        PinkPig pinkPig = pig as PinkPig;

        if (pinkPig != null)
        {
            pinkPig.Jump();
        }
        else
        {
            Console.WriteLine("null");
        }
    }
}

결과가 null이 나오는 이유

pig 변수는 Pig형식의 인스턴스를 참조한다.

PinkPig pinkPig = pig as PinkPig;을 통해서 pig변수를 PinkPig형식으로 형변환을 하려고 한다. 이때 pig는 PinkPig형식의 인스턴스가 아닌 경우 pinkPig에는 null이 할당된다.


class Pig
{
    public void Eat()
    {
        Console.WriteLine("Pig is eating");
    }
}
class PinkPig : Pig
{
    public void Jump()
    {
        Console.WriteLine("PinkPig is jumping");
    }
}
class Program
{
    static void Main(string[] args)
    {
        Pig pig = new PinkPig();
        // pig가 Pinkpig 타입인지 확인 한 후 아니면 null값이 return
        PinkPig pinkPig = pig as PinkPig;

        if (pinkPig != null)
        {
            pinkPig.Jump();
        }
        else
        {
            Console.WriteLine("null");
        }
    }
}

PinkPig pinkPig = pig as PinkPig;을 통해서 pig변수를 PinkPig형식으로 형변환을 하려고 한다. 이때 pig는 PinkPig형식의 인스턴스 이므로  pinkPig에는 true가 할당된다.


typeof

컴파일 시간에 형식을 분석하여 형식의 메타데이터(형식의 이름, 멤버의 정보, 속성 등)를 가져올때 사용한다.

Type intType = typeof(형식명);

반환

System.Type 개체


Code 예시

using System;
using System.Collections.Generic;

namespace pig
{
    class Pig
    {
        public int Weight { get; set; }
        public int Age { get; set; }
        public void Eat()
        {
            Console.WriteLine("Pig is eating");
        }
    }

   
    class Program
    {
        static void Main(string[] args)
        {
            Type type = typeof(Pig);

            Console.WriteLine($"Type Name : {type.Name}");
            Console.WriteLine($"Type NameSpace : {type.Namespace}");

            Console.WriteLine("Properties:");
            foreach (var property in type.GetProperties())
            {
                Console.WriteLine($"- {property.Name}");
            }

            Console.WriteLine("Methods:");
            foreach (var method in type.GetMethods())
            {
                Console.WriteLine($"- {method.Name}");
            }

        }
    }
}

 

01 Name

형식의 이름을 String 값으로 가져온다.

02 Namespace

형식이 속한 네임스페이스를 String값으로 가져온다.

03 GetProperties()

현재 Type의 모든 Property 을 반환

public System.Reflection.PropertyInfo[] GetProperties ();

반환

PropertyInfo[] 배열

 

04 GetMethods()

현재 Type의 모든 public 메서드를 반환

public System.Reflection.MethodInfo[] GetMethods ();

 

반응형

'유니티 공부 > C# 문법' 카테고리의 다른 글

C# - ArraySegment<T> Struct  (0) 2023.07.19
C# 문법 - Tuple<T1,T2>  (0) 2023.06.14
C# 문법 - 상속에서 override vs new  (0) 2023.05.09
C# 문법 - enum(열거형)  (0) 2023.05.09
C# 문법 - Nullable type  (0) 2023.04.20

댓글