인스턴스의 타입 전체에 걸쳐 적용되는 필드, 메서드, 생성자를 알아보자.
정적 필드
- [클래스이름].[정적필드]로 접근
정적 메서드
- [클래스이름].[정적메서드]로 접근
- 정적 메서드 안에서는 인스턴스 멤버에 접근할 수 없다. 아직 new 연산자로 인스턴스가 생성되지 않았으므로, 인스턴스 내용을 알 수 없기 떄문이다.
Main 메서드 또한 정적 메서드로, 가장 최초에 실행되는 메서드이다.
- 반환값은 void 또는 int만 허용
- 매개변수는 없거나 string 배열만 허용
✍ 샘플 코드
namespace ConsoleApp2206
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Test Start");
Person p1 = new Person("Amy");
Person p2 = new Person("David");
}
}
class Person
{
public static string nationality;
public string name;
public Person(string name)
{
Console.WriteLine("인스턴스 생성자 호출");
this.name = name;
}
static Person()
{
Console.WriteLine("정적 생성자 호출");
nationality = "Korea";
}
}
}
✅ 결과
Test Start
정적 생성자 호출
인스턴스 생성자 호출
인스턴스 생성자 호출
- new 연산자로 인스턴스 할당을 할 경우, 정적 생성자가 먼저 호출된 후 인스턴스 생성자가 호출됨.
- new 연산자로 여러 번 인스턴스를 할당할 경우, 인스턴스 생성자는 여러 번 호출되지만 정적 생성자는 최초에 한 번에 한해서만 호출됨.
✍ 샘플 코드
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Test Start");
Console.WriteLine(Person.nationality);
}
}
✅ 결과
Test Start
정적 생성자 호출
Korea
- new 연산자로 인스턴스 할당 없이 정적 필드를 바로 호출하면 정적 생성자만 호출됨.
- 정적 생성자에서 초기화된 정적 필드가 출력됨.
✍ 샘플 코드
class Person
{
public static string nationality = "India";
public string name;
public Person(string name)
{
Console.WriteLine("인스턴스 생성자 호출");
this.name = name;
}
static Person()
{
Console.WriteLine(nationality);
Console.WriteLine("정적 생성자 호출");
nationality = "Korea";
}
}
✅ 결과
Test Start
India
정적 생성자 호출
Korea
- 정적 필드에 초기화(India)가 이루어지고, 정적 생성자에서도 정적 필드의 초기화(Korea)를 한다면, 생성자 내의 초기화로 덮어써진다.