Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# is 연산자와 as 연산자의 차이점 완벽 정리

C#에서 타입을 확인하거나 변환할 때 자주 사용되는 is 연산자와 as 연산자는 비슷해 보이지만 용도와 동작 방식이 다릅니다. 이 글에서는 두 연산자의 개념, 문법, 실제 사용 예제를 통해 차이점을 명확하게 정리해 드립니다.

is 연산자란?

C#의 is 연산자는 객체의 런타임 타입이 특정 타입과 호환되는지를 검사합니다. 검사 결과는 true 또는 false로 반환되며, 주로 조건문과 함께 사용되어 안전하게 타입을 확인한 후 형 변환을 수행할 수 있습니다.

기본 문법은 다음과 같습니다.

expr is type
  • expr: 검사할 표현식(객체)
  • type: 호환 여부를 확인할 타입의 이름

is 연산자 사용 예제

다음 예제는 is 연산자를 사용해 객체의 타입을 확인하고, 조건에 따라 다르게 처리하는 방법을 보여줍니다.

using System;

class One { }
class Two { }

public class Demo {
    public static void Test(object obj) {
        One x;
        Two y;

        if (obj is One) {
            Console.WriteLine("Class One");
            x = (One)obj;
        } else if (obj is Two) {
            Console.WriteLine("Class Two");
            y = (Two)obj;
        } else {
            Console.WriteLine("None of the classes!");
        }
    }

    public static void Main() {
        One o1 = new One();
        Two t1 = new Two();
        Test(o1);
        Test(t1);
        Test("str");
        Console.ReadKey();
    }
}

실행 결과

Class One
Class Two
None of the classes!

위 코드에서 Test 메서드는 전달받은 객체가 One 타입인지, Two 타입인지를 is 연산자로 판별합니다. 어느 쪽에도 해당하지 않는 문자열 "str"은 마지막 else 분기로 처리되는 것을 확인할 수 있습니다.

as 연산자란?

as 연산자는 호환 가능한 타입 간의 변환을 수행합니다. 캐스트(cast) 연산과 유사하지만, 참조 변환, nullable 변환, 박싱(boxing) 변환만 지원합니다. 사용자 정의 변환과 같은 다른 종류의 변환은 수행할 수 없으며, 이 경우에는 일반 캐스트 식을 사용해야 합니다.

as 연산자의 가장 큰 장점은 변환이 실패할 경우 예외를 던지지 않고 null을 반환한다는 점입니다. 따라서 변환 성공 여부를 null 검사로 간단하게 확인할 수 있습니다.

기본 사용 형태는 다음과 같습니다.

string s = obj[i] as string;

as 연산자 사용 예제

다음 예제는 object 배열의 요소를 as 연산자로 string 타입으로 변환하고, 변환 성공 여부에 따라 다른 메시지를 출력합니다.

using System;

public class Demo {
    public static void Main() {
        object[] obj = new object[2];
        obj[0] = "jack";
        obj[1] = 32;

        for (int i = 0; i < obj.Length; ++i) {
            string s = obj[i] as string;
            Console.Write("{0}: ", i);
            if (s != null)
                Console.WriteLine("'" + s + "'");
            else
                Console.WriteLine("This is not a string!");
        }
        Console.ReadKey();
    }
}

실행 결과

0: 'jack'
1: This is not a string!

첫 번째 요소 "jack"은 문자열이므로 as 연산으로 성공적으로 변환되어 출력되지만, 두 번째 요소 32는 int 타입이라 변환이 실패하고 null이 반환되어 "This is not a string!" 메시지가 출력됩니다.

is와 as 연산자 비교 정리

  • is 연산자: 타입 호환 여부를 true/false로 반환하며, 실제 변환은 별도의 캐스트로 수행해야 합니다.
  • as 연산자: 타입 검사와 변환을 한 번에 수행하며, 실패 시 예외 대신 null을 반환합니다.
  • 변환 가능 여부만 확인할 때는 is, 안전한 형 변환이 필요할 때는 as를 사용하는 것이 좋습니다.
  • C# 7.0 이상에서는 if (obj is One x)처럼 패턴 매칭을 활용해 검사와 변환을 동시에 처리할 수도 있습니다.

두 연산자의 특성을 잘 이해하면 불필요한 예외 처리를 줄이고, 더 안전하고 가독성 높은 C# 코드를 작성할 수 있습니다.