[동영상]C# 어트리뷰트(Attribute) Conditional, Obsolete, DllImport 사용자정의 Attribute작성, C#교육, C#학원, C#동영상, 닷넷학원, 닷넷교육
http://ojc.asia/bbs/board.php?bo_table=LecCsharp&wr_id=405
ojc.asia
https://www.youtube.com/watch?v=QXyOvFGp-rE&list=PLxU-iZCqT52DJyR6gqJy0MCL8RiTVXdos&index=16


어트리뷰트(Attribute)
Conditional, Obsolete, DllImport
사용자정의 Attribute작성
C# 어트리뷰트(Attribute)
- Attribute는 코드에 부가적인 정보(메타 데이터)를 기록하고 읽을 수 있는 기술이다.
- 어트리뷰트는 클래스안에 메타정보를 포함시킬 수 있는 기술로써 클래스, 데이터 구조, 열거자 그리고 어셈블리와 같은 프로그래밍적 요소들의 실행 시 행동에 대한 정보를 기술할 수 있다.
- 다음과 같은 프로그래밍 요소에 대해 Attribute를 사용 할 수 있다.
어셈블리, 모듈, 클래스, 구조체, 열거형 변수, 생성자, 메소드, 프로퍼티, 필드, 이벤트, 인터페이스, 파라미터, 반환 값, 델리게이트
- 어트리뷰트 역시 클래스의 일종이며, Attribute 문법은 다음과 같다.
[Attribute이름(positional_parameter, name_parameter = value, …) ]
- 파라미터에는 두 종류가 있는데 첫번째는 위치지정 파라미터로 반드시 입력되어져야 하는데 어트리뷰트 클래스내 생성자의 인자 이므로 필수 파라미터 이다. 명명파라미터(name_parameter)는 꼭 필요하지는 않다. 어트리뷰트 안에 추가적인 정보를 넣을 때 이용한다.
[AdditionalInfo(“2004-01-01”)] ( = [AdditionalInfoAttribute(“2004-01-01”)] )
public class Test { ..}
원하는 프로그래밍 요소 위에 Attribute를 사용하면 된다.
Conditional Attribute
C# 디버깅을 지원하기 위해 Conditional Attribute를 사용 할 수 있다. Conditional Attribute는 사용자가 정의한 값에 의해서 해당 메소드를 실행하도록 한다. 메소드 위만 붙일 수 있다.
Conditional Attribute는 클래스나 구조체 안에 있는 메소드에서만 사용 할 수 있다. 또 그 메소드는 void형 이어야 한다.
#define SOUNDCARD
#define SPEAKER
using System;
using System.Diagnostics;
class Test
{
[Conditional ("SOUNDCARD")]
static void isSound() { isSpeaker(); }
[Conditional ("SPEAKER")]
static void isSpeaker() {
Console.WriteLine("음악을 들을 수 있습니다...");
}
static void Main()
{
isSound();
}
}
Obsolete Attribute
C# 디버깅을 지원하기 위해 Obsolete Attribute를 사용 할 수 있다. 더 이상 사용하지 않는 클래스, 함수, 필드 앞에 Obsolete Attribute를 붙이면 된다. 이렇게 하면 해당 메소드를 호출할 때 더 이상 사용하지 않는 메소드라는 경고 메시지가 뜬다.
class ObsoleteTest
{
[Obsolete] //사용되지 않는다는 경고 메시지 출력
public void OldMethod1() { }
[Obsolete("추가메시지")] //사용되지 않는다는 경고 메시지 + 추가메시지 출력
public void OldMethod2() { }
//더이상 사용하지 않는다는 경고 메시지 + 추가메시지 출력 후 true면 컴파일 오류로 컴파일 오류
[Obsolete("추가메시지", true)]
public void OldMethod3() { }
}
class Test
{
static void Main()
{
ObsoleteTest o = new ObsoleteTest();
o.OldMethod1(); //초록색 밑줄과 함께 사용되지 않는다는 경고 메시지 출력
o.OldMethod2(); //초록색 밑줄과 함께 사용되지 않는다는 경고 메시지 + 추가메시지 출력
o.OldMethod3(); //붉은색 밑줄과 함께 사용되지 않는다는 경고 메시지 + 추가메시지 출력, 컴파일불가
}
}
DllImport Attribute
DllImport Attribute는 C#안에서 “Unmanaged Code”를 사용 할 수 있게 한다. Unmanaged Code란 닷넷 환경 밖에서 개발된 코드를 가리킨다. DllImport Attribute는 System.Runtime.InteropServices 네임스페이스 안에 정의되어 있다. 사용방법은 위치지정 파라미터로 사용할 DLL 파일을 인자로 넘겨 주면 된다.
using System.Runtime.InteropServices;
class Test
{
//User32.dll 파일안의 MessageBox 함수를 불러와서 사용하는 예이다.
//DllImport Attribute를 이용하여 사용할 코드가 포함되어 있는 DLL을 넘겨주고
// extern 키워드를 통해 사용하려고 하는 메소드가 외부에 있음을 알린다.
//이렇게 하면 닷넷 환경 밖에서 개발된 코드들도 C#안에서 쓸 수 있다.
[DllImport("User32.Dll")]
public static extern int MessageBox(int h, string m, string c, int type);
static void Main() { MessageBox(0, "Hello!", "In C#", 0); }
}
사용자 정의 어트리뷰트(Custom Attribute)의 정의
- 어트리뷰트의 범위 지정
앞에서 Conditional Attribte는 메소드에만 붙일 수 있다고 했다. 그렇다면 사용자가 만든 어트리뷰트에 대해 특정한 곳에만 붙일 수 있게 하는 방법은 없을까? AttributeUsage를 이용해서 사용자가 정의한 데이터 형에만 어트리뷰트를 붙일 수 있다.
[AttributeUsage(AttrbuteTargets.Method)] public class AdditionalInfoAttribute : System.Attribute { … } |
AttributeUsage 역시 Attrbute 이며 사용자가 정의할 어트리뷰트 앞에 사용됨으로써 범위를 지정 할 수 있다. Method 이외에 AttrbuteTargets.Class, AttrbuteTargets.Delegate, AttrbuteTargets.Interface, AttrbuteTargets.Property, AttrbuteTargets.Constructor 등을 사용 할 수 있다.
만약 여러 개의 데이터 형에 붙이려면 ‘|’를 이용하면 된다.
[AttributeUsage(AttrbuteTargets.Method | AttrbuteTargets.Delegate)]
public class AdditionalInfoAttribute : Attribute { … }
또한 모든 데이터 형에 붙이는 것을 가능하게 하려면 AttrbuteTargets.All 이라고 해 주면 된다.
- 어트리뷰트 클래스 선언
간단히 클래스에 대한 제작자, 최신 버전을 다운 받을 수 있는 곳 등의 정보를 담을 수 있는 어트리뷰트를 만들어 보도록 하겠다. 다른 클래스를 만드는 것처럼 비슷하게 클래스를 작성하면 어트리뷰트가 구현된다. 모든 어트리뷰트는 System.Attribute로 부터 상속받는다. 즉 보통 클래스를 선언하는 것과 같은 방법으로 선언하고 다만 System.Attribute로부터 상속을 받으면 그 클래스가 어트리뷰트가 되는 것이다. 일반 클래스와 구분하기 위해 접미사로 ‘Attribute’를 붙일 것을 권고한다.
어트리뷰트도 클래스이므로 생성자가 존재한다. 다만 어트리뷰트는 하나의 생성자만 가질 수 있다. 즉 생성자 오버로딩이 불가능하다. 그럼 추가로 받아야 하는 정보들은 어떻게 처리할까? 어트리뷰트에서는 생성자에서 꼭 집어 넣어야 하는 데이터는 위치지정 파라미터로 받고 부가적인 데이터는 명명 파라미터를 통해 받아들임으로써 문제를 해결 한다.
[사용자 정의 어트리뷰트 예제]
using System;
namespace AttrTest
{
[AttributeUsage(AttributeTargets.Class)]
public class AdditionalInfoAttribute : Attribute
{
//생성자에 있는 하나의 인자는 위치지정 파라미터 이다.
//위치지정 파라미터는 클래스에 어트리뷰트를 붙일때 반드시 넘겨 줘야 한다.
public AdditionalInfoAttribute(string name) => Name = name;
public string Name
{
get; private set;
}
public string Download
{
get; set;
}
}
[AdditionalInfoAttribute("오라클자바커뮤니티", Download = "http://ojc.asia")]
class Test { }
class AttributeTest
{
static void Main()
{
Type type = typeof(Test);
foreach (Attribute attr in type.GetCustomAttributes(true))
{
AdditionalInfoAttribute info = attr as AdditionalInfoAttribute;
if (info != null)
Console.WriteLine("Name={0},Download ={1}",
info.Name,info.Download);
}
}
}
}
Name=오라클자바커뮤니티,Download =http://ojc.asia
// 아래의 경우처럼 위치지정 파라미터는 생성자에 값을 그대로 전달하지만 명명 파라미터는 파라미터 이름에 값을 대입하여 생성자에 넘겨야 한다.
[AdditionalInfoAttribute(“jclee”,’2018-01-01”, Download = “http://ojc.asia”)]
class Test { … }
#어트리뷰트, #닷넷어트리뷰트, #닷넷동영상, #시샵교육, #시샵학원, #Attribute, #DllImport, #Conditioanl, #Obsolete, #시샵학원, #시샵동영상,
어트리뷰트, 닷넷어트리뷰트, 닷넷동영상, 시샵교육, 시샵학원, Attribute, DllImport, Conditioanl, Obsolete, 시샵학원, 시샵동영상,