C#에서 배열 동기화 여부 확인하기
C#에서 배열이 동기화(synchronized)되어 있는지 확인하려면 IsSynchronized 속성을 사용하면 됩니다. 이 속성은 해당 배열에 대한 접근이 스레드로부터 안전(thread-safe)한지 여부를 불리언(Boolean) 값으로 반환합니다.
new 키워드로 생성한 일반 배열은 기본적으로 동기화되어 있지 않으므로, IsSynchronized 속성은 항상 False를 반환합니다. 멀티스레드 환경에서 배열을 안전하게 공유해야 한다면 Array.Synchronized() 메서드로 감싼 동기화된 래퍼(wrapper)를 사용해야 합니다.
배열 상태를 확인할 때 함께 자주 사용하는 주요 속성은 다음과 같습니다.
- IsFixedSize : 배열의 크기가 고정되어 있는지 여부 (일반 배열은 항상 True)
- IsReadOnly : 배열이 읽기 전용인지 여부
- IsSynchronized : 배열이 동기화(스레드 안전)되어 있는지 여부
예제 1
다음은 빈 문자열 배열에 대해 위 속성들을 확인하는 코드입니다.
using System;
public class Demo {
public static void Main() {
string[] products = new string[] { };
Console.WriteLine("'E'로 시작하는 요소가 하나라도 있는가? = {0}",
Array.Exists(products, ele => ele.StartsWith("E")));
Console.WriteLine("배열의 크기가 고정되어 있는가? = " + products.IsFixedSize);
Console.WriteLine("배열이 읽기 전용인가? = " + products.IsReadOnly);
Console.WriteLine("배열이 동기화되어 있는가? = " + products.IsSynchronized);
}
}출력 결과
'E'로 시작하는 요소가 하나라도 있는가? = False 배열의 크기가 고정되어 있는가? = True 배열이 읽기 전용인가? = False 배열이 동기화되어 있는가? = False
예제 2
이번에는 두 개의 문자열 배열을 선언하고, 각 배열의 속성 값과 더불어 두 배열 객체의 동등성까지 비교해 보겠습니다.
using System;
public class Demo {
public static void Main() {
String[] strArr1 = new String[3] { "John", "Jacob", "Tim"};
String[] strArr2 = new String[3] { "Tom","Brad","Bradley"};
Console.WriteLine("첫 번째 문자열 배열...");
foreach(string val in strArr1) {
Console.WriteLine(val);
}
Console.WriteLine("첫 번째 배열의 크기가 고정되어 있는가? = " + strArr1.IsFixedSize);
Console.WriteLine("첫 번째 배열이 읽기 전용인가? = " + strArr1.IsReadOnly);
Console.WriteLine("첫 번째 배열이 동기화되어 있는가? = " + strArr1.IsSynchronized);
Console.WriteLine("\n두 번째 문자열 배열...");
foreach(string val in strArr2) {
Console.WriteLine(val);
}
Console.WriteLine("두 번째 배열의 크기가 고정되어 있는가? = " + strArr2.IsFixedSize);
Console.WriteLine("두 번째 배열이 읽기 전용인가? = " + strArr2.IsReadOnly);
Console.WriteLine("두 번째 배열이 동기화되어 있는가? = " + strArr2.IsSynchronized);
Console.WriteLine("두 배열 객체가 같은가? = "+strArr1.Equals(strArr2));
}
}출력 결과
첫 번째 문자열 배열... John Jacob Tim 첫 번째 배열의 크기가 고정되어 있는가? = True 첫 번째 배열이 읽기 전용인가? = False 첫 번째 배열이 동기화되어 있는가? = False 두 번째 문자열 배열... Tom Brad Bradley 두 번째 배열의 크기가 고정되어 있는가? = True 두 번째 배열이 읽기 전용인가? = False 두 번째 배열이 동기화되어 있는가? = False 두 배열 객체가 같은가? = False
정리
실행 결과에서 알 수 있듯이, 일반 배열은 크기가 고정(IsFixedSize = True)되어 있지만 읽기 전용이 아니며(IsReadOnly = False), 기본적으로 동기화되어 있지 않습니다(IsSynchronized = False). 또한 저장된 요소가 서로 다른 두 배열 객체를 Equals() 메서드로 비교하면 참조가 다르므로 False가 반환됩니다.