C#/C# 교과서

[C# 교과서] 46~47. 특성과 리플렉션, 개체와 개체 지향 프로그래밍

서니션 2023. 1. 30. 22:44
728x90
반응형

Obsolete 특성

[Obsolete] void OldMember() => Console.WriteLine("Old Method");

OldMember(); // 하면 밑줄이 생기고 마우스를 올리면 경고 메시지가 표시

Obsolete 특성은 라이브러리 또는 프레임워크를 제작할 때 기존 하위 호환성을 위해 코드를 남겨 놓지만, Obsolete 특성이 적용된 메서드는 사용하지 않도록 권장하는 목적이 강함


특성의 매개변수

  • 위치 매개변수 : 특성에 전달되는 매개변수는 위치에 따라 구분됨
  • 이름 매개변수 : 특성에 구현된 속성 또는 필드에 값을 전달할 때 사용

Conditional 특성

특정 기호에 따라 실행 여부 결정

[Conditional("DEBUG")]
static void DebugMethod() => Console.WriteLine("디버그 환경에서만 표시");

[Conditional("RELEASE")]
static void ReleaseMethod() => Console.WriteLine("릴리스 환경에서만 표시");

비주얼 스튜디오의 도구 모음은 Debug와 Release를 구분 지을 수 있는 드롭다운 리스트를 제공함.

이를 사용하여 기호를 제공할 수 있음.


특성을 사용하여 메서드 호출 정보 얻기

메서드의 매개변수 앞에 [CallerMemberName], [CallerFilePath], [CallerLineNumber] 등 특성을 사용하여 메서드를 호출한 호출자 정보를 얻을 수 있음


Attribute 클래스를 상속하여 사용자 지정 특성 만들기

using System;

public class SampleAttribute : Attribute
{
	public SampleAttribute() => Console.WriteLine("사용자 지정 특성 사용됨");
}

[Sample] // 줄여서 표현
public class CustomAttributeTest { } // 적용

class AttributePRactice
{
	static void Main()
	{
		Attribute.GetCustomAttributes(typeof(CustomAttributeTest));
	}
}

리플렉션

리플렉션은 동적으로 특정 어셈블리 또는 형식에 대한 메타데이터를 Type개체로 반환하는 것을 의미.

리플렉션을 사용하면 특성 정보를 얻거나 동적으로 특정 형식을 로드하여 사용 가능


특정 속성에 적용된 특성 읽어 오기

using System;
using System.Reflection;

namespace ReflectionGetproperty
{
	class Person
    {
    	[Obsolete] public string Name { get; set; }
    }
    
    class ReflectionGetProperty
    {
    	static void Main()
        {
        	// Name 속성의 정보 얻기
            PropertyInfo pi = typeof(Person).GetProperty("Name");
            
            // Name 속성에 적용된 특성 읽어 오기
            object[] attributes = pi.GetCustomAttributes(false);
            foreach (var attr in attributes)
            {
            	// 특성의 이름들 출력
                Console.WriteLine("{0}", attr.GetType().Name);
            }
        }
    }
}

Type 개체의 GetProperty() 메서드로 특정 속성 정보를 얻고, 다시 GetCustomAttributes() 메서드로 특성 정보를 얻음


개체 지향 프로그래밍 소개

개체 지향 프로그래밍의 목적

- 프로그램을 분석하기 쉬워짐

- 프로그램 유지보수가 쉬워짐

- 프로그램의 특정 기능 재사용 가능


개체?

클래스를 사용하여 새로운 형식을 정의하고, 개체는 데이터와 기능을 숨기는 캡슐화 기능 제공

728x90
반응형