본문 바로가기
Programming Language/C#

[C#] 정적 필드와 메소드

by dbxxrud 2019. 5. 18.

static - 사전적으로 '정적'이라는 뜻을 갖고 있다. 움직이지 않는다는 뜻이며, C#에서 static은 메서드나 필드가 클래스의 인스턴스가 아닌 클래스 자체에 소속되도록 지정하는 한정자이다.

 


 

static 속성, 필드

 

 

 

정적(static) 속성 및 필드는 [클래스명. 필드명]과 같이 사용한다. Non static 필드들은 클래스 인스턴스를 생성할 때마다 메모리에 매번 새로 생성하게 되는 반면, static 필드는 프로그램 실행 후 해당 클래스가 처음으로 사용될 때 한번 초기화되어(프로그램 종료 시 해제) 계속 동일한 메모리를 사용하게 된다.

 

그렇다면 정적 필드를 만들어서 얻게 되는 이득은 무엇일까? static으로 수식한 필드는 프로그램 전체에 걸쳐 하나밖에 존재하지 않는다. 프로그램 전체에 걸쳐 공유해야 하는 변수가 있다면, 정적 필드를 이용하면 된다. 게임 내에서는 새로운 씬이 로드되더라도 보존해야 하는 점수 같은 변수를 보존해야 할 때 이용하면 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;
using static System.Console;
using System.Collections;
using System.Linq;
 
namespace AS
{
    class Global
    {
        public static int Count = 0;
    }
    class ClassA
    {
        public ClassA()
        {
            Global.Count++;
        }
    }
    class ClassB
    {
        public ClassB()
        {
            Global.Count++;
        }
    }
    class MainApp
    { 
        public static void Main(string[] args)
        {
            WriteLine($"Global.Count : {Global.Count}");
 
            new ClassA();
            new ClassB();
            new ClassA();
            new ClassB();
 
            WriteLine($"Global.Count : {Global.Count}");
        }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs

 


 

static 메서드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using static System.Console;
using System.Collections;
using System.Linq;
 
namespace AS
{
    class MyClass
    {
        private int val = 1;
        
        // 인스턴스 메서드
        public int InstRun()
        {
            return val;
        }
        // 정적(static) 메서드
        public static int Run()
        {
            return 1;
        }
    }
    class MainApp
    { 
        public static void Main(string[] args)
        {
            // 인스턴스 메서드 호출
            MyClass myClass = new MyClass();
            int i = myClass.InstRun();
 
            // 정적 메서드 호출
            int j = MyClass.Run();
        }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs

 

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

 

 


 

static 클래스

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
using static System.Console;
using System.Collections;
using System.Linq;
 
namespace AS
{
    // 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);
        }
    }
    class MainApp
    { 
        public static void Main(string[] args)
        {
            // static 클래스 사용
            string str = MyUtility.Convert(123);
            int i = MyUtility.ConvertBack(str);
        }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs

 

static 클래스는 모든 클래스 멤버가 static 멤버로 되어 있으며, 클래스명 앞에 static이라고 사용하여 정의한다. static 클래스는 public 생성자를 가질 수 없다. static 클래스는 객체를 생성할 수 없으며, static 생성자를 가질 수 있다. static 생성자는 주로 static 필드를 초기화하는 데 사용한다. 


 

언제 인스턴스 메서드와 정적 메서드를 써야 할까?

 

보통 객체 내부의 데이터를 이용해야 하는 경우에는 인스턴스 메서드를 선언하고, 내부 데이터를 이용할 일이 없는 경우에는 별도의 인스턴스 생성 없이 호출할 수 있도록 메서드를 정적으로 선언한다.

 

 

 

 

 

※ 공부하며 정리하는 블로그 입니다.

   참고 - 이것이 C# 이다, http://www.csharpstudy.com/csharp/CSharp-static.aspx

'Programming Language > C#' 카테고리의 다른 글

[C#] 상속  (0) 2019.05.18
[C#] 접근 한정자  (0) 2019.05.18
[C#] 생성자와 종료자  (0) 2019.05.18
[C#] 클래스  (0) 2019.05.18
[C#] 메소드 오버로딩  (0) 2019.05.18