클래스에서 public 필드 멤버를 사용하는 오류

[제목] 클래스에서 public 필드 멤버를 사용하는 오류

C# 클래스를 작성할 때, 필드(field) 멤버를 public으로 지정하여 외부에서 해당 멤버를 직접 읽고 쓰는 일을 허락할 수 있다. 흔히 간단한 데이타 멤버를 이런 방식으로 외부에 노출시키는데, 이러한 코딩 방식은 올바른 것일까?

우선 다음과 같은 예제 클래스를 생각해 보자.
public class Person_Bad
{
    public int Id;
    public string Name;
    public string Phone;

    //...
}

이 클래스는 Id, Name, Phone 이라는 3개의 필드를 외부에서 직접 엑세스할 수 있도록 허락하고 있다. 먼저 public 필드를 사용하는 것은 객체의 내부 상태를 외부에서 직접 컨트롤 할 수 있다는 점에서 객체지향적 설계라고 볼 수 없다. 또한, 해당 클래스가 다수의 외부 어플리케이션에서 컴포넌트로 사용될 때, 공개 API를 깨지 않고 Getter와 Setter를 내부적으로 수정하지 못하도록 한다.

public 필드는 읽기와 쓰기가 가능한 멤버를 직접 노출시키지만, 프로퍼티를 사용하면 읽기(get), 쓰기(set)를 선택적으로 노출시킬 수 있으며, 각각의 getter, setter를 private, internal 등으로 지정하여 사용을 제한할 수도 있다. 그리고, 프로퍼티에는 간단한 유효성 검사 루틴을 추가하여 set 이전에 유효한 값만을 받이들이게 할 수 있다.

public class Person_Good
{
    private string _name;

    // Id 를 해당 클래스에서만 set
    public int Id { get; private set; }

    // 간단한 Validation Check
    public string Name 
    {
        get { return this._name; }
        set
        {
            if (string.IsNullOrEmpty(value))
            {
                throw new ArgumentException("빈 이름");
            }
            this._name = value;
        }
    }

    public string Phone { get; set; }

    //...
}
이러한 프로퍼티의 장점들로 인해 C# / .NET에서는 public 필드의 사용을 권장하지 않고, 항상 프로퍼티를 사용할 것을 권장한다.


본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.