C#에서 프로퍼티는 필드와 메서드의 중간 형태로, 캡슐화를 유지하면서 객체의 데이터 접근을 더 직관적이고 안전하게 할 수 있도록 합니다. 이 글에서는 C# 프로퍼티의 기초 개념부터 심화 내용, 주의할 점, 사용법까지 모두 다룹니다.
1. 프로퍼티란 무엇인가?
프로퍼티는 객체의 필드에 대한 접근을 제어하는 방법입니다. 필드와는 달리 프로퍼티는 getter와 setter 메서드를 통해 값을 읽거나 쓸 수 있습니다. 프로퍼티는 메서드처럼 보이지 않고 필드처럼 사용되지만, 내부적으로는 메서드로 동작합니다.
public class Person
{
private string name; // 필드
// 프로퍼티
public string Name
{
get { return name; }
set { name = value; }
}
}
2. 자동 구현 프로퍼티
자동 구현 프로퍼티는 C# 컴파일러가 getter와 setter 메서드를 자동으로 생성해 줍니다. 이를 통해 코드가 간결해집니다.
public class Person
{
public string Name { get; set; } // 자동 구현 프로퍼티
}
기본 값 지정: 자동 구현 프로퍼티에 기본값을 설정할 수도 있습니다.
public class Person
{
public string Name { get; set; } = "Unknown";
}
3. 접근자 제한자
getter와 setter에 각기 다른 접근 제한자를 지정할 수 있습니다.
public class Person
{
public string Name { get; private set; } // set은 private
}
- 용도: 데이터를 외부에서는 읽을 수만 있게 하거나, 특정 클래스 내부에서만 수정할 수 있도록 할 때 유용합니다.
4. 읽기 전용 및 쓰기 전용 프로퍼티
읽기 전용 프로퍼티는 getter만 정의하고 setter를 제외하면 됩니다.
public class Person
{
private string id = Guid.NewGuid().ToString();
public string ID
{
get { return id; }
}
}
5. 표현식 본문 프로퍼티
간단한 프로퍼티의 경우 표현식 본문으로 작성할 수 있습니다.
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string FullName => $"{FirstName} {LastName}"; // 표현식 본문
}
설명
- => 기호는 람다 표현식에서 사용하는 것과 동일하게 동작하며, return 키워드 없이도 값을 반환합니다.
- 읽기 전용(get) 프로퍼티에 주로 사용되며, 더 간결하게 코드를 작성할 수 있습니다.
특징
- 코드의 가독성이 높아지고 유지보수가 쉬워집니다.
- 복잡한 로직을 포함하는 프로퍼티보다는 간단한 계산이나 문자열 조합 등에서 유용합니다.
필요에 따라 이 기능을 활용하면 코드를 깔끔하게 유지할 수 있습니다.
6. 프로퍼티 초기화
C# 6부터는 프로퍼티 초기화가 가능해졌습니다. 객체 생성 시 기본값을 설정할 수 있습니다.
public class Configuration
{
public int Timeout { get; set; } = 30;
}
7. readonly 키워드와 프로퍼티
C#에서는 readonly 키워드와 혼동하지 않아야 합니다. readonly는 필드에 적용되며, 프로퍼티의 읽기 전용 설정과 다릅니다.
public class Example
{
public readonly int Value = 10; // 필드에만 적용 가능
}
8. 속성 값 변경 시 이벤트 발생
프로퍼티 값이 변경될 때 특정 동작을 수행하도록 set 접근자에 로직을 추가할 수 있습니다.
private int age;
public int Age
{
get { return age; }
set
{
if (age != value)
{
age = value;
OnAgeChanged(); // 값 변경 시 이벤트 호출
}
}
}
private void OnAgeChanged()
{
Console.WriteLine("Age has been updated.");
}
9. 주의할 점
- 무한 루프: get과 set 접근자에서 필드를 직접 참조하지 않고 프로퍼티를 참조할 경우 무한 루프에 빠질 수 있습니다.
public int Number
{
get { return Number; } // 무한 루프 발생
set { Number = value; } // 무한 루프 발생
}
- Null 참조: 프로퍼티 사용 시, 값이 null인지 확인하여 예외 상황을 방지해야 합니다.
- 성능: 복잡한 로직이 포함된 프로퍼티는 성능에 영향을 줄 수 있으므로 주의가 필요합니다.
10. 활용 사례
1) 데이터 유효성 검사
프로퍼티 set 접근자에서 입력값에 대한 유효성 검사를 할 수 있습니다.
public class User
{
private string email;
public string Email
{
get { return email; }
set
{
if (!value.Contains("@"))
throw new ArgumentException("Invalid email address");
email = value;
}
}
}
2) 인터페이스와 추상 클래스
인터페이스와 추상 클래스에서도 프로퍼티를 정의할 수 있습니다.
public interface IExample
{
string Name { get; set; }
}
public abstract class AbstractExample
{
public abstract string Description { get; set; }
}
11. 결론
C#의 프로퍼티는 데이터의 안전한 접근과 관리에 필수적인 도구입니다. 자동 구현, 접근자 제한, 표현식 본문 등 다양한 기능을 통해 개발자는 더 깔끔하고 유지보수 가능한 코드를 작성할 수 있습니다. 이를 이해하고 적절히 활용하면 보다 안정적이고 효율적인 C# 프로그램을 구현할 수 있습니다.
'C & C++ & C#' 카테고리의 다른 글
[C++] C++로 문자열 연결하기 구현! (0) | 2025.01.31 |
---|---|
[C#] 제네릭(Generic)의 제약조건에 대하여 정리 (0) | 2024.11.11 |
[C#] string.Formating() 다양한 데이터를 특정 형식으로 보기 좋게 만드는 함수! (0) | 2024.11.08 |
[C#] 델리게이트(Delegate)와 Event로 함수를 깔끔하게 실행해보자! (0) | 2024.11.06 |