c#) 스태틱 Static 변수,메서드,클래스
스태틱Static 변수
스태틱 변수는 객체를 선언만 해도 메모리가 할당되며 일반적인 변수들이 객체가 새로 생성될 때 메모리가 초기화 되는 것과 다르게 해당 객체를 계속 반복적으로 생성해도 메모리가 유지 된다는 특징이 있다.
테스트를 해봤다
public class Myclass
{
private static int stNum= 0;
private int num = 0;
public Myclass()
{
stNum++;
num++;
}
public void Showtest()
{
Console.WriteLine("stNum: {0}, num : {1}", stNum, num);
}
}
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
Myclass test = new Myclass();
test.Showtest();
}
}
}
일반 변수인 num의 값은 변하지 않지만 Static으로 선언한 stNum은 메모리를 초기화 하지 않고 계속 더해 지고 있다.
=> static 필드는 프로그램 실행 후 해당 클래스가 처음으로 사용될 때 한번 초기화되어
계속 동일한 메모리를 사용하게 된다.
스태틱Static 메소드
Static메소드는 객체가 메모리를 할당 받기 전에 호출이 되기 때문에 객체 생성 후 메모리 할당을 받는 일반 변수에 접근이 불가능하다. 인스턴스 메소드와 다르게 클래스로 객체를 따로 생성하지 않고 [클래스명.메서드명]이런식으로 호출하게 된다.
호출 시 일반 인스턴스 메서드와 달리 클래스로 부터 객체를 생성하지 않고 직접 호출한다.
일반 인스턴스 메서드는 클래스로부터 객체를 생성하고 메서드를 호출해야하지만
static메서드는 [클래스명.메서드명]으로 메서드를 호출한다.
static메소드 내부에서 객체 멤버를 호출 할 수없다.
인스턴스 메서드는 스태틱메서드 멤버를 참조가 가능하지만 스태틱메서드는 다른 멤버 참조가 불가능하다.
스태틱Static 클래스
Static 클래스는 모든 클래스 멤버가 static 멤버로 되어 있으며, 클래스명 앞에 static이 붙는다.
다른 일반 클래스와 다르게 static생성자를 갖는다. 이 생성자는 보통 static필드를 초기화 할 때 사용한다.
테스트를 해보았다.
static 멤버 호출
객체 생성 불가
static는 인스턴스화 하지 않는 클래스이기 때문에 객체생성이 불가능하다.
스태틱객체는 프로그램이 종료되기 전까지 메모리를 해제하지 않고 객체를 생성하지 않고도 멤버에 접근이 가능하다는 장점 (특징)을 잘 활용해야 할 것같다. 하지만 단점으로 여러군데서 스태틱 멤버를 동시에 참조하게 될 경우와 객체 지향에 벗어난 개념이 되어 안좋다는 시선도 있다고 한다. 다른 장단점을 알아 볼 필요가 있겠다.
참조 : http://www.csharpstudy.com/csharp/CSharp-static.aspx 사이트
http://ronniej.sfuh.tk/ , http://mygumi.tistory.com/253 ,http://blog.acronym.co.kr/347 블로그