[C#] 프로퍼티(property) 완벽 파헤치기!

2024. 11. 10. 21:04·C & C++ & C#

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
'C & C++ & C#' 카테고리의 다른 글
  • [C++] C++로 문자열 연결하기 구현!
  • [C#] 제네릭(Generic)의 제약조건에 대하여 정리
  • [C#] string.Formating() 다양한 데이터를 특정 형식으로 보기 좋게 만드는 함수!
  • [C#] 델리게이트(Delegate)와 Event로 함수를 깔끔하게 실행해보자!
개발준입니다
개발준입니다
백문이 불여일타
  • 개발준입니다
    Re:제로부터 시작하는 개발이야기
    개발준입니다
  • 전체
    오늘
    어제
    • All (32)
      • Java & Kotlin (3)
      • Spring (0)
      • DataBase (0)
      • Git & Github (1)
      • Baekjoon (8)
      • C & C++ & C# (5)
      • Unity (12)
      • DesignPattern (3)
      • SmallTalk (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코딩
    자바
    리스너 패턴
    백준
    매서드
    알고리즘 #코테
    게임개발
    유니티
    개발
    알고리즘
    레벨 디자인
    개발자
    state pattern
    c#
    오블완
    가중치 비교
    티스토리챌린지
    github
    디자인패턴
    코테
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
개발준입니다
[C#] 프로퍼티(property) 완벽 파헤치기!
상단으로

티스토리툴바