본문 바로가기
우아한 코딩

[C#] 올바른 C# 상수형 사용

by 피크인사이트 2024. 2. 23.
반응형

 C#에는 상수형이 두 가지가 있습니다.

하나는 컴파일타임 상수, 그리고 다른 하나는 런타임 상수입니다.

이 두 상수형은 각각 다른 특성과 동작 방식을 가지고 있으며, 이에 따라 상황에 맞게 사용해야 합니다.

잘못 사용할 경우 코드의 수행 성능과 유지 보수에 문제가 생길 수 있습니다.

 

오늘은 이 두 가지 상수형에 대해 자세히 알아보고, 언제 어떤 상수를 사용해야 하는지에 대해 고민해 보겠습니다.

올바른 C# 상수형 사용


1. 컴파일타임 상수

컴파일타임 상수는 프로그램이 컴파일될 때 결정되는 상수를 의미합니다.

이러한 상수는 const 키워드를 사용하여 선언되며, 다음과 같은 특징을 가집니다.

[특징]

- 컴파일 시간 결정

  컴파일타임 상수의 값은 컴파일 시간에 이미 결정되어 있습니다.

 이는 프로그램 실행 중에 변경할 수 없음을 의미합니다.

- 메모리 상에 상수값 저장

  컴파일타임 상수는 상수값을 사용하는 모든 곳에 실제 값으로 대체되어 적용됩니다.

  따라서, 컴파일된 프로그램에는 해당 상수값이 메모리에 저장되지 않습니다.

[동작방법]

컴파일타임 상수는 const 키워드와 함께 선언되는데,

선언과 함께 반드시 초기화가 되어야 합니다.

다른 클래스나 메서드 내에서도 사용 가능하지만, 선언된 클래스 내부 또는 메서드 내부에서는 사용할 수 없습니다.

[선언방법] 

public class Constants
{
 public const int MaxValue = 100;
 }

[사용 예시]

컴파일타임 상수는 프로그램 전체에서 사용되는 상수값을 정의하는 데 유용합니다.

예를 들어, 수학 상수나 프로그램 설정 등이 해당됩니다.

아래는 컴파일타임 상수를 사용한 예시입니다

public class Circle
{
// 변수
 public const double PI = 3.14;
 private double radius;

// 반지름
 public Circle(double radius)
 {
    this.radius = radius;
 }

//원의 넓이
 public double CalculateArea()
 {
 return PI * radius * radius;
 }
}

위의 예시에서,

Circle 클래스는 반지름을 받아 원의 넓이를 계산하는 기능을 제공합니다.

이때 원주율인 PI는 컴파일타임 상수로 정의되어 있으며, Circle 클래스 내부에서 사용됩니다.


2. 런타임 상수

런타임 상수는 프로그램이 실행 중에 결정되는 상수를 의미합니다. 이러한 상수는 readonly 키워드를 사용하여 선언되며, 다음과 같은 특징을 가집니다.

[특징]

- 런타임 결정

  런타임 상수의 값은 프로그램이 실행될 때 결정됩니다.

  이는 객체가 생성될 때나 생성자가 호출될 때 초기화될 수 있음을 의미합니다.

- 메모리에 저장

  런타임 상수는 실제 값이 메모리에 저장됩니다.

 따라서, 해당 상수를 사용하는 모든 곳에서는 실제 값을 참조합니다.

[동작방법]

런타임 상수는 readonly 키워드와 함께 선언됩니다.

선언 시 또는 생성자 내에서 초기화되어야 합니다.

초기화 이후에는 값을 변경할 수 없습니다.

[선언방법]

public class Constants
{
 public readonly int MaxValue;


 public Constants()
 {
 MaxValue = 100;
 }

[사용 예시]

런타임 상수는 객체가 생성될 때 초기화되는 값이나 외부 데이터를 활용하여 초기화해야 하는 경우에 유용합니다.

아래는 런타임 상수를 사용한 예시입니다.

public class Configuration
{
 public readonly string ServerUrl;


 public Configuration(string serverUrl)
 {
 ServerUrl = serverUrl;
 }
}


// 객체 생성 시 초기화
Configuration config = new Configuration("https://example.com");

 

위의 예시에서, Configuration 클래스는 서버 URL을 저장하는 기능을 제공합니다.

이때 서버 URL은 런타임 상수로 정의되어 있으며, 객체가 생성될 때 생성자를 통해 초기화됩니다.

이후에는 해당 값이 변경되지 않습니다.

 


정리하기

결론적으로 프로그램 개발자가 상수를 선택할 때는 프로그램의 요구사항과 사용 사례를 고려하여 컴파일타임 상수와 런타임 상수 중 하나를 선택하여야합니다.

다시 한번 정리하면,

첫 번째, 컴파일타임 상수(const)는 값이 컴파일 시간에 결정되고 프로그램 전체에서 사용되는 상수값을 정의할 때와 상수 값이 외부 데이터에 의존하지 않고 변하지 않는 경우에 적합합니다.

장점으로는 성능에 영향을 미치지 않으며, 코드를 읽고 이해하기 쉽습니다.

두 번째, 런타임 상수(readonly)는 객체가 생성될 때 초기화되는 값이나 외부 데이터를 활용하여 초기화해야 하는 경우에 유용합니다.

그리고 선언 시 또는 생성자 내에서 초기화되며, 이후에는 변경할 수 없습니다.

 

따라서, 프로그램의 특성과 요구사항에 따라 적절한 상수를 선택하여 사용하여야 하며, 코드의 가독성과 성능을 고려하여 최적의 상수를 선택하는 것이 중요합니다.

반응형