C#
C# 아이콘

둘의 차이점을 모르고 두 가지를 사용하다보면 여러 명이서 개발할 경우 큰 문제를 발생 시킵니다. 예를들어서 변경되면 안되는 값을 static으로 선언해서 누군가 한명이 변경하여 프로젝트에 큰 손실을 낼 수 있습니다. 그렇기 때문에 static과 const가 무엇인지 알아보고, 차이점을 비교하는 시간을 갖도록 하겠습니다.


[static이란?]

하나의 객체의 종속되는 것이 아닌 클래스 자체에 속하는 문법입니다. 그렇기에 static으로 선언된 변수는 객체가 아무리 많더라도 클래스당 1개밖에 가지지 못합니다.

  • 객체가 생성되지 않아도 클래스의 이름을 통해 접근이 가능 합니다.
  • 모든 객체가 하나의 변수를 공유해야 하는 상황에서 많이 쓰임니다.
class MyClass
{
    public static int StaticVariable = 10;
}

MyClass.StaticVariable = 20; // 클래스 이름을 통해 접근

위 예시는 클래스의 이름을 통해 정적 변수에 접근하고 변경하는 예시 입니다.

  • 정적변수 뿐만 아니라 메서드도 선언이 가능합니다.
class MathUtility
{
    public static int Add(int a, int b)
    {
        return a + b;
    }
}

int result = MathUtility.Add(5, 7); // 클래스 이름을 통해 정적 메서드 호출

정적 메서드를 호출하는 예시 입니다.

  • 정적 클래스도 마찬가지로 생성이 가능하며, 객체를 생성할 수 없습니다. 또한 변수나 메서드가 무조건 static이여야 합니다.
static class MathUtility
{
    public static int StaticVariable = 10;
    public static int Add(int a, int b)
    {
        return a + b;
    }
}

정적 클래스는 보통 유틸리티 클래스를 만들 때 사용합니다.

언제 사용해야 할까?

  • 앞서 말씀드렸듯이 유틸리티 클래스를 만들때 어디서든 쉽게 사용하고 싶을 때 사용합니다.
public static class MathUtility
{
    public static int Add(int a, int b)
    {
        return a + b;
    }

    public static int Multiply(int a, int b)
    {
        return a * b;
    }
}
int sum = MathUtility.Add(5, 3);
int product = MathUtility.Multiply(4, 7);
  • 객체의 상태나 객체의 수를 공유 하기 위해서 사용하기도 합니다.
using System;

public class UIPopupManager
{
    private static int popupCount = 0; // 정적 변수로 팝업 갯수를 추적

    // 팝업을 열 때 호출되는 메서드
    public static void ShowPopup()
    {
        popupCount++;
        Console.WriteLine($"팝업이 열렸습니다. 현재 팝업 갯수: {popupCount}");
    }

    // 팝업을 닫을 때 호출되는 메서드
    public static void ClosePopup()
    {
        if (popupCount > 0)
        {
            popupCount--;
            Console.WriteLine($"팝업이 닫혔습니다. 현재 팝업 갯수: {popupCount}");
        }
        else
        {
            Console.WriteLine("열린 팝업이 없습니다.");
        }
    }
}

class Program
{
    static void Main()
    {
        UIPopupManager.ShowPopup();  // 팝업을 열고 갯수 증가
        UIPopupManager.ShowPopup();  // 다른 팝업을 열고 갯수 증가
        UIPopupManager.ClosePopup(); // 팝업을 닫고 갯수 감소
        UIPopupManager.ClosePopup(); // 다른 팝업을 닫고 갯수 감소
        UIPopupManager.ClosePopup(); // 열린 팝업이 없다고 표시

        Console.ReadLine();
    }
}

위 예시는 UI 팝업의 갯수를 파악하는 코드입니다. 이러한 형태로 각 객체들이 공유해야하는 정보가 필요할 때 사용합니다.

정리해 보자면 유틸리티 클래스나, 객체간 상태를 공유하기 위해서 사용 됩니다.

[const란?]

상수를 정의하는데 사용하는 문법 입니다. 상수란 한번 값이 설정되면 변경할 수 없는 것을 말합니다.

const를 사용할 경우 컴파일러는 상수로 판단하기 때문에 값 변경이 없는 수라고 판단하여 성능 향상에 도움이 됩니다.

언제 사용할까?

  • 매직 넘버 대체
    • 매직 넘버는 그 자체로 의미나 용도를 명확게 표현하지 않는 숫자를 말합니다.
public class Constants
{
    public const int MaxRetryAttempts = 3;
    public const double Pi = 3.141592653589793;
}

class Program
{
    static void Main()
    {
        int retryCount = Constants.MaxRetryAttempts;
        double circleArea = Constants.Pi * Math.Pow(5, 2);
    }
}

위와 같이 3.14란 값을 const로 명확히 표기하여 가독성을 올리는 역할로 사용 됩니다.

  • 프로그램에서 여러번 사용되는 값을 const로 대체
public class Messages
{
    public const string WelcomeMessage = "Welcome to our application!";
    public const string Error404 = "Page not found.";
}

class Program
{
    static void Main()
    {
        Console.WriteLine(Messages.WelcomeMessage);
        // 다른 부분에서도 사용 가능
        DisplayErrorMessage(Messages.Error404);
    }

    static void DisplayErrorMessage(string message)
    {
        Console.WriteLine($"Error: {message}");
    }
}

페이지를 찾을 수 없을 때 에러나 앱을 켰을 때 문구등은 다른 곳에서 여러번 쓰일 수 있기 때문에 const를 이용하면 하나의 값을 모두 공유하기 때문에 값만 변경해 주면 손쉽게 변경이 가능하다는 장점이 있습니다. 또한 문자열의 오타를 막아준다는 장점도 존재 합니다.

[둘의 차이점은?]

여기까지 읽으셨다면 const도 공통된 값을 이용할 때 사용하고 static도 공통된 값을 이용할 때 사용할 수 있는데 어떤 상황에 무엇을 사용해야 할지 의문이 드실 수 있을 겁니다.

결론만 말하면 값 변경이 없다면 const를 사용하시는 것을 추천드립니다. 앞선 예시와 같이 오류 메세지는 런타임에 변경될 가능성이 없기 때문에 const로 사용하고 팝업의 갯수를 파악하는 경우에는 런타임에 값 변경이 있기 때문에 static을 사용하는 것이 옳습니다.

값변경이 없을 때도 static을 사용해도 기능상 문제는 없습니다. 하지만 값변경이 가능하기에 변경하면 안되는 경우에 같이 협업하는 경우 다른 사람이 값을 변경하게 되면 문제가 발생할 수 있습니다.(값 변경의 필요가 없다면 굳이 가능성을 열어둘 필요는 없습니다.)

또한 아까 말했듯이 const는 성능 상 이점이 있습니다.

[마무리]

이 두 가지는 사용 상황이 겹치는 부분이 있다보니 처음에 사용하실 때 정확한 이해 없이 혼용해서 사용하는 경우가 많습니다. 하지만 이 글을 읽고나서 정확하게 사용하여 우려하는 문제가 발생하지 않았으면 합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다