아래 글은 C# 문법 관련 개념 정리 및 작성자 공부를 위해 작성되었습니다.

 

 

📃 참고자료

* 위 링크를 참고해서 아래 글을 작성했습니다.

 

 

# static이란?

  • static은 변수나 메소드에 키워드로 사용된다.
  • static 키워드를 사용한 변수는 클래스가 메모리에 올라갈 때 자동으로 생성이 된다.
    - 스택틱 변수는 객체를 선언만 해도 메모리가 할당되며 일반적인 변수들이 객체가 새로 생성될 때
      메모리가 초기화 되는 것과 다르게 해당 객체를 계속 반복적으로 생성해도 메모리가 유지 된다는 특징이 있다.
  • 인스턴스(객체) 생성 없이 바로 사용 가능하다.
  • 객체를 생성하지 않아도 되니까 편리하고 속도도 빠르다.

 

# static 키워드를 사용하는 이유?

  • 자주 변하지 않는 일정한 값(정적 값) 혹은 설정 정보 같은 공용자원에 대한 접근에 있어서 매번 메모리에 로딩 혹은
    값을 읽어 들이는 것보다 일종의 '전역 변수'와 같은 개념을 통해서 접근하는 것이다.
  • 인스턴스 생성 없이 사용 가능하기 때문에 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 사용한다.
  • 클래스의 일반 멤버 변수는 클래스의 객체가 생성될 때, 각 객체마다 따로 생기지만, 정적 변수는 해당 클래스가 처음으로 사용되는 때에 한번만 초기화되어 계속 동일한 메모리를 사용하게 된다.

 

 

 

 

# static (정적) 메서드

  • 정적(Static) 메서드는 인스턴스 메서드와는 달리 클래스로부터 객체를 생성하지 않고
    직접 [클래스명.메서드명] 형식으로 호출하는 메서드이다.
  • 메서드 앞에 static C# 키워드를 적어주며, 메서드 내부에 클래스의 인스턴스 객체 멤버를 참조해서는 안된다.
  • static 메서드는 인스턴스 객체로부터 호출될 수 없으며, 반드시 클래스명과 함께 사용된다.

 

* 예제코드

public class MyClass
{
   private int val = 1;
   
   // 인스턴스 메서드
   public int InstRun()
   {
      return val;
   }
   
   // 정적(Static) 메서드
   public static int Run() 
   {
      return 1;
   }
}

public class Client
{
   public void Test()
   {
      // 인스턴스 메서드 호출
      MyClass myClass = new MyClass();
      int i = myClass.InstRun();

      // 정적 메서드 호출
      int j = MyClass.Run();
   }
}

 

 

# static (정적) 속성, 필드

  • 클래스 내의 Non-static 필드들은 클래스 인스턴스를 생성할 때 마다 메모리에 매번 새로 생성되게 되는 반면,
    static 필드는 프로그램 실행 후 해당 클래스가 처음으로 사용 될 때 한번 초기화되어 계속 동일한 메모리르 사용.

 

* 예제코드

// static 필드
protected static int _id;

// static 속성
public static string Name { get; set; }

 

 

# static 클래스

  • static 클래스는 모든 클래스 멤버가 static 멤버로 되어 있으며, 클래스명 앞에 static 이라는 C# 키워드를 사용.
  • static 클래스는 public 생성자(Constructor)를 가질 수 없지만, static 생성자를 가질 수 있다.
    - static 클래스는 객체를 생성할 수 없기 때문이다.
  • static 생성자는 주로 static 필드들을 초기화 하는데 사용한다.
  • static 생성자는 액세스 한정자를 사용할 수 없으며, 매개변수 역시 가질 수 없다.

 

* 예제코드

// static 클래스 정의
public static class MyUtility
{
   private static int ver;

   // static 생성자
   static MyUtility()
   { 
      ver = 1;
   }

   public static string Convert(int i)
   {
      return i.ToString();
   }

   public static int ConvertBack(string s)
   {
      return int.Parse(s);
   }
}

// static 클래스 사용
static void Main(string[] args)
{
   string str = MyUtility.Convert(123);
   int i = MyUtility.ConvertBack(str);
}

 

# 스태틱의 장, 단점

장점

- 프로그램이 종료되기 전까지 메모리를 해제 하거나 객체를 생성하지 않아도, 멤버에 접근이 가능하다는 장점이 있다.

 

단점

- 여러곳에서 스태틱 멤버를 동시에 참조하게 될 경우에는 객체 지향에 벗어난 개념이 안좋다.

반응형

+ Recent posts