아엠그라운드

필드

필드는 C++의 데이터 멤버를 의미하며 C++의 그 것과 별 차이가 없다. , 앞에서 언급한 것처럼 C#에서의 기본 재사용 단위가 어셈블리이기 때문에 접근 한정자에 internal이 더 추가되었다. 필드들은 명시적으로 초기화를 하지 않을 경우, 수치형은 0으로, 불린형은 false, 참조형은 null로 초기화 된다.

 

C#에서도 C++의 정적 멤버에 해당하는 정적 필드를 제공한다. 단순히 필드 선언 앞에 static 한정자를 추가로 선언하여 주면 된다. 정적 필드는 특정 객체 (인스턴스)와 관련이 없고 클래스 자체와 관련이 있다. , 객체 마다 정적 필드가 할당되는 것이 아니라 클래스 당 하나만 할당이 된다. 따라서, 객체의 개수를 카운트하거나 통계 값들을 저장할 경우 유용하게 사용할 수 있다. C++에서는 일반 필드를 참조하듯이, 즉 인스턴스를 통하여 정적 필드를 참조할 수도 있었으나 C#에서는 반드시 클래스명.정적필드명 형태로만 참조할 수 있다.

 

C#에는 C++에 없는 읽기 전용 필드를 제공한다. 필드 선언 시에 추가로 readonly를 덧 붙여주면 된다. 읽기 전용 필드는 객체 생성 시에 지정된 값을 변경할 수 없게 해준다. 따라서 readonly로 선언된 필드의 값은 선언 시에 초기값을 확정하든 아니면 생성자 부분에서 값을 확정할 수 있다. 아래의 예제 코드에서 보듯이 읽기 전용 필드는 선언 시에도 초기화를 할 수 있고 이를 생성자 부분에서 다시 초기화 할 수도 있다.

 

using System;

public class Sample

{

class ReadOnlyClass

{

public int x;

public readonly int y = 1;

public readonly int z;

 

public ReadOnlyClass()

{

z = 24;

}

 

public ReadOnlyClass(int x, int y, int z)

{

this.x = x;

this.y = y;

this.z = z;

}

}

 

static void Main()

{

ReadOnlyClass o1 = new ReadOnlyClass(1, 2, 3);

Console.WriteLine("o1: x={0}, y={1}, z={2}", o1.x, o1.y, o1.z);

ReadOnlyClass o2 = new ReadOnlyClass();

o2.x = 55; // OK

o2.y = 6; // 오류

o2.z = 7; // 오류

}

}

 

참고로, 읽기 전용 필드는 뒤에 나오는 상수 필드와 다르다. 상수 필드는 필드를 선언할 때만 초기화될 수 있는 반면 읽기 전용 필드는 필드를 선언할 때 또는 생성자에서 초기화될 수 있다. 따라서 읽기전용 필드의 값은 사용된 생성자에 따라 다르며 또한 상수 필드는 컴파일 타임 상수인 반면 읽기전용 필드는 런타임 상수로도 사용할 수 있습니다(: public static readonly uint l1 = (uint) DateTime.Now.Ticks;).