읽기 전용 레퍼런스 타입 객체는 정말 읽기 전용인가?

[제목] 읽기 전용 레퍼런스 타입 객체는 정말 읽기 전용인가?

흔히 읽기 전용 레퍼런스 객체를 외부에서 사용토록 위해 Getter 속성을 사용하여 읽기 전용 속성을 제공할 수 있다. 하지만, 이 속성은 개발자의 순수한(?) 의도와 상관 없이 외부에서 해당 객체 데이타를 변경 혹은 삭제할 수 있는 기능을 제공할 수 있다.

예를 들어, 아래 MyData클래스의 ReadOnlyTable 속성은 DataTable 객체를 읽기 전용으로 제공하고 있다. 외부에서는 ReadOnlyTable 속성을 치환할 수 없다.
public class MyData
{
    //...
    private DataSet ds;
    public DataTable ReadOnlyTable
    {
        get { return ds.Tables[0]; }
    }
}
하지만, 문제는 이 DataTable 객체가 레퍼런스 타입이므로 레퍼런스 포인터를 변경할 수는 없지만, 레퍼런스가 가리키는 Heap상의 객체 데이타는 변경 가능한다는 점이다. 이를 테면, 다음과 같이 외부 사용자가 DataTable의 모든 데이타를 쉽게 삭제할 수 있다.
MyData m = new MyData();
m.ReadOnlyTable.Clear();
따라서 레퍼런스 객체를 무조건 읽기 전용처럼 생각하고 외부에 노출시켜서는 안된다.


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