C#에서 static 이해하기: 문제 해결 과정과 실전 예시

2024. 9. 23. 23:52카테고리 없음

static 에 관한 문제

main에 static이 달려 있다고 밑에 함수나 변수에 static을 다 붙여서 사용했다. 그로인해 개별 객체를 사용하지 못한 문제가 발생했다.

 

해결방법

함수나 변수에 붙어있는 static을 다 제거한 뒤에(현재 나는 static을 붙일만한 메서드나 필드가 없어서 다 제거한 상태이다.)  main에서 해당 클래스(Character, Village)에 대한 static 객체를 생성해준 후( 프로그램 전체에서 단 하나씩의 Character,  Village 객체만 생성해서 프로그렘 전체에서 관리하기 편하게 만들었다. ex) public static Character character = new Character(); ) 그 객체를 통해 클래스에 있는 메서드나 필드에 접근할 수 있게 만들어줬다.

 

알게된점

static 이란?

1. 변수나 함수, 클래스에 정적 속성을 부여하는 것으로 클래스로부터 객체를 생성하지 않고 변수나 함수를 호출할 수 있도록 해주는 것이다.

 

2. static이 붙어있는 메서드나 필드 해당 클래스가 처음 사용될 때 메모리에 할당됩니다. 그렇기 때문에 객체를 생성하지 않고도 사용이 가능합니다. 하지만, static 메서드는 일반 필드(인스턴스 필드)를 사용할 수 없습니다. 그 이유는 static 메서드는 이미 메모리에 할당된 상태이지만, 일반 필드는 아직 객체가 생성되지 않아 메모리에 할당되지 않았기 때문입니다. 그래서 static 메서드가 일반 필드에 접근할 수 없는 것입니다.

 

3. static 메서드나 필드는 클래스 전체에서 공유되는 기능이나 데이터를 처리할 때 또는 프로그램 내에서 공통으로 사용되는 데이터들을 관리할 때 주로 사용됩니다.

 

static 메서드

1. main이 static 메서드로 되어있는 이유 = 프로그램 실행 시 Program 클래스의 인스턴스를 만들지 않고도 바로 실행되도록 하기 위해서입니다.

 

2. 객체의 상태(필드 값 등)에 의존하지 않는 독립적인 기능을 구현할 때 사용됩니다.

 

예시)

using System.Runtime.CompilerServices;

namespace Text_static
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Sparta sparta = new Sparta();

            for(int i = 0; i < 10; i++)
            {
                sparta.Submit();
                Console.WriteLine(Sparta.AssignmentCount());
            }
        }
    }

    class Sparta
    {
        public static int assignment = 0;

        public static string AssignmentCount()
        {
            return $"{assignment}번 과제 했습니다";
        }

        public void Submit()
        {
            assignment++;
            Console.WriteLine("과제 제출했습니다");
        }
    }
}

//출력결과

과제 제출했습니다
1번 과제 했습니다
과제 제출했습니다
2번 과제 했습니다
과제 제출했습니다
3번 과제 했습니다
과제 제출했습니다
4번 과제 했습니다
과제 제출했습니다
5번 과제 했습니다
과제 제출했습니다
6번 과제 했습니다
과제 제출했습니다
7번 과제 했습니다
과제 제출했습니다
8번 과제 했습니다
과제 제출했습니다
9번 과제 했습니다
과제 제출했습니다
10번 과제 했습니다

 

static 필드

1. 클래스 차원에서 하나의 값을 가집니다.

 

2. 여러 객체가 동일한 데이터를 공유해야 할 때 사용됩니다.

 

class Number
{
    public static int count = 0;

    public void Sum()
    {
        count++;
    }

}

 

internal class Program
{
    static void Main(string[] args)
    {
        Number number = new Number();
        
        for (int i = 0; i < 10; i++)
        {
            number.Sum();

            Console.WriteLine("i" + Number.count);
        }
    }
}

//출력결과

i1
i2
i3
i4
i5
i6
i7
i8
i9
i10