본문 바로가기
우아한 코딩

[C#] 데이터 멤버 보다 프로퍼티를 쓰자

by 피크인사이트 2024. 2. 22.
반응형

C#에서 데이터 멤버와 프로퍼티는 모두 클래스의 데이터를 저장하는 데 사용할 수 있는데, 일반적으로 데이터 멤버보다 프로퍼티를 사용하는 것을 추천하고 있습니다.

이번 글에서는 데이터 멤버와 프로퍼티의 기본 기능과 차이점에에 대해 살펴보고, 예제를 통해 데이터 멤버보다 프로퍼티를 사용해야 하는 이유도 살펴보겠습니다

데이터 멤버와 프로퍼티


데이터 멤버와 프로퍼티 개념

1. 데이터 멤버(Data Member)

C#에서 데이터 멤버는 클래스 또는 구조체 내에 선언된 변수입니다.

데이터 멤버는 클래스 멤버 함수뿐 아니라 다른 클래스의 멤버함수에서도 직접 액세스 할 수 있습니다.

다음은 데이터 멤버 예시코드입니다.

public class Person {
    // 데이터 멤버
    public string name; private int age;
    // 멤버 함수
    public void PrintInfo() {
        Console.WriteLine("이름: {0}, 나이: {1}", name, age);
    }
}

  위 코드에서 Person 클래스는 name과 age라는 두 개의 데이터 멤버를 가지고 있습니다.

name 데이터 멤버는 public 접근 지정자를 가지고 있기 때문에 클래스 외부에서 직접 액세스할 수 있습니다.

age 데이터 멤버는 private 접근 지정자를 가지고 있기 때문에 클래스 내부에서만 직접 액세스할 수 있습니다.

 

2. 프로퍼티(Property)

프로퍼티는 데이터 멤버에 접근하도록 방법을 제공하는 멤버입니다.

프로퍼티는 get과 set 접근자를 사용하여 데이터 멤버의 값을 가져오거나 설정할 수 있습니다.

이를 통해 데이터 멤버에 대한 읽기 전용, 쓰기 전용 및 읽기와쓰기 모두 가능한 프로퍼티를 정의할 수 있습니다.

예를 들어

class Person {
    private string name; // 데이터 멤버
    private int age; // 데이터 멤버
   
    public string Name// ..프로퍼티
      get { return name; } //get
      set { name = value; } //set
    }
   
    public int Age {   // 프로퍼티..
    get { return age; }
    set { age = value; }
    }
  }

위의 예제에서 Name 프로퍼티와 Age 프로퍼티는 각각 name과 age 데이터 멤버에 대한 접근을 제공합니다.

이렇게 함으로써 데이터 멤버에 접근하는 코드를 좀더 간결하게 작성할 수가 있고, 프로퍼티를 통해 데이터 멤버에 접근하는 동안 유효성 검사나 추가 로직을 쉽게 구현할 수 있습니다.

 

3. 선택 시 고려 사항

프로퍼티와 데이터 멤버 중 어느 것을 사용해야 할 것인지는 상황에 따라 다르지만,

일반적으로는 다음 요소들을 고려하여 결정할 수 있습니다.

 

- 캡슐화 및 접근 제어

프로퍼티는 데이터 멤버에 접근할 수 있는 getter와 setter를 제공하여 데이터의 은폐(encapsulation)를 유지하면서 외부에서 안전하게 접근할 수 있도록 합니다.

이는 데이터 멤버에 대한 접근을 제어하고 유효성 검사나 추가 로직을 쉽게 구현할 수 있게 합니다.

- 간편한 사용

프로퍼티를 사용하면 데이터 멤버에 접근하기 위해 메서드를 호출하는 대신 멤버에 직접 접근할 수 있습니다.

이로 인해 코드가 더 간결해지고 가독성이 향상될 수 있습니다.

- 유지보수 및 확장성

프로퍼티는 데이터 멤버의 구현 내용을 캡슐화하기 때문에, 내부 구현을 변경할 필요가 있을 때도 외부 인터페이스를 변경하지 않고도 유연하게 대처할 수 있습니다.

- 성능

프로퍼티는 실제로는 메서드로 컴파일되므로, 일부 상황에서 직접 데이터 멤버에 접근하는 것이 프로퍼티를 통한 접근보다 더 빠를 수 있습니다.

하지만 대부분의 경우 성능 차이는 무시할 정도로 작으며, 프로퍼티의 장점이 더 크기 때문에 일반적으로 성능보다는 가독성과 유지보수성을 우선시합니다.


프로퍼티가 더 유리한 경우

프로퍼티가 더 유리한 경우를 예제 코드를 통해 설명해 보겠습니다.

데이터 멤버로 score를 가지고 있는 특정 클래스가 있고, 항상 0과 100 사이의 성적값을 저장한다고 가정해 보겠습니다.

이때 데이터 멤버 score 직접 노출하고자 할 때와 프로퍼티로 노출하고자 할 때의 차이를 살펴보겠습니다.

1. 직접 노출

 class Grade {
    public int score; // 데이터 멤버 직접 노출
   }

이제 다른 클래스에서 Grade 클래스의 score에 접근할 수 있습니다.

Grade studentGrade = new Grade();
   studentGrade.score = 120; // 이런 값이 유효하지 않음

위 코드처럼 데이터 멤버를 직접 노출하는 경우, 유효하지 않은 값(0과 100 사이의 범위를 벗어난 값)이 할당될 수 있습니다. 이것은 우리가 원치 않는 상황이므로 좋은 설계 방식이 아닙니다.

 

2. 프로퍼티 사용

class Grade { private int score; // 데이터

class Grade {
    private int score; // 데이터 멤버
   
    public int Score { // 프로퍼티
    get { return score; }
    set {
    if (value < 0 || value > 100) {
    throw new ArgumentException("Invalid score. Score must be between 0 and 100.");
    }
    score = value;
    }
    }
 }

 

위 코드에서는 score 데이터 멤버를 직접 노출하지 않고, 프로퍼티인 Score를 통해 접근합니다.

이렇게 하면 값을 할당하기 전에 유효성을 검사할 수 있어 유효하지 않은 값이 할당되는 것을 방지할 수 있습니다.

 Grade studentGrade = new Grade();
 studentGrade.Score = 120;
  // ArgumentException: Invalid score. Score must be between 0 and 100.

위와 같이 프로퍼티를 사용하면, 유효하지 않은 값을 할당하려고 할 때 예외가 발생하여 프로그램의 안정성을 높일 수 있습니다.

따라서 이러한 상황에서는 프로퍼티를 사용하는 것이 더 바람직합니다.

 

프로퍼티 보다 데이터 멤버를 사용해야 하는 경우

프로퍼티 대신 데이터 멤버를 사용해야 하는 경우는 비교적 드물지만,

특정 상황에서는 프로퍼티보다 데이터 멤버가 적합할 수 있습니다.

(예시) 단순히 이름과 나이를 저장하는 역할을 하는 클래스에 name과 age라는 데이터 멤버가 있다고 가정하겠습니다.

1) 프로퍼티 사용의 제약

class Person {       // 데이터멤버
    private string name;
    private int age;
   
    public string Name {  // get, set
    get { return name
    set { name = value; } 
    }
   
    public int Age {    // get, set
    get { return age; }
    set { age = value; }
    }
   }

 이 클래스에서는 프로퍼티를 사용하여 name과 age에 접근합니다.

하지만 특정 상황에서는 이러한 캡슐화와 유효성 검사가 필요하지 않을 수 있습니다.

 

2) 단순한 데이터 저장

class Person
     public string name;
     public int age;
 }

데이터 멤버를 직접 노출하여 간단히 이름과 나이를 저장하는 경우에는 프로퍼티를 추가로 정의하는 것이 별다른 이점을 제공하지 않을 수 있습니다.

또한, 데이터 멤버를 직접 노출함으로써 코드가 더 간결해지고 직관적이 될 수 있습니다.

 

3) 프로퍼티 사용이 불필요한 경우

class Person {                   //
    public string Name;
    public int Age;
    //
    public Person(string name, int age) {
    Name = name;
    Age = age;
    }
   }

이 클래스에서는 생성자를 통해 초기화되는 프로퍼티가 있습니다.

이 경우에는 프로퍼티의 캡슐화와 유효성 검사가 필요하지 않으며, 데이터 멤버를 직접 노출하는 것이 더 간단하고 효율적입니다.

 

따라서 데이터 멤버를 사용하는 것이 프로퍼티보다 더 적합한 경우는 주로 간단한 데이터 저장이 필요하고, 데이터에 대한 캡슐화와 유효성 검사가 필요하지 않을 때입니다.

 

이러한 경우에는 데이터 멤버를 직접 노출하는 것이 코드를 간결하게 유지하고, 불필요한 복잡성을 피할 수 있습니다.


결론

지금까지 살펴본 바와 같이 대부분의 경우, 프로퍼티를 사용하는 것이 좋습니다.

데이터 멤버를 직접 노출하는 것보다는 프로퍼티를 통해 데이터의 은폐와 접근 제어를 유지하고, 캡슐화를 통해 코드를 유연하게 작성할 수 있습니다.

위 예시처럼 성능에 매우 민감한 특정 상황이나 특별한 요구사항이 있는 경우를 제외하고는 프로퍼티를 사용하는 것이 일반적으로 더 바람직합니다.

반응형