Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 ArrayList 읽기 전용 래퍼 만들기 – ReadOnly() 메서드 활용 가이드

C#에서 ArrayList를 외부 코드나 다른 개발자에게 노출할 때, 실수로 요소가 추가·수정·삭제되는 것을 방지하고 싶은 경우가 있습니다. 이럴 때 ArrayList.ReadOnly() 메서드를 사용하면 기존 ArrayList를 감싸는 읽기 전용 래퍼(read-only wrapper)를 손쉽게 만들 수 있습니다.

IsReadOnly 속성이란?

ArrayList 클래스의 IsReadOnly 속성은 해당 컬렉션이 읽기 전용인지 여부를 나타냅니다. 일반적인 ArrayList는 기본적으로 쓰기가 가능하므로 이 속성은 False를 반환합니다.

예제 1: 일반 ArrayList의 IsReadOnly 확인

using System;
using System.Collections;

public class Demo {
   public static void Main(){
      ArrayList list = new ArrayList();
      list.Add("One");
      list.Add("Two");
      list.Add("Three");
      list.Add("Four");
      list.Add("Five");
      list.Add("Six");
      list.Add("Seven");
      list.Add("Eight");

      Console.WriteLine("ArrayList 요소...");
      foreach(string str in list){
         Console.WriteLine(str);
      }

      Console.WriteLine("ArrayList는 읽기 전용인가? = " + list.IsReadOnly);
   }
}

출력 결과

ArrayList 요소...
One
Two
Three
Four
Five
Six
Seven
Eight
ArrayList는 읽기 전용인가? = False

위 실행 결과에서 볼 수 있듯이, 일반 ArrayList는 읽기 전용이 아니므로 False가 출력됩니다.

예제 2: ArrayList.ReadOnly()로 읽기 전용 래퍼 생성하기

이번에는 ArrayList.ReadOnly() 정적 메서드를 호출하여 원본 리스트를 감싸는 읽기 전용 래퍼를 만들어 보겠습니다.

using System;
using System.Collections;

public class Demo {
   public static void Main(){
      ArrayList list = new ArrayList();
      list.Add("One");
      list.Add("Two");
      list.Add("Three");
      list.Add("Four");
      list.Add("Five");
      list.Add("Six");
      list.Add("Seven");
      list.Add("Eight");

      Console.WriteLine("ArrayList 요소...");
      foreach(string str in list){
         Console.WriteLine(str);
      }

      Console.WriteLine("ArrayList는 읽기 전용인가? = " + list.IsReadOnly);

      // 읽기 전용 래퍼 생성
      ArrayList list2 = ArrayList.ReadOnly(list);
      Console.WriteLine("이제 ArrayList는 읽기 전용인가? = " + list2.IsReadOnly);
   }
}

출력 결과

ArrayList 요소...
One
Two
Three
Four
Five
Six
Seven
Eight
ArrayList는 읽기 전용인가? = False
이제 ArrayList는 읽기 전용인가? = True

ArrayList.ReadOnly(list)가 반환한 래퍼 객체의 IsReadOnly 속성은 True를 반환합니다. 이 래퍼를 통해 Add, Remove, Insert 같은 쓰기 작업을 시도하면 NotSupportedException 예외가 발생하여 데이터가 보호됩니다.

알아두어야 할 주요 포인트

  • ArrayList.ReadOnly()는 원본 리스트 자체를 변경하는 것이 아니라, 읽기 전용으로 감싼 새로운 래퍼 객체를 반환합니다.
  • 원본 리스트에 대한 참조가 그대로 남아 있다면, 원본을 통해서는 여전히 수정이 가능하므로 주의해야 합니다.
  • 래퍼는 원본 데이터의 변경 사항을 그대로 반영합니다. 즉, 원본이 수정되면 래퍼를 통해 조회되는 내용도 달라집니다.
  • 최신 .NET 환경에서는 형식 안전성이 보장되는 제네릭 컬렉션(List<T>)과 AsReadOnly() 메서드 또는 ReadOnlyCollection<T>를 사용하는 것이 권장됩니다.