내일배움캠프/TIL

내일배움캠프 12일차 TIL - 속성(프로퍼티)

서보훈 2024. 9. 30. 20:49

프로퍼티라고도 불리는 C#의 속성을 개인적으로 어떻게 사용하는지 정리해보고자 합니다.

 

속성의 사용이유

속성은 한 클래스의 필드의 변수를 외부 클래스에서 다루고 싶을때 사용하게 되는 클래스 멤버입니다.

필드의 변수 자체를 public 을 사용하여 외부 클래스에서 사용할경우 객체 지향 프로그래밍의 특징중 하나인 캡슐화에 위배되며, 외부에서의 접근으로부터 데이터를 숨길 수 없게됩니다.

 

속성은 클래스의 변수를 숨기면서 자신의 필드를 접근자를 통해 공개하여 객체 지향 프로그래밍의 캡슐화 특성을 지키는 역할을 합니다.

 

 

접근자

속성의 접근자는 get, set이 존재하며, get을 통해 필드의 값을 참조할 수 있고, set 을 통해 내용을 설정할 수 있습니다.

접근자는 둘 다 사용하거나 둘중 하나만 사용하는것도 가능합니다.

 

사용

속성은 기본적으로 이런 형태를 가집니다.

//Character 클래스
//이름
public string Name { get; set; }

 

이 경우, 외부 클래스에서 Name 속성의 값을 변경할 수 있으며, 참조할 수 도 있습니다.

//다른 클래스
private Character char = new Character()
//참조
string myName = char.Name;
//설정
char.Name = "홍길동"

 

기본값에서 set에 private 접근 제한자를 사용할 경우 외부에서 참조할 수는 있지만, 속성의 값을 수정할수는 없게됩니다.

//이름
public string Name { get; private set; }
//다른 클래스
private Character char = new Character()
//참조
string myName = char.Name;
//불가능, Name 속성의 set 접근자가 숨겨져있음
char.Name = "홍길동"

 

주로 외부에서 변수를 참조해야할 때 이러한 속성을 사용하게됩니다.

 

또한 속성을 통해 클래스의 멤버 변수에 접근하도록 만들어 줄 수 도 있습니다.

private string name;
//Name 속성을 통해 name에 접근할수 있음
public string Name
{
    get { return name; }
    set { name = value; }
}

이 경우 속성인 Name 을 통해 외부 클래스에서 필드 멤버변수인 name 에 접근하여 수정과 참조가 가능해집니다.

 

이경우 역시 set에 private를 사용하여 값을 수정할 수 없게 만들어줄수도 있습니다.

private string name;
//Name 속성을 통해 name에 접근할수 있음, 단 외부에서 name값의 변경은 불가능
public string Name
{
    get { return name; }
    private set { name = value; }
}

속성을 통해 멤버변수를 공개할때는 set 값을 없이 설정하는경우가 있는데, 이 경우에는 같은 클래스 내부에서도 Name을 통한 값 수정이 불가능하며 속성은 오직 name에 저장된 값을 반환해주는 역할만 하게됩니다.

private string name;
//Name을 통한 name 값 수정 불가능 오직 name값을 반환하는 역할만 함
public string Name
{
    get { return name; }
}

 

 

개인적으로는 속성을 사용할때는 외부 클래스에서 변수값을 참조해와야할 때 주로 사용되기 때문에 set을 숨기거나 만들지 않는 읽기전용 속성을 주로 사용하게 되었습니다.

 

또한, 속성의 접근 제한자는 get, set이 가진 접근 제한자보다 높아야 합니다.

//이름
//오류발생, 속성의 접근제한자는 get, set의 접근 제한자보다 높아야함
private string Name { get; private set; }
//이름
//문제 없음
//단 자식클래스에서 이 값을 참조할 수는 있지만 수정할 수 없음
protected string Name { get; private set; }

 

또한 = 을 사용하여 속성의 초기값을 지정해줄 수 있습니다.

//이름
//속성에 초기값 "Player" 지정
protected string Name { get; private set; } = "Player"

만약 속성의 set을 사용하지 않을경우 생성자 혹은 = 을 사용해 지정해준값이 저장되며, 이외의 방법으로는 값을 변경할 수 없게됩니다.

//이름
//속성에 초기값 "Player" 지정, 클래스 내부에서도 변경할 수 없음
protected string Name { get; } = "Player"

 

 

오늘의 TIL로써 개인적으로 주로 속성을 사용하는법을 정리해보았습니다.