Creative Commons License

Microsoft .NET

닷넷!시작하기
닷넷! Ver 2.0~
닷넷!스킬업
웹개발
윈폼개발
실용모듈개발
Tip & Tech
하루 한 문법

Microsoft .NET 개발자들을 위한 공간입니다. 기초강의에서 부터 고급 기술 정보 및 팁등을 다루도록 하겠습니다.

.

닷넷!스킬업

닷넷 기술을 조금 더 깊이 다루고자 합니다. 특정 주제를 정하지 않고 이슈 발생 시 마다 체계적으로 정리하여 공유하겠습니다. 이전 자료를 옮겨온 곳이기도 합니다.

[Attribute] - Attribute(특성) 기본

작성자 : 박종명
최초 작성일 : 2008-05-30 (금요일)
최종 수정일 : 2008-05-30 (금요일)
조회 수 : 3752

공식 번역으로 특성 이라고 해석되는 Attribute 에 대해 살펴 보자.

우선 간략한 개요를 정리한다(MOC 기준 개요)

 

* Attribute 개요

1) 실행환경(런타임)에 특정 정보를 전달하는 목적으로 사용되는 선언적인 태그이다

2) 어셈블리의 메타 데이터에 함께 저장된다.

 

개요만 봐서는 선뜻 내용을 파악하기 힘들다.

실제로 Attribute 가 어떻게 사용되고 직접 정의해서 사용해 보는 것이 이해하기가 쉬울 것이다. 일단, Attribute 는 어셈블리(자체) 또는 어셈블리에 포함된 elements(클래스,메서드,속성 등)에 적용할 수 있는 추가적인 정보라고 알아 두자.

이 추가적인 정보란 실제로 명사 information 으로써의 의미도 있지만 어셈블리의 실행 시점에
응용프로그램의 동작에 특정한 영향(특정 작업 수행)을 주는 것을 의미하기도 한다.

 

닷넷은 많은 내장 Attribute 를 제공한다.
우선, 어셈블리 자체에 대한 추가적인 정보 지정용으로 제공하는 Attribute 에 대해 살펴보자

 

* AssemblyInfo.cs
프로젝트를 새로 생성하면 VS 가 자동으로 생성하는 파일 중 AssemblyInfo.cs 라는 파일이 있다.

어셈블리 자체에 특성을 추가하기 위한 파일이다.

대표적으로 어셈블리의 버전관련 정보를 추가 하기 위한 아래와 같은 특성이 있다

 

[assembly: AssemblyTitle("(타이틀)어트리뷰트테스트용어셈블리")]

[assembly: AssemblyDescription("어트리뷰트를테스트하기위한 어셈블리이다")]

[assembly: AssemblyCompany("()회사")]

[assembly: AssemblyProduct("DemoForAttrubuteDemo")]

[assembly: AssemblyCopyright("MKEX")]

[assembly: AssemblyTrademark("우리상표")]  

 

이 어트리뷰트 들은 아래와 같이 어셈블리 등록정보(속성) 에서 확인할 수 있다.




또한 어셈블리의 버전번호와 어셈블리의 전자서명을 위한 키 파일 관련 정보를 저장하는 어트리뷰트도 있다. 
어트리뷰트는 어셈블리의 메타데이터와 함께 저장된다고 하였다.
위 어셈블리의 메타데이터를 확인 해 보면 아래와 같은 부분을 확인할 수 있다

 

.assembly AttributeDemo1

{

  .custom instance void [mscorlib]System.Reflection.AssemblyCopyrightAttribute::.ctor(string)

  = ( 01 00 04 4D 4B 45 58 00 00 )                      // ...MKEX..

  .custom instance void [mscorlib]System.Reflection.AssemblyKeyNameAttribute::.ctor(string)

  = ( 01 00 00 00 00 )

  .custom instance void [mscorlib]System.Reflection.AssemblyKeyFileAttribute::.ctor(string)

  = ( 01 00 00 00 00 )

  .custom instance void [mscorlib]System.Reflection.AssemblyDelaySignAttribute::.ctor(bool)

  = ( 01 00 00 00 00 )

  .custom instance void [mscorlib]System.Reflection.AssemblyTrademarkAttribute::.ctor(string)

  = ( 01 00 0C EC 9A B0 EB A6 AC EC 83 81 ED 91 9C 00  00 )

  .custom instance void [mscorlib]System.Reflection.AssemblyConfigurationAttribute::.ctor(string)

  = ( 01 00 06 EA B5 AC EC 84 B1 00 00 )

  // --- 다음 사용자 지정 특성이 자동으로 추가됩니다. 주석으로 처리하십시오. -------

  //  .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(bool,bool)

  = ( 01 00 01 01 00 00 )

  .custom instance void [mscorlib]System.Reflection.AssemblyCompanyAttribute::.ctor(string)

  = ( 01 00 0B 28 EC A3 BC 29 ED 9A 8C EC 82 AC 00 00 ) // ...(...)........

  .custom instance void [mscorlib]System.Reflection.AssemblyProductAttribute::.ctor(string)

  = ( 01 00 14 44 65 6D 6F 46 6F 72 41 74 74 72 75 62   // ...DemoForAttrub

   75 74 65 44 65 6D 6F 00 00 )                      // uteDemo..

  .custom instance void [mscorlib]System.Reflection.AssemblyDescriptionAttribute::.ctor(string) =

  ( 01 00 3A EC 96 B4 ED 8A B8 EB A6 AC EB B7 B0 ED   // ..:.............

    8A B8 EB A5 BC ED 85 8C EC 8A A4 ED 8A B8 ED 95

    98 EA B8 B0 EC 9C 84 ED 95 9C 20 EC 96 B4 EC 85   // .......... .....

    88 EB B8 94 EB A6 AC EC 9D B4 EB 8B A4 00 00 )

  .custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string)

  = ( 01 00 32 28 ED 83 80 EC 9D B4 ED 8B 80 29 EC 96   // ..2(.........)..

  B4 ED 8A B8 EB A6 AC EB B7 B0 ED 8A B8 ED 85 8C

  EC 8A A4 ED 8A B8 EC 9A A9 EC 96 B4 EC 85 88 EB

  B8 94 EB A6 AC 00 00 )

  .hash algorithm 0x00008004

  .ver 1:0:2579:40512

}

 

앞서 [assembly: AssemblyProduct("DemoForAttrubuteDemo")] 로 지정한 특성이 16진수로 저장되어 있음이 확인 된다. 자세하게 말하자면 01 00 14 다음의 16진수들이 DemoForAttrubuteDemo 에 해당하는 ASCII 코드이다.기타 다른 특성 정보들 역시 확인 가능하다.

 

또한 System.Reflection.AssemblyProductAttribute::.ctor(string) 구문에서 유추 할 수 있는 것은 AsemblyProduct 라는 특성은 결국 AssemblyProductAttribute 클래스의 생성자(ctor) 호출하여 객체를 생성하는 것을 알 수 있다. 
 

그렇다. 어트리뷰트는 결국 클래스이며 어트리뷰트가 선언되면 그 어트리뷰트에 해당하는 클래스의 인스턴스가 생성된다는 것이다.

 

결국 [assembly: AssemblyProduct("DemoForAttrubuteDemo")] 이 구문은AssemblyProductAttribute 클래스의 string 매개변수 하나를 가진 생성자를 호출하는 것이 된다

 

 


*
닷넷 내장 Attribute

앞서 살펴본 어셈블리 차원의 어트리뷰트 말고도 닷넷은 수 많은 어트리뷰트를 제공한다.

대표적으로 몇 가지만 살펴보자

1) [WebMethod]
웹 서비스내의 메서드에 이 특성을 선언하면 원격 웹 클라이언트에서
 해당 메서드를 호출할 수 있게 한다

2) [DllImport]
UnManaged Code
에 정의된 함수를 Managed Code 에서 호출할 수 있게 한다


3)
 [Serializable]
해당 element 가 직렬화 가능하도록 한다

4) [Conditional] 
정 기호(전처리지시어 및 조건부컴파일 상수)의 정의여부 에 따라 컴파일을 달리 한다.

5) [STAThread]   
응용 프로그램에 대한 COM 스레딩 모델이 STA(단일 스레드 아파트)인지 여부를 나타낸다

 

이 외에도 닷넷이 제공하는 어트리뷰트는 거의 200여개에 달한다.

 

* 기타 특징

1) 하나의 element(클래스,메서드,속성등)에 하나이상의 어트리뷰트의 선언이 가능하다

2) 어트리뷰트의 적용 범위를 명시적으로 지정해야 할 때도 있다([assembly:AssemblyVersion("1.0.*")])

3) 닷넷이 제공하는 내장 어트리뷰트 외에 사용자가 직접 어트리뷰트를 정의하고 사용할 수 있다

 

다음 시간에는 내장 어트리뷰트 중 일부를 사용하여 어트리뷰트의 특징을 체험해 보자

* 참고  : 닷넷 내장 어트리뷰트 계층 구조

 

System.Object
   System.Attribute
      System.AttributeUsageAttribute
      System.CLSCompliantAttribute
      System.ComponentModel.AmbientValueAttribute
      System.ComponentModel.BindableAttribute
      System.ComponentModel.BrowsableAttribute
      System.ComponentModel.CategoryAttribute
      System.ComponentModel.DefaultEventAttribute
      System.ComponentModel.DefaultPropertyAttribute
      System.ComponentModel.DefaultValueAttribute
      System.ComponentModel.DescriptionAttribute
      System.ComponentModel.Design.Serialization.DesignerSerializerAttribute
      System.ComponentModel.Design.Serialization.RootDesignerSerializerAttribute
      System.ComponentModel.DesignerAttribute
      System.ComponentModel.DesignerCategoryAttribute
      System.ComponentModel.DesignerSerializationVisibilityAttribute
      System.ComponentModel.DesignOnlyAttribute
      System.ComponentModel.DesignTimeVisibleAttribute
      System.ComponentModel.EditorAttribute
      System.ComponentModel.EditorBrowsableAttribute
      System.ComponentModel.ImmutableObjectAttribute
      System.ComponentModel.InheritanceAttribute
      System.ComponentModel.InstallerTypeAttribute
      System.ComponentModel.LicenseProviderAttribute
      System.ComponentModel.ListBindableAttribute
      System.ComponentModel.LocalizableAttribute
      System.ComponentModel.MergablePropertyAttribute
      System.ComponentModel.NotifyParentPropertyAttribute
      System.ComponentModel.ParenthesizePropertyNameAttribute
      System.ComponentModel.PropertyTabAttribute
      System.ComponentModel.ProvidePropertyAttribute
      System.ComponentModel.ReadOnlyAttribute
      System.ComponentModel.RecommendedAsConfigurableAttribute
      System.ComponentModel.RefreshPropertiesAttribute
      System.ComponentModel.RunInstallerAttribute
      System.ComponentModel.ToolboxItemAttribute
      System.ComponentModel.ToolboxItemFilterAttribute
      System.ComponentModel.TypeConverterAttribute
      System.ContextStaticAttribute
      System.Diagnostics.ConditionalAttribute
      System.Diagnostics.DebuggableAttribute
      System.Diagnostics.DebuggerHiddenAttribute
      System.Diagnostics.DebuggerStepThroughAttribute
      System.Drawing.ToolboxBitmapAttribute
      System.EnterpriseServices.ApplicationAccessControlAttribute
      System.EnterpriseServices.ApplicationActivationAttribute
      System.EnterpriseServices.ApplicationIDAttribute
      System.EnterpriseServices.ApplicationNameAttribute
      System.EnterpriseServices.ApplicationQueuingAttribute
      System.EnterpriseServices.AutoCompleteAttribute
      System.EnterpriseServices.CompensatingResourceManager.ApplicationCrmEnabledAttribute
      System.EnterpriseServices.ComponentAccessControlAttribute
      System.EnterpriseServices.COMTIIntrinsicsAttribute
      System.EnterpriseServices.ConstructionEnabledAttribute
      System.EnterpriseServices.DescriptionAttribute
      System.EnterpriseServices.EventClassAttribute
      System.EnterpriseServices.EventTrackingEnabledAttribute
      System.EnterpriseServices.ExceptionClassAttribute
      System.EnterpriseServices.IISIntrinsicsAttribute
      System.EnterpriseServices.InterfaceQueuingAttribute
      System.EnterpriseServices.JustInTimeActivationAttribute
      System.EnterpriseServices.LoadBalancingSupportedAttribute
      System.EnterpriseServices.MustRunInClientContextAttribute
      System.EnterpriseServices.ObjectPoolingAttribute
      System.EnterpriseServices.PrivateComponentAttribute
      System.EnterpriseServices.SecureMethodAttribute
      System.EnterpriseServices.SecurityRoleAttribute
      System.EnterpriseServices.SynchronizationAttribute
      System.EnterpriseServices.TransactionAttribute
      System.FlagsAttribute
      System.LoaderOptimizationAttribute
      System.Management.Instrumentation.IgnoreMemberAttribute
      System.Management.Instrumentation.InstrumentationClassAttribute
      System.Management.Instrumentation.InstrumentedAttribute
      System.Management.Instrumentation.ManagedNameAttribute
      System.MTAThreadAttribute
      System.NonSerializedAttribute
      System.ObsoleteAttribute
      System.ParamArrayAttribute
      System.Reflection.AssemblyAlgorithmIdAttribute
      System.Reflection.AssemblyCompanyAttribute
      System.Reflection.AssemblyConfigurationAttribute
      System.Reflection.AssemblyCopyrightAttribute
      System.Reflection.AssemblyCultureAttribute
      System.Reflection.AssemblyDefaultAliasAttribute
      System.Reflection.AssemblyDelaySignAttribute
      System.Reflection.AssemblyDescriptionAttribute
      System.Reflection.AssemblyFileVersionAttribute
      System.Reflection.AssemblyFlagsAttribute
      System.Reflection.AssemblyInformationalVersionAttribute
      System.Reflection.AssemblyKeyFileAttribute
      System.Reflection.AssemblyKeyNameAttribute
      System.Reflection.AssemblyProductAttribute
      System.Reflection.AssemblyTitleAttribute
      System.Reflection.AssemblyTrademarkAttribute
      System.Reflection.AssemblyVersionAttribute
      System.Reflection.DefaultMemberAttribute
      System.Resources.NeutralResourcesLanguageAttribute
      System.Resources.SatelliteContractVersionAttribute
      System.Runtime.CompilerServices.AccessedThroughPropertyAttribute
      System.Runtime.CompilerServices.CompilationRelaxationsAttribute
      System.Runtime.CompilerServices.CompilerGlobalScopeAttribute
      System.Runtime.CompilerServices.CustomConstantAttribute
      System.Runtime.CompilerServices.DecimalConstantAttribute
      System.Runtime.CompilerServices.DiscardableAttribute
      System.Runtime.CompilerServices.IndexerNameAttribute
      System.Runtime.CompilerServices.MethodImplAttribute
      System.Runtime.CompilerServices.RequiredAttributeAttribute
      System.Runtime.InteropServices.AutomationProxyAttribute
      System.Runtime.InteropServices.BestFitMappingAttribute
      System.Runtime.InteropServices.ClassInterfaceAttribute
      System.Runtime.InteropServices.CoClassAttribute
      System.Runtime.InteropServices.ComAliasNameAttribute
      System.Runtime.InteropServices.ComCompatibleVersionAttribute
      System.Runtime.InteropServices.ComConversionLossAttribute
      System.Runtime.InteropServices.ComEventInterfaceAttribute
      System.Runtime.InteropServices.ComImportAttribute
      System.Runtime.InteropServices.ComRegisterFunctionAttribute
      System.Runtime.InteropServices.ComSourceInterfacesAttribute
      System.Runtime.InteropServices.ComUnregisterFunctionAttribute
      System.Runtime.InteropServices.ComVisibleAttribute
      System.Runtime.InteropServices.DispIdAttribute
      System.Runtime.InteropServices.DllImportAttribute
      System.Runtime.InteropServices.FieldOffsetAttribute
      System.Runtime.InteropServices.GuidAttribute
      System.Runtime.InteropServices.IDispatchImplAttribute
      System.Runtime.InteropServices.ImportedFromTypeLibAttribute
      System.Runtime.InteropServices.InAttribute
      System.Runtime.InteropServices.InterfaceTypeAttribute
      System.Runtime.InteropServices.LCIDConversionAttribute
      System.Runtime.InteropServices.MarshalAsAttribute
      System.Runtime.InteropServices.OptionalAttribute
      System.Runtime.InteropServices.OutAttribute
      System.Runtime.InteropServices.PreserveSigAttribute
      System.Runtime.InteropServices.PrimaryInteropAssemblyAttribute
      System.Runtime.InteropServices.ProgIdAttribute
      System.Runtime.InteropServices.StructLayoutAttribute
      System.Runtime.InteropServices.TypeLibFuncAttribute
      System.Runtime.InteropServices.TypeLibTypeAttribute
      System.Runtime.InteropServices.TypeLibVarAttribute
      System.Runtime.InteropServices.TypeLibVersionAttribute
      System.Runtime.Remoting.Messaging.OneWayAttribute
      System.Runtime.Remoting.Metadata.SoapAttribute
      System.Runtime.Remoting.Proxies.ProxyAttribute
      System.Security.AllowPartiallyTrustedCallersAttribute
      System.Security.Permissions.SecurityAttribute
      System.Security.SuppressUnmanagedCodeSecurityAttribute
      System.Security.UnverifiableCodeAttribute
      System.SerializableAttribute
      System.STAThreadAttribute
      System.ThreadStaticAttribute
      System.Web.Services.Configuration.XmlFormatExtensionAttribute
      System.Web.Services.Configuration.XmlFormatExtensionPointAttribute
      System.Web.Services.Configuration.XmlFormatExtensionPrefixAttribute
      System.Web.Services.Protocols.HttpMethodAttribute
      System.Web.Services.Protocols.MatchAttribute
      System.Web.Services.Protocols.SoapDocumentMethodAttribute
      System.Web.Services.Protocols.SoapDocumentServiceAttribute
      System.Web.Services.Protocols.SoapExtensionAttribute
      System.Web.Services.Protocols.SoapHeaderAttribute
      System.Web.Services.Protocols.SoapRpcMethodAttribute
      System.Web.Services.Protocols.SoapRpcServiceAttribute
      System.Web.Services.WebMethodAttribute
      System.Web.Services.WebServiceAttribute
      System.Web.Services.WebServiceBindingAttribute
      System.Web.UI.ConstructorNeedsTagAttribute
      System.Web.UI.ControlBuilderAttribute
      System.Web.UI.DataBindingHandlerAttribute
      System.Web.UI.ParseChildrenAttribute
      System.Web.UI.PartialCachingAttribute
      System.Web.UI.PersistChildrenAttribute
      System.Web.UI.PersistenceModeAttribute
      System.Web.UI.TagPrefixAttribute
      System.Web.UI.TemplateContainerAttribute
      System.Web.UI.ToolboxDataAttribute
      System.Web.UI.ValidationPropertyAttribute
      System.Xml.Serialization.SoapAttributeAttribute
      System.Xml.Serialization.SoapElementAttribute
      System.Xml.Serialization.SoapEnumAttribute
      System.Xml.Serialization.SoapIgnoreAttribute
      System.Xml.Serialization.SoapIncludeAttribute
      System.Xml.Serialization.SoapTypeAttribute
      System.Xml.Serialization.XmlAnyAttributeAttribute
      System.Xml.Serialization.XmlAnyElementAttribute
      System.Xml.Serialization.XmlArrayAttribute
      System.Xml.Serialization.XmlArrayItemAttribute
      System.Xml.Serialization.XmlAttributeAttribute
      System.Xml.Serialization.XmlChoiceIdentifierAttribute
      System.Xml.Serialization.XmlElementAttribute
      System.Xml.Serialization.XmlEnumAttribute
      System.Xml.Serialization.XmlIgnoreAttribute
      System.Xml.Serialization.XmlIncludeAttribute
      System.Xml.Serialization.XmlNamespaceDeclarationsAttribute
      System.Xml.Serialization.XmlRootAttribute
      System.Xml.Serialization.XmlTextAttribute
      System.Xml.Serialization.XmlTypeAttribute

 

 

이름
비밀번호
홈페이지
UN <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요