1️⃣ Field(필드)

✔ 클래스 내부에서 데이터를 저장하는 변수

🔹 특징

  • 클래스 내부에서 직접 값을 저장하는 변수.
  • 메모리에 직접 할당되며, 데이터를 저장하는 가장 기본적인 방식.
  • 보통 **private 또는 protected**으로 선언하여 외부에서 직접 접근하지 못하도록 함.

🛠 예제

class Person
{
    private string name; // 필드
    private int age; // 필드
}
  • name, age는 클래스 내부에서 데이터를 저장하는 필드.
  • 직접 접근 불가능 (private이므로).

🔹 필드 사용

class Person
{
    private string name;
    private int age;

    public Person(string name, int age)
    {
        this.name = name;  // 필드에 값 할당
        this.age = age;
    }

    public void PrintInfo()
    {
        Console.WriteLine($"이름: {name}, 나이: {age}");  // 필드 사용
    }
}

🔹 필드의 단점

  • 데이터를 직접 변경할 수 있기 때문에 캡슐화(encapsulation) 원칙을 위반할 가능성이 있음.
  • 유효성 검사, 보안 체크 등의 로직을 추가할 수 없음.

2️⃣ Property(속성)

✔ 필드를 감싸서 안전하게 접근할 수 있도록 하는 메서드 기반의 멤버

🔹 특징

  • Getter, Setter를 제공하여 필드 값을 읽거나 변경할 수 있음.
  • **캡슐화(Encapsulation)**를 통해 외부에서 제어된 접근을 제공.
  • 필요하면 데이터 검증, 로그 기록 등의 추가 로직을 포함 가능.

🛠 예제

class Person
{
    private string name;  // 필드

    public string Name  // 속성
    {
        get { return name; }  // Getter
        set { name = value; } // Setter
    }
}

🔹 속성 사용

Person p = new Person();
p.Name = "Alice";   // Setter 호출
Console.WriteLine(p.Name);  // Getter 호출 (출력: Alice)

🔹 속성의 장점

 

  • 필드와 달리 보안 & 유효성 검사 가능
    class Person
    {
        private int age;
    
        public int Age
        {
            get { return age; }
            set
            {
                if (value < 0) throw new ArgumentException("나이는 0 이상이어야 합니다.");
                age = value;
            }
        }
    }

 
  • 객체 지향 프로그래밍 원칙(OOP)과 잘 맞음.
  • 자동 속성을 활용하여 코드 간결화 가능:public string Name { get; set; } // 자동 구현 속성
public string Name { get; set; } // 자동 구현 속성




3️⃣ Attribute(특성)

✔ 메타데이터(추가 정보)를 클래스, 메서드, 속성 등에 부여하는 기능

🔹 특징

  • 컴파일러나 런타임에 특정 정보를 제공하는 메타데이터.
  • 클래스, 메서드, 속성, 필드 등에 추가 정보를 붙일 수 있음.
  • **리플렉션(Reflection)**을 사용하여 런타임에 정보를 읽을 수 있음.

🛠 예제

using System;

[Obsolete("이 메서드는 더 이상 사용되지 않습니다.")]
public void OldMethod()
{
    Console.WriteLine("구버전 메서드입니다.");
}
  • [Obsolete] **특성(Attribute)**을 붙이면, 이 메서드가 더 이상 사용되지 않음을 경고.

🔹 특성 사용

class Person
{
    [System.ComponentModel.Description("사용자의 이름")]
    public string Name { get; set; }
}
  • Description 특성(Attribute)을 추가하여 메타데이터 정보를 추가.

🔹 리플렉션(Reflection)으로 읽기

using System;
using System.Reflection;

class Program
{
    static void Main()
    {
        PropertyInfo prop = typeof(Person).GetProperty("Name");
        var attr = (System.ComponentModel.DescriptionAttribute)Attribute.GetCustomAttribute(prop, typeof(System.ComponentModel.DescriptionAttribute));
        Console.WriteLine(attr.Description);  // 출력: 사용자의 이름
    }
}

🔹 자주 사용되는 특성

특성(Attribute)설명
[Obsolete] 사용되지 않는 메서드/클래스를 표시
[Serializable] 객체 직렬화를 허용
[DllImport] P/Invoke를 사용하여 DLL을 로드
[Description] 설명을 추가하는 속성
[Required] 데이터 유효성 검사 (ASP.NET)

🔎 정리 (차이점 비교)

개념설명사용 목적
Field (필드) 클래스 내부에서 데이터를 저장하는 변수 데이터 저장 (직접 접근 X)
Property (속성) 필드를 감싸서 안전하게 접근하도록 하는 메서드 기반 멤버 데이터 캡슐화검증
Attribute (특성) 클래스, 메서드, 속성 등에 메타데이터 제공 추가 정보 제공 (런타임 활용 가능)

🚀 결론

  • Field는 가장 기본적인 데이터 저장 방법이지만 보안 & 유효성 검사 X.
  • Property는 필드를 보호하면서 안전한 접근을 제공하며, getter/setter를 활용하여 검증 가능.
  • Attribute는 클래스나 메서드 등에 추가 정보를 제공하는 메타데이터 역할.

C#에서는 필드는 보통 private로 두고, 속성을 통해 외부에서 접근하도록 구현하는 것이 일반적입니다. 또한, 특성을 사용하면 코드의 의미를 명확하게 하거나, 런타임에 필요한 정보를 제공할 수 있습니다. 🚀

+ Recent posts