public 은 "접근 한정자(Access Modifier)" 중 하나인데, 접근 한정자는 객체 지향 프로그래밍의 3대 축 중에 하나인 캡슐화(Encapsulation)와 연관이 있습니다.
캡슐화는 협소한 의미로는 데이터를 무방비로 노출해서 아무나 접근하도록 두지 말고 보호막(캡슐)에 넣어 외부에서 접근하는 것을 제한하라는 것입니다.
그러나, 넓은 의미로는 어떤 것이 되었든 접근 가능성을 일정 범위(Scope) 안으로 한정하라는 것입니다.
접근 한정자에는 아래와 같은 것들이 있습니다.
public : 보호막 바깥으로 공개 (보호를 하지 않음)
internal : 어셈블리 내부만 공개, 외부 비공개
protected : 자손에게만 공개
private : 보호막 바깥으로 공개하지 않음 (가장 강력한 보호)
static 은 "정적인" 이라는 의미로, 동적인(Dynamic) 것과 대비되는 의미입니다.
프로그램의 실행 중에 많은 인스턴스들이 생성되었다가 소멸됩니다.
즉, 인스턴스의 생애는 기본적으로 동적입니다.
그러나, 정정인 것들은 한 번 생성이 되면, 프로그램이 종료될 때 까지 소멸되지 않습니다.
엄밀하게 말하면, 프로그램 실행 중에 처음 접근할 때 생성되고, 프로그램이 종료될 때 함께 사라집니다.
인스턴스는 아무리 많이 생성되었어도 쓰임이 다하면 즉시 사라지기에, 프로그램 입장에서는 메모리를 효율적으로 이용할 수 있습니다. 그러나, 생성과 소멸이라는 비용을 중복적으로 지불해야 합니다.
그러나 정적인 것들은 한번 생성되면 소멸되지 않고, 특정 메모리를 계속 차지하고 있기 때문에 메모리 운영이 비효율적입니다.
그러나, 생성 비용을 한번만 지불하면 됩니다.
static 은 프로그램 입장에서 "유일한 존재"에게 붙이는 경우가 많습니다.
대표적인 것이 Console 클래스입니다.
C#의 콘솔앱은 태어날 때부터 하나의 콘솔을 보유한가고 가정하기에, 콘솔 객체를 생성했다 소멸했다 할 필요가 없는 것이죠.
또 다른 예로 Environment 클래스가 있습니다.
프로그램 입장에서는 자신이 실행되는 환경(Environment)이 두 개 일리가 없죠.
static 의 또 다른 의미는 인스턴스 멤버에 접근하지 않는 멤버를 가리키기도 합니다.