[C#] C# as 연산자

.Net/C# 2013. 1. 9. 14:42

링크 : http://msdn.microsoft.com/ko-kr/library/cscsdfbt(VS.80).aspx 


호환되는 참조 형식 간에 변환을 수행하는 데 사용됩니다. 예를 들면 다음과 같습니다.

string s = someObject as string;
if (s != null)
{
    // someObject is a string.
}

as 연산자는 캐스트 연산과 비슷하지만 변환이 가능하지 않은 경우에 as를 사용하면 예외가 발생하지 않고 대신 null이 반환됩니다. 식의 정확한 형식은 다음과 같습니다.

expression as type

이 식은 아래의 식과 동일합니다.

expression is type ? (type)expression : (type)null

그러나 expression 이 한 번만 계산된다는 점은 다릅니다.

as 연산자는 오직 참조 변환과 boxing 변환만을 수행합니다. as 연산자는 사용자 정의 변환과 같은 다른 변환을 수행할 수 없습니다. 사용자 정의 변환은 이 연산자 대신 캐스트 식을 사용하여 수행해야 합니다.

// cs_keyword_as.cs
// The as operator.
using System;
class Class1
{
}

class Class2
{
}

class MainClass
{
    static void Main()
    {
        object[] objArray = new object[6];
        objArray[0] = new Class1();
        objArray[1] = new Class2();
        objArray[2] = "hello";
        objArray[3] = 123;
        objArray[4] = 123.4;
        objArray[5] = null;

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

출력

0:not a string
1:not a string
2:'hello'
3:not a string
4:not a string
5:not a string

'.Net > C#' 카테고리의 다른 글

[C#] Assemble.load  (0) 2013.01.15
[Visual Studio 2010] C# 선언할때 공백 제거 문제  (0) 2013.01.14
[C#] StackTrace  (0) 2013.01.08
[C#] DllImportAttribut  멤버  (0) 2013.01.04
[C#] Visual C# 메소드를 비동기로 호출하는 방법  (0) 2012.04.14
posted by 뚱2

[Java] instanceof 연산자

Java/Java 2011. 11. 28. 15:40
특정 객체가 비교하는 객체의 객체 상속도에 맞는지 확인하는 연산자
말은 어려운데 실제 보면은 간단하다.

public class AClass {
}

public class BClass extends AClass {
}

AClass aIns = new AClass();
BClass bIns = new BClass();

// 참
if ( aIns instanceof AClass ) {}

// 참
if ( bIns instanceof AClass ) {}

// 거짓
if ( aIns instanceof BClass ) {}

// 참
if ( bIns instanceof BClass ) {}

결국 검사할려는 인스턴스가 비교 객체의 자식 계통도에 포함되어 있으면 참이고
부모 계통도에 포함되어 있으면 거짓이다.
물론 상속계통도에 연관이 없는건 당연히 거짓이다.

'Java > Java' 카테고리의 다른 글

[Java] Java Dynamic method call  (0) 2012.02.09
[Java] map sort  (0) 2012.02.02
[Java] 날짜표시 YYMMDDHH24MI  (0) 2011.11.21
[Java] Java Annotation (어노테이션) 관련자료  (0) 2011.11.08
[Java] JDK와 JRE  (0) 2011.04.27
posted by 뚱2

C++ 캐스트 연산자

C/C++/VC++ / MFC 2009. 9. 15. 14:50

C++로 프로그래밍을 할때도 C 캐스팅을 사용하고 있습니다.
이유는 C++ 캐스트 연산자 보다 타이핑 작성라인이 적어지고 익숙해서 편하기 때문이죠...
그렇지만 여러 자료나 많은 분들이 타입변환시 더 안정적인 C++ 캐스트 연산자를 사용하라고
조언하고 있습니다.


* static_cast<타입>(대상) : 논리적으로 변환 가능한 타입을 변환한다.
설명 : 포인터끼리 타입을 변환할 때는 상속 관계에 있는 포인터끼리만 변환이 허용되면 상속 관계가 아닌
         포인터끼리는 변환을 거부한다.

* dynamic_cast<타입>(대상)
설명 : 부모 타입의 포인터를 자식 타입의 포인터로 다운 캐스팅할 때 무조건 변환을 허용하지 않고
         안전하다고 판단될 때만 허용한다.
         다운 캐스팅 할때 static_casts는 무조건 변환을 허가하지만 dynamic_cast는 실행 중에 타입을
         점검하여 안전한 캐스팅만 허가한다.
         따라서 이 연산자가 변환 가능성을 판한하기 위해서는 실행 중에 객체의 실제 타입을 판별할 수 있어야 한다.

* const_cast<타입>(대상)
설명 : 포인터의 상수성만 변경하고 싶을 때 사용한다.

* reinterpret_cast<타입>(대상)
설명 : 임이의 포인터 타입끼리 변환을 허용하는 상당히 위험한 캐스트 연산자.
         이 연산자는 포인터 타입간의 변환이나 포인터와 수치형 데이터의 변환에만 사용하며 기본 타입들끼리의
         변환에는 사용할 수 없다.

static_cast 상속 관계의 클래스 포인터 및 레퍼런스. 기본 타입. 타입 체크 안함.
dynamic_cast 상속 관계의 클래스 포인터 및 레퍼런스. 타입 체크. RTTI 기능 필요
const_cast const. volatile 등의 속성 변경
reinterpret_cast 포인터끼리, 포인터와 수치형간의 변환  
참고 : 혼자 연구하는 C/C++ (김상형 저/와우북스)
posted by 뚱2

타입 변환 연산자

C/C++/VC++ / MFC 2009. 8. 13. 17:05

C++ 에서는 타입 변환 연산자라는 기능이 있습니다.
이걸 사용하면은 클래스가 일반 타입처럼 암시적 변환이 가능합니다.

아래는 예제 클래스 입니다.
차때고 포때고 간단하게 작성했습니다.
클래스의 목적은 int의 기능을 대신하는 클래스입니다.
class MyInt
{
private:
    int m_nNum;

public:
    MyInt(int i) : m_nNum(i)  {}
    operator int() const {
      return m_nNum;
    }
    MyInt& operator =(int i)  { 
         m_nNum = i; return *this; 
    }
};
보통 연산자 오버로딩 후에는 반환값이 있습니다.
    MyInt& operator =(int i)      {   m_nNum = i; return *this; }
이런것 들 말이죠
그렇지만

연산자 오버로딩은 연산자가 함수 형태라고 해서 
리턴값을 써주면 안됩니다.
    operator int() const    {  return m_nNum;  }         // 컴파일됨
    int operator int() const    {  return m_nNum;  }     // 에러


참고 : The C++ Programming Language
posted by 뚱2