static
초보자가 이해하기위한 키워드는 조금 어려울 수 있습니다. 기본 목적은 클래스 멤버가 클래스의 단일 인스턴스에 속하지 않고 클래스 자체에 속하는 것으로 식별하는 것입니다.
너무 자세하게 설명하지 않고 C # (및 Java)은 모든 코드와 데이터가 객체에 속해야하므로 범위, 가시성 및 수명이 제한적이라는 객체 지향적 이상을 엄격하게 시행합니다. 일반적으로 실제 사물을 나타내는 객체의 기본 교리가 적용될 때마다 모범 사례입니다. 그러나 항상 그런 것은 아닙니다. 때로는 필요한 것은 코드를 포함하는 객체에 대한 참조를 전달하지 않고도 코드의 어느 곳에서나 얻을 수있는 함수 또는 변수이며 ,보고 있거나 변경하는 데이터가 모든 사람에게 정확히 맞는다는 보장 다른 것은 객체의 다른 인스턴스에 속하는 사본이 아니라 처리하는 것입니다.
이러한 동작은 "전역"함수 또는 변수의 형태로 C 및 C ++에서 사용 가능했으며 개체에 캡슐화되지 않았습니다. 따라서 C #과 Java는 타협으로 부모 개체가없고 범위가 제한된 인스턴스 멤버가없는 진정한 전역 코드의 중간 지점 인 "정적 범위"를 지원합니다.
로 선언 된 "코드 멤버"(함수, 속성, 필드)는 static
프로그램 main()
함수 의 첫 번째 줄에서 범위에 포함되며 main()
함수가 종료 될 때까지 그대로 두지 않습니다 . 일반 영어로, 정적 멤버가 존재하며 프로그램이 실행되는 한 사용할 수 있습니다. 또한 정적 멤버는 해당 유형의 한 인스턴스 멤버가 아닌 유형 자체의 멤버로 호출하여 호출됩니다.
public class Foo
{
public int MyInt {get;set;} //this is an "instance member"
public static int MyStaticInt {get;set;} //this is a "static member"
}
...
var myFoo = new Foo();
myFoo.MyInt = 5; //valid
myFoo.MyStaticInt = 5; //invalid; MyStaticInt doesn't belong to any one Foo
Foo.MyInt = 5; //invalid; MyInt only has meaning in the context of an instance
Foo.MyStaticInt = 2; //valid
따라서 정적 멤버는 해당 유형의 단일 인스턴스에 대해 알고 있는지 여부에 관계없이 유형에 대한 지식이있는 모든 코드에 표시됩니다.
귀하의 질문에 대답하기 위해 무언가를 정적으로 표시하면 얻을 수있는 주요 이점은 소비 코드가 포함하는 객체의 인스턴스를 가지고 있는지 여부에 관계없이 유형 자체가 알려진 모든 위치에서 볼 수 있다는 것입니다. 도 있습니다 약간의 성능 이점이; 메소드가 정적 범위에 있기 때문에 (같은 클래스 또는 다른 클래스의) 다른 정적 멤버 및 매개 변수로 전달 된 모든 항목에만 액세스 할 수 있습니다. 따라서 런타임은 컨텍스트 별 상태 정보를 제공하기 위해 일반적으로 인스턴스 메소드에 대해 필요하므로 포함하는 오브젝트의 현재 인스턴스에 대한 참조를 분석 할 필요가 없습니다.
전체 클래스는 정적으로 표시 될 수도 있습니다. 이렇게하면 클래스 선언이 정적 멤버로만 구성되어 인스턴스화 할 수 없다고 컴파일러에 알립니다. 이것은 메모리에 객체의 복사본이 하나만 있는지 확인하는 쉬운 방법입니다. 클래스와 그 안의 모든 것을 정적으로 만듭니다. 그러나 이것이 그러한 요구에 가장 적합한 솔루션이라는 것은 매우 드 rare니다. 정확히 한 세트의 데이터 사본이 필요한 상황에서는 "단일"이 대신 권장됩니다. 이것은 정적이 아닌 클래스이며 정적 접근 자와 비 공용 생성자를 사용하여 단일 인스턴스에 대한 액세스를 제공합니다. 이론적으로 싱글 톤은 완전 정적 클래스와 거의 동일한 이점을 제공하지만 인스턴스 기반의 객체 지향 방식으로 클래스를 사용할 수있는 추가 기능을 제공합니다.