In to the C# 2014. 1. 24. 14:23

[C#] Attribute : 속성

Attribute는 속성이나 특성이라는 뜻을 가지고 있습니다.

C#에는 Attribute라는 기능이 있는데, 이것은 클래스나 멤버(메소드/변수)에 Attribute를 지정할 수 있습니다.

Attribute를 지정하는 클래스가 특별히 기능을 하는 것은 아니고, 제 3자가 특정 클래스의 Attribute를 확인해서 어떠한 작업을 처리 하려고 하는 것입니다.

HTML도 속성이 있는 것이 그 자체로 무언가 되는것이 아니라, 브라우저가 파싱해서 보여주고, Javascript가 id로 엘리먼트를 찾을 수 있듯이 말이죠.

 

저는 Attribute를 이용해서 메시지 분배 처리기를 간단하게 구현하였습니다. 보통은 Map이나 Dictionary에 메시지타입과 함수포인터를 연결해놓기 마련인데요. 결과론적으론 제가 구현한 방법도 같은 의미이지만 구현 과정을 보면 코딩의 양을 줄여 줄 수 있는 방법이기도 합니다. 왜냐면 메소드에 Attribute만 지정해주면 되거든요.

 

간단하게 MessageType을 정의 하였습니다.

 

그리고 Attribute 클래스를 정의 하였습니다.

MessageDistributorAttribute 클래스에서도 AttributeUsage Attribute를 사용하는 군요. 메소드에만 MessageDistributorAttribute를 붙일 수 있도록 설정한 것입니다. 그 외엔 Attribute 클래스를 상속한 것 말고는 정말 별다른 것 없는 클래스 입니다.

 

위 소스는 메소드 집합 클래스 입니다.

보통 서버 프로그래밍 할 때 메시지 처리 메소드(함수)의 특징은 파라미터들의 타입과, 리턴 타입이 동일하게끔 설계를 하지요? 이 것도 선조건으로 동일하게 구현해야겠네요. 메소드 구현전에 MessageDistributor라는 Attribute를 추가 해줍니다.

 

아! 클래스 이름은 MessageDistributorAttribute인데 사용할 대는 Attribute를 빼네요? 컴파일러가 알아서 해석합니다. 그냥 그렇게 구현한다고만 기억해두시기 바랍니다.

 

JOIN(가입) - MyMethod1 실행

LOGIN(로그인) - MyMethod2 실행

REQUEST(요청) - MyMethod3 실행

 

이런식으로 되도록 Attribute를 사용 했습니다.

다음은 Main 메소드 입니다.

 

Line 6은 MethodSet 인스턴스에서 타입 정보를 가져 옵니다.

Line 8은 MethodSet 인스턴스에서 메소드 리스트를 가져옵니다.

Line 11은 Method에서 Attribute 배열을 가져옵니다.

Line 16 ~ 18은 Attribute 배열에서 MessageDistributorAttribute 인스턴스를 골라 냅니다.

Line 27은 MethodInfo에서 실행하가능한 Method delegate를 만들어 냅니다.

Line 34 ~ 40 까지는 table에서 MessageType에 따라 메소드를 호출 하는 로직입니다.

Line 43 ~ 55 까지는 MethodSet 인스턴스에서 메소드를 delegate로 뽑아 내는 로직입니다.

 

이런식으로 하면 MessageType이 늘어나고, 처리 Method가 늘어날때마다 table.Add를 줄줄이 써줄 필요는 없게 될 것입니다.

아래는 전체 소스 입니다.

 

아래는 실행 결과 입니다.

조촐하네요;;;

 

 

간단하게 나마 Attribute에 대해서 알아봤는데요.

Attribute는 C#에서 생각보다 많이 사용하게 되니까 알아두시면 좋고, 직접 구현해서 사용하면 성숙한 프로그래머가 된듯한 느낌도 들것 입니다~

'In to the C#' 카테고리의 다른 글

[C#] Task의 작업완료  (2) 2014.01.26
[C#] Action, Func 그리고 Task  (0) 2014.01.26
Lazy Initialization  (0) 2014.01.20
BookSleeve - Pipelined .NET bindings for redis  (0) 2014.01.17
Delegates와 Serialization  (0) 2014.01.17