아디봉의.net

C# static 과 상수 본문

C#

C# static 과 상수

아디봉 2012. 9. 16. 18:48

static 키워드

 

static 멤버필드

모든 클래스에서 공부하기 위한 멤버를 선언하기 위해 사용한다.

eX) 학교의 컴퓨터실에 가보면 모든 컴퓨터는 하나의 패키지처럼 모든 요소를 하나씩 전부 가지고 있다. 그리고 컴퓨터내에 프린터까지 달려있다. 하지만 프린터는 하나밖에 없기에 모든 컴퓨터는 프린터를 공유해서 사용하는 형식이다. 이때 프린터는 static으로 잡혀 있는것이다.

 

주의점 1

- c#에서는 스태틱 에 접근할 때 반드시 클래스의 이름으로만 접근해야한다. 다른방법이 없다.

ex) using System;

public class StaticAccess2

{

public static int sint = 0;

public int nint = 0;

pulbic static void Main()
{

StaticAccess2 sa = new StaticAccess2();

sa.sint = 555; // 스태틱 틀리게 호출

staticAccess2.sint = 333; //스태틱 제대로 호출

}

}

 

주의점2

클래스의 이름 즉 데이터타입으로 직접접근 할 수 있는것은 public static 멤버필드뿐이다.

 

스태틱 멤버필드

- 모든 클래스에서 공유하기 위한 멤버를 선언하는데 사용

- 변수, 함수, 속성, 연산자에 사용할 수 있음

- 클래스 내의 모든 곳에서 사용할 수 있는 공유변수

 

static 멤버함수

스태틱 멤버함수는 클래스의 이름으로 접근가능하다.

public static 함수만 접근 가능하다.

 

ex) using System;

public class StaticMethodAccess

{

private static int sint = 100;

public int nint = 0;

public static void SetStaticInt(int x)

{

Sint =x;

}

public static int GetStaticInt()

{

return sint;

}

public static void Main()

{

StaticMethodAccess.setStaticInt(3333);

int s = StaticMethodAccess.GetStaticInt();

Console.WriteLine("static값은:"  + s);

}//main

}//class

 

스태틱 멤버 함수에서 주의할점

- 스태틱 함수를 이용해서 일반 멤버 필드에 접근불가

- 일반 멤버 필드는 객체생성 후에 존재하기 때문에 스태틱 함수에서는 접근불가

 

 

스태틱생성자

스태틱 생성자는 스태틱멤버 필드의 메모리가 생성된 직후 호출되는 스태틱 전용의 생성자함수이다. 이러한 이점을 이용해서 스태틱 멤버들을 초기화하는데 사용한다.

ex) using System;

class StaticConst{

public static int sInt = 0;

static StaticConst() // static 생성자

{

sInt = 10;

Console.WriteLine("sInt="+sInt+": static생성자!!!");

}

public Staticconst() //디폴트생성자

{

//

}

}

 

class StaticConstTest{

public static void Main()

{

int a = StaticConst.sInt;

}//main

}//class

 

메인함수에서 StaticConst 클래스의 객체를 생성하지 않았다. 단지 StaticConst의 스태틱 멤버필드에 접근했을뿐이다. 스태틱 클래스의 이름으로 스태틱 멤버필드를 사용하면 자동으로 스태틱 메모리가 생성되며 그와 동시에 스태틱 생성자 또한 호출되는 것을 확인할 수 있다.

 

스태틱 생성자의 특징

- 접근제어를 사용할 수 없음

- 매개변수를 가질 수 없음

 

매개변수를 사용할수 없는 이유는 스태틱에 접근하는 순간 스태택틱 생성자는 자동으로 호출된다. 이런한 것은 구조체의 디폴트 생성자와 비슷한 면이 있다.

구조체의 디폴트 생성자를 재정의 할 수 없다. 이유는 값타입의 변수는 선언과 동시에 자동으로 디폴트 생성자가 호출되기 때문에 디폴트 생성자를 재정의 할 수 없다는 것이다.

 

Main함수가 스태틱 함수인 이유는

- 실행 클래스의 객체가 생성되기 이전에CLR이 Main()함수에 접근해야하기 때문이다.

 

 

'C#' 카테고리의 다른 글

C#에서의 포인터 사용  (0) 2012.09.17
C# const 상수  (0) 2012.09.17
call by XXX  (0) 2012.09.16
프로그램과 메모리 , 스택과 힙  (1) 2012.09.16
구조체와 클래스의 차이  (0) 2012.09.14