Static이란?
- C#에서 static은 메서드나 필드가 클래스의 인스턴스가 아닌 클래스 자체에 소속되도록 지정하는 한정자.
- static 필드는 객체 선언과 동기에 메모리가 할당되며 해당 클래스가 처음 사용될 때 한번 초기화되어 계속 동일한 메모리를 사용함. (일반적인 필드들이 객체가 새로 생성될 때 메모리가 초기화되는 것과는 다름)
예제 1
namespace Static
{
public class StaticTest
{
public static int staticNum = 0;
public int num = 0;
public StaticTest() //생성자
{
staticNum++;
num++;
}
public void ShowMe()
{
Console.WriteLine($"StaticNum : {staticNum}, num : {num}");
}
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
StaticTest st = new StaticTest();
st.ShowMe();
}
}
}
}
일반 필드인 num은 계속 초기화되어서 1을 반환하고 static 필드 staticNum은 메모리가 초기화되지 않고 계속 더해짐.
예제 2
namespace Static
{
public class Program
{
static void Main(string[] args)
{
Car.Sonata(); //Static(정적) 메소드는 인스턴스를 만들지 않고 바로 호출 가능
Car car = new Car(); //Static( 정적) 메소드가 아니면 인스턴스를 만들어야 함.
car.Genesis();
}
public class Car
{
int speed = 0;
static int km = 0;
public static void Sonata()
{
speed = 100; //Sonata매서드는 이미 static 메모리에 올라갔는데 speed는 new 생성자를 사용하기 전에 안올라가기 때문에 오류가 남.
km = 10000; //static 키워드가 붙은 함수나 클래스에서는 static 키워드가 붙은 것들 끼리만 참조가능
}
public void Genesis()
{
speed = 200;
km = 20000;
}
}
//내부데이터를 이용할 일이 있는 경우 인스턴스 메소드 사용
//내부테이터를 이용할 일이 없는경우 정적 메소드 사용
}
}
클래스에 소속된 필드(static) : static int km
인스턴스에 소속된 필드 : int speed
Static(정적) 메서드 Sonata()는 클래스의 이름을 통해 인스턴스를 만들지 않고 직접 필드에 접근 가능함.
Car.Sonata()
인스턴스 메서드인 Genesis()는 인스턴스를 만들어야 필드에 접근 가능함.
Car car = new Car()
car.Genisis();
정적 메소드인 Sonata()의 speed 필드가 오류가 나는 것은 아직 인스턴스가 만들어지지 않았기 때문
(결과적으로 static 키워드가 붙은 매서드나 클래스에서는 static 키워드가 붙은 것들끼리만 참조가 가능함)
그렇다면 static 은 언제 사용해야 하는지?
static 필드는 사용을 하던 안 하던 프로그램의 시작과 끝까지 메모리에 할당되어 있어서 메모리에 악영향을 줄 수 있음.(가비지 컬렉터가 회수하지 않음)
하지만 그렇다고 static이 무조건 나쁜 것은 아니고 프로그램 전체에 걸쳐서 공유해야 하는 필드가 있다면 static을 이용
참고
'C#' 카테고리의 다른 글
[C# Study] 용어 정리중... (0) | 2022.08.25 |
---|---|
[C# Study] 메서드(method) (0) | 2022.08.24 |
[C# Study] 생성자(Constructor) (0) | 2022.08.23 |