C#교과서 마스터하기 34. 특성과 리플렉션

min seung moon·2021년 7월 14일
0

C#

목록 보기
36/54

https://www.youtube.com/watch?v=oWoclcZhcUQ&list=PLO56HZSjrPTB4NxAsEP8HRk6YKBDLbp7m&index=69

1. 특성(Attribute) & 리플렉션(Reflection)

01. 특성(Attribute)

  • 프로그램에서 형식, 멤버 및 다른 엔터티에 대한 추가 선언 정보를 지정 가능
    • [어노테이션(메시지)]
  • 자동차 튜닝
  • CLSCompliant
    • 어셈블리의 모든 형을 CLS에 맞춰 사용
  • Obsolete
    • 사용할 수 없는 요소라는 것을 나타냄
  • Conditional
    • 전처리기 식별자에 의해 실행 여부를 결정
  • DllImport
    • 비관리 코드 형태로 실행되는 메서드를 나타냄
  • Dispid
    • COM의 DISpatch ID를 나타냄
  • Serializable
    • 클래스 또는 구조체가 직렬화할 수 있음을 나타냄
  • Transaction
    • 트랜잭션이 무시되거나 지원 가능한가를 나타냄
  • Conditional
    • 둘 중 하나가 무시 되거나 다른 형식에 적용 하는 경우 컴파일러 경고 또는 오류 메시지가 생성

02. 리플렉션(Reflection)

  • CLR은 자기 자신에 대한 내용을 노출시켜주는 API를 제공
  • System.Type으로 리플렉션을 구현
  • 리플렉션으로 클래스의 멤버 가져오기
  • 자동차 전시회
    • 리플렉션(반사?)
      - 광택이 적용된 럭셔리 자동차들

2. 프로젝트

01. Obsolete

  • 더 이상 사용하지 않는 프로그램 요소를 표시, 상속 X
using System;
using static System.Console;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;

namespace testProject
{
    
    class Car
    {
        // 특성(어노테이션), 더 이상 사용하지 않는 프로그램 요소를 표시, 상속 X
        [Obsolete("다음 버전에 제거될 예정이니 Auto()를 사용하세요.")] 
        public void Manual() => WriteLine("수동 운전");
        public void Auto() => WriteLine("자동 운전");


    }

    class Program
    {
        static void Main(string[] args)
        {
            Car car = new Car();
            car.Manual();
            car.Auto();
        }
    }
}

02. Conditional

  • 둘 중 하나가 무시 되거나 다른 형식에 적용 하는 경우 컴파일러 경고 또는 오류 메시지가 생성
using System;
using static System.Console;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;

namespace testProject
{
    
    class Car
    {
        // 특성(어노테이션), 더 이상 사용하지 않는 프로그램 요소를 표시, 상속 X
        [Obsolete("다음 버전에 제거될 예정이니 Auto()를 사용하세요.")] 
        public void Manual() => WriteLine("수동 운전");
        public void Auto() => WriteLine("자동 운전");

        // 둘 중 하나가 무시 되거나 다른 형식에 적용 하는 경우 컴파일러 경고 또는 오류 메시지가 생성
        [Conditional("DEBUG")]
        public void Test() => WriteLine("테스트 운전");

    }

    class Program
    {
        static void Main(string[] args)
        {
            Car car = new Car();
            car.Manual();
            car.Auto();
            car.Test();
        }
    }
}



03. 전처리기 지시문 적용

  • 실제 컴파일이 시작되기 전에 컴파일러에게 특별한 명령을 미리 처리하도록 지시하는 것

-1. before

-2. after

04. 사용자 정의 특성

#define RELEASE

using System;
using static System.Console;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;

namespace testProject
{
    public class LuxuryAttribute : Attribute {
        public LuxuryAttribute() => WriteLine("럭셔리!!!");
    }

    // [LuxuryAttribute]
    [Luxury]
    class Car
    {
        // 더 이상 사용하지 않는 프로그램 요소를 표시, 상속 X
        [Obsolete("다음 버전에 제거될 예정이니 Auto()를 사용하세요.")] 
        public void Manual() => WriteLine("수동 운전");
        public void Auto() => WriteLine("자동 운전");

        // 둘 중 하나가 무시 되거나 다른 형식에 적용 하는 경우 컴파일러 경고 또는 오류 메시지가 생성
        [Conditional("DEBUG")]
        public void Test() => WriteLine("테스트 운전1");

        [Conditional("RELEASE")]
        public void Test2() => WriteLine("테스트 운전2");

    }

    class Program
    {
        static void Main(string[] args)
        {
            Car car = new Car();
            car.Manual();
            car.Auto();
            car.Test();
            car.Test2();
        }
    }
}


05. 리플렉션

  • 특정한 클래스에 정의된 특성을 읽어온다
#define RELEASE

using System;
using static System.Console;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;

namespace testProject
{
    public class LuxuryAttribute : Attribute {
        public LuxuryAttribute() => WriteLine("럭셔리!!!");
    }

    // [LuxuryAttribute]
    [Luxury]
    class Car
    {
        // 더 이상 사용하지 않는 프로그램 요소를 표시, 상속 X
        [Obsolete("다음 버전에 제거될 예정이니 Auto()를 사용하세요.")] 
        public void Manual() => WriteLine("수동 운전");
        public void Auto() => WriteLine("자동 운전");

        // 둘 중 하나가 무시 되거나 다른 형식에 적용 하는 경우 컴파일러 경고 또는 오류 메시지가 생성
        [Conditional("DEBUG")]
        public void Test() => WriteLine("테스트 운전1");

        [Conditional("RELEASE")]
        public void Test2() => WriteLine("테스트 운전2");

    }

    class Program
    {
        static void Main(string[] args)
        {
            Car car = new Car();
            // 리플렉션, 특정한 클래스에 정의된 특성을 읽어온다
            Attribute.GetCustomAttributes(typeof(Car));
            typeof(Car).GetCustomAttributes(false);
            car.Manual();
            car.Auto();
            car.Test();
            car.Test2();
        }
    }
}


06. 리플렉션으로 클래스 읽어보기

  • 모든 클래스, 모든 구조체, 모든 열거형 ...을 다읽어올 수 있는 메서드 제공
#define RELEASE

using System;
using static System.Console;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Diagnostics;
using System.Reflection;

namespace testProject
{
    public class LuxuryAttribute : Attribute {
        public LuxuryAttribute() => WriteLine("럭셔리!!!");
    }

    // [LuxuryAttribute]
    [Luxury]
    class Car
    {
        // 더 이상 사용하지 않는 프로그램 요소를 표시, 상속 X
        [Obsolete("다음 버전에 제거될 예정이니 Auto()를 사용하세요.")] 
        public void Manual() => WriteLine("수동 운전");
        public void Auto() => WriteLine("자동 운전");

        // 둘 중 하나가 무시 되거나 다른 형식에 적용 하는 경우 컴파일러 경고 또는 오류 메시지가 생성
        [Conditional("DEBUG")]
        public void Test() => WriteLine("테스트 운전1");

        [Conditional("RELEASE")]
        public void Test2() => WriteLine("테스트 운전2");

    }

    class Program
    {
        static void Main(string[] args)
        {
            Car car = new Car();
            // 리플렉션, 특정한 클래스에 정의된 특성을 읽어온다
            Attribute.GetCustomAttributes(typeof(Car));
            typeof(Car).GetCustomAttributes(false);
            car.Manual();
            car.Auto();
            car.Test();
            car.Test2();

            // 리플렉션, 모든 클래스, 모든 구조체, 모든 열거형 ...을 다읽어올 수 있는 메서드 제공
            Car carType = new Car();
            Type myCar = carType.GetType();
            MethodInfo info =  myCar.GetMethod("Auto");
            info.Invoke(carType, null);
        }
    }
}

profile
아직까지는 코린이!

0개의 댓글