C# 핵심 기초 1편 데이터 접근 제어 public과 protected 속성,private 멤버와 indexer
프로그래밍에서 데이터 보호는 중요한 이슈 중 하나다. 그래서 다양한 데이터 접근 제어 방법을 사용하여 데이터를 보호한다. C#에서도 이를 위해 접근 제어자(access modifiers)를 제공하고 있다. 특히 'public'과 'protected' 속성 그리고 'private' 멤버에 대해 깊게 살펴볼 것이다.
< 데이터 접근 제어란? >
데이터 접근 제어는 클래스의 멤버에 대한 접근을 제어하는 방식을 의미한다. 멤버는 필드, 메소드, 프로퍼티 등을 포함한다. C#에서는 접근 제어자를 사용해 이를 수행할 수 있으며, 가장 일반적으로 사용되는 접근 제어자로는 public, private, protected, internal 등이 있다.
[Public과 Protected 속성]
C#에서 속성(Property)은 객체의 상태를 표현하는 데 사용된다. 이를 통해 객체의 내부 상태를 안전하게 읽고 수정할 수 있다. 속성은 필드처럼 보이지만, 내부적으로는 메서드인 Get과 Set을 통해 동작한다.
Public 속성은 클래스의 외부에서 자유롭게 접근할 수 있도록 하는 방식이다. 즉, 클래스가 속한 어셈블리나 다른 어셈블리에서도 이 속성에 접근할 수 있다.
public class MyClass {
public string MyProperty { get; set; }
}
반면에, Protected 속성은 해당 클래스와 해당 클래스를 상속받은 클래스에서만 접근 가능하게 한다. 그래서 다른 클래스에서는 직접적인 접근이 불가능하다.
public class MyBaseClass {
protected string MyProperty { get; set; }
}
Public과 Protected 속성은 클래스의 사용자에게 데이터에 직접적으로 접근할 수 있는 방법을 제공한다. 하지만 이는 데이터의 상태를 제어하는 측면에서 위험성을 내포하고 있다.
< 모든 데이터 멤버는 Private으로 >
이런 위험성을 피하기 위해, 클래스의 모든 데이터 멤버는 가능한 Private으로 선언하는 것이 바람직하다. Private 멤버는 오직 그 멤버가 선언된 클래스에서만 접근 가능하며, 외부에서는 접근할 수 없다.
public class MyClass {
private int myField;
}
이 방법은 데이터 캡슐화를 강화하며, 클래스 내부의 상태를 외부로부터 보호하는데 중요한 역할을 한다. 이는 클래스를 수정하거나 확장할 때도 이점을 준다. 외부에 노출된 부분이 적을수록 클래스의 구현을 수정하거나 확장하기 쉽기 때문이다.
< 인덱서(Indexer)의 사용 >
마지막으로, C#에서는 배열이나 컬렉션과 같은 시퀀스나 딕셔너리에 접근할 때 인덱서(Indexer)를 사용하는 것이 좋다. 인덱서는 클래스나 구조체의 인스턴스를 배열처럼 접근할 수 있게 해주는 멤버다.
public class MyClass {
private List<string> myList = new List<string>();
public string this[int index] {
get { return myList[index]; }
set { myList[index] = value; }
}
}
이렇게 하면, 클래스의 사용자는 내부 데이터를 배열처럼 다룰 수 있게 된다. 하지만 실제로 데이터가 어떻게 저장되고 접근되는지는 완전히 감추어진다. 이로 인해 데이터의 캡슐화가 더욱 강화된다.
이렇게 public이나 protected로 데이터를 노출할 때는 항상 속성을 사용하고, 시퀀스나 딕셔너리를 노출할 때는 인덱서를 사용하며, 모든 데이터 멤버는 private으로 선언하게 되면 클래스의 캡슐화를 강화하고 더욱 안전하고 유지보수하기 쉬운 코드를 작성할 수 있다.