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로 두고, 속성을 통해 외부에서 접근하도록 구현하는 것이 일반적입니다. 또한, 특성을 사용하면 코드의 의미를 명확하게 하거나, 런타임에 필요한 정보를 제공할 수 있습니다. 🚀
'C#(.Net)' 카테고리의 다른 글
[시작하세요 C# 12 프로그래밍 ] #5 C# 1.0 완성하기 #1 (0) | 2025.03.21 |
---|---|
[시작하세요 C# 12 프로그래밍 ] #4 CSharp 객체 지향 문법 3 (1) | 2025.03.19 |
[시작하세요 C# 12 프로그래밍 ] #4 CSharp 객체 지향 문법 2 (0) | 2025.03.16 |
[시작하세요 C# 12 프로그래밍 ] #4 CSharp 객체 지향 문법 (0) | 2025.03.10 |
[시작하세요 C# 12 프로그래밍 ] #3 CSharp 기초 (0) | 2025.03.04 |