정적 클래스 및 정적 멤버
다루는 내용
- 정적 클래스
- 정적 멤버
- 비 정적 클래스의 private 생성자
C#과 Java의 경우에는 전역 스코프가 없다라는 것 때문에 C와 C++에서 전역 스코프에 의존했던 이들에게는 프로그래밍 하기 불편하다는 투정을 받을 수도 있다. 물론, 동적인 형태로 프로그래밍을 해 온 이라면 크게 문제가 되지 않겠지만 말이다.
그렇지만, C#과 Java에서도 static 클래스를 통해 전역 스코프와 동일한 효과를 가져올 수 있게 해 주고 있다.
class명 앞에 static 키워드가 붙으면 인스턴스는 생성할 수 없는 정적 클래스로 정의가 된다. 이들은 static 멤버들로만 구성되어 있고 파생을 할 수 없는 봉인된(sealed) 클래스가 된다. 그리고, public한 정적 멤버들을 클래스명을 통해 접근을 할 수가 있고 이는 전역 스코프와 비슷한 역할을 할 수 있다.
Look & Feel & Think 정적 클래스에는 정적 생성자를 정의할 수 있는데 이는 개발자 코드에서 호출이 되는 것이 아니라 CLR에 의해 호출이 되는 것이다. 정적 클래스의 자원이 로딩되는 시점 또한 CLR에 의해 결정이 되는데 최소한 static 클래스의 노출된 자원을 사용하기 전에는 로딩이 되면 로딩되는 시점에 정적 생성자가 호출이 된다. 그리고, 정적 클래스의 자원의 수명은 도메인이 유지되는 동안은 보장이 이루어진다. |
실제 클래스를 static 클래스로 명시를 하지 않는다 하더라도 abstract 클래스로 만들고 생성자를 private하게 노출을 해서 동일한 효과를 낼 수도 있으며 목적에 따라서는 비정적 클래스에 공통된 자원을 위해 정적 멤버를 두어 사용을 하는 것이 일반적이다.
이러한 정적 멤버들 중에 노출된(액세스 한정자가 public한) 멤버들은 클래스명과 멤버를 통해 사용이 가능하다.
Look & Feel & Think
먼저 다음과 같이 static한 멤버 필드 max_stu에 접근 가능한 속성 Maxstu를 추가하고 static 멤버에 대한 사용 예를 보고 느끼고 생각해 보라. public static int Maxstu |
경우에 따라 특정 클래스의 인스턴스의 수를 한정시킬 필요도 있다. 이와 같은 경우는 static 클래스로 구현하지 않고 생성자를 private하게 노출을 하고 대신 static멤버로 인스턴스를 생성하여 생성된 인스턴스를 참조할 수 있는 구조로 구현이 가능하다. 물론, 이는 하나의 방법일 뿐 정답이 될 수는 없다. 다음은 MSDN의 sigleton 예제이다.
using System; |
*참고: Escort CSharp은 대부분의 자료를 MSDN을 참고하였으며 MSDN보다 나을 수가 없다.
'언어 자료구조 알고리즘 > C# 언어 문법' 카테고리의 다른 글
17. 인터페이스(Interface) (0) | 2009.08.19 |
---|---|
16. 다형성 (0) | 2009.08.19 |
15. 상속 (0) | 2009.08.19 |
13.메소드 (0) | 2009.08.19 |
12. 속성(Property) (0) | 2009.08.19 |
11.Class (0) | 2009.08.19 |
10.Casting (0) | 2009.08.19 |
9.String (0) | 2009.08.19 |
8. Object (0) | 2009.08.19 |
7. 배열 (0) | 2009.08.19 |