C#에서 const와 readonly의 차이점

2024-07-27

초기화 타이밍:

  • const: 변수 선언 시 반드시 초기화 값을 지정해야 합니다. 컴파일 시점에 값이 결정됩니다.
  • readonly: 변수 선언 시 또는 생성자에서 초기화 값을 지정할 수 있습니다. 런타임 시점에 값이 결정됩니다.

메모리 저장 방식:

  • const: 컴파일러에 의해 직접 코드에 값을 저장하므로 별도의 메모리 할당이 필요하지 않습니다.
  • readonly: 일반 변수와 동일하게 메모리에 할당됩니다.

접근 범위:

  • const: 기본적으로 static 특성을 가지므로 클래스 레벨에서 접근 가능합니다.
  • readonly: 일반 변수와 동일하게 인스턴스 레벨에서만 접근 가능합니다.

사용 시점:

  • const: 절대 변하지 않는 값, 예를 들어 상수, Pi 값 등에 사용합니다.
  • readonly: 초기화 후 변경되지 않도록 해야 하는 값, 예를 들어 파일 경로, 데이터베이스 연결 정보 등에 사용합니다.

사용 예시:

const double PI = 3.1415926535; // 절대 변하지 않는 상수 (컴파일 시점에 결정)

class MyClass
{
    private readonly string filePath;

    public MyClass(string filePath)
    {
        this.filePath = filePath; // 생성자에서 초기화 (런타임 시점에 결정)
    }
}

결론:

  • const는 컴파일 시점에 값이 결정되고 메모리 할당이 없이 코드에 직접 저장되는 반면, readonly는 런타임 시점에 값이 결정되고 일반 변수와 동일하게 메모리에 할당됩니다.
  • const는 기본적으로 static 특성을 가지고 클래스 레벨에서 접근 가능한 반면, readonly는 인스턴스 레벨에서만 접근 가능합니다.
  • const는 절대 변하지 않는 값에 사용하고, readonly는 초기화 후 변경되지 않도록 해야 하는 값에 사용하는 것이 좋습니다.



C# const와 readonly 예제 코드

const double PI = 3.1415926535; // 절대 변하지 않는 상수 (컴파일 시점에 결정)
const string FILE_PATH = @"C:\Users\Public\Documents"; // 경로 상수

class Math {
    public static double CalculateCircleArea(double radius) {
        return PI * radius * radius; // 상수를 사용하여 계산
    }
}

readonly 필드 선언:

class Person {
    private readonly string name;
    private readonly int age;

    public Person(string name, int age) {
        this.name = name;
        this.age = age;
    }

    public string GetName() {
        return name; // readonly 필드 값 반환
    }

    public int GetAge() {
        return age; // readonly 필드 값 반환
    }
}
void PrintPersonInfo(Person person) {
    const string format = "이름: {0}, 나이: {1}"; // 런타임 상수 (컴파일 시점에 결정되지 않음)

    string formattedInfo = string.Format(format, person.GetName(), person.GetAge());
    Console.WriteLine(formattedInfo);
}

설명:

  • 위 예제 코드에서는 constreadonly를 다양한 상황에서 사용하는 방법을 보여줍니다.
  • const 키워드는 절대 변하지 않는 값을 선언하는 데 사용되며, 컴파일 시점에 값이 결정됩니다.
  • readonly 키워드는 초기화 후 변경되지 않도록 해야 하는 값을 선언하는 데 사용되며, 런타임 시점에 값이 결정됩니다.
  • readonly 로컬 변수는 람다 식 또는 메서드 내에서 선언된 변수로, 해당 블록 내에서만 값을 변경할 수 없습니다.

주의:

  • const 변수는 선언 시 반드시 값을 초기화해야 하며, 후에 값을 변경할 수 없습니다.
  • readonly 변수는 선언 시 또는 초기화 후에 값을 변경할 수 있지만, 일반적으로 변경하지 않는 것이 좋습니다.



C#에서 const 및 readonly의 대체 방법

enum:

  • 열거형(enum)은 고정된 값 집합을 정의하는 데 사용되는 사용자 정의 데이터 형식입니다.
  • 상수와 유사하지만, const 키워드를 사용하지 않고 값을 정의할 수 있습니다.
  • 다음은 enum을 사용하는 예제입니다.
enum DayOfWeek {
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
}

static 클래스:

  • 정적 클래스는 인스턴스를 생성하지 않고 사용할 수 있는 클래스입니다.
  • 정적 클래스 내의 필드 및 메서드는 클래스 자체를 통해 직접 접근할 수 있습니다.
  • 다음은 정적 클래스를 사용하는 예제입니다.
static class MathUtils {
    public static double PI = 3.1415926535; // 상수를 정의
    
    public static double CalculateCircleArea(double radius) {
        return PI * radius * radius; // 상수를 사용하여 계산
    }
}

프로퍼티:

  • 프로퍼티는 클래스의 캡슐화된 데이터에 대한 접근을 제공하는 특수 메서드입니다.
  • 프로퍼티에 getset 접근자를 정의하여 값을 읽고 쓰도록 할 수 있습니다.
class Person {
    private string name;
    private int age;

    public string Name {
        get { return name; } // 프로퍼티 값 반환
        set { name = value; } // 프로퍼티 값 설정
    }

    public int Age {
        get { return age; } // 프로퍼티 값 반환
        set { age = value; } // 프로퍼티 값 설정
    }
}

사용 시 고려 사항:

  • constreadonly는 값을 변경할 수 없도록 하는 데 특화된 키워드입니다.
  • enum, 정적 클래스 및 프로퍼티는 다른 목적으로 사용될 수 있으며, 상황에 따라 적절하게 선택해야 합니다.
  • const 키워드를 사용해야 하는 경우에는 대체 방법을 사용하지 않는 것이 좋습니다. 컴파일러가 값을 코드에 직접 삽입하여 성능 향상을 제공하기 때문입니다.

c# .net constants



C#, .NET, LINQ를 사용한 DataTable 쿼리 프로그래밍

LINQ to DataSet을 사용하여 DataTable을 쿼리할 수 있습니다.AsEnumerable() 메서드 사용: DataTable을 IEnumerable<DataRow> 인터페이스를 구현하는 개체로 변환합니다...


C#에서 기본 생성자 호출에 대한 심층 설명

C#에서 기본 생성자 호출은 객체 지향 프로그래밍의 핵심 개념인 상속과 밀접한 관련이 있습니다. 상속을 통해 만들어진 자식 클래스는 부모 클래스의 특성을 물려받게 되는데, 이때 부모 클래스의 초기화를 위해 기본 생성자를 호출하는 것이 필수적입니다...


.NET에서 구조체(struct)와 클래스(class)의 차이점

1. 값 형식 vs 참조 형식:구조체: 값 형식으로, 변수에는 값 자체가 저장됩니다. 즉, 구조체 변수를 복사하면 새로운 값의 복사본이 만들어집니다.클래스: 참조 형식으로, 변수에는 객체의 메모리 위치를 참조하는 값이 저장됩니다...


C#을 사용하여 .NET을 통해 Gmail로 이메일 보내기

필수 조건:Gmail 계정.NET Framework가 설치된 컴퓨터Visual Studio 또는 기타 C# 개발 도구단계:Gmail 앱 비밀번호 생성: Gmail 계정에 로그인합니다. "보안" 탭을 클릭합니다. "앱 비밀번호"를 선택합니다...


C#, .NET 및 Reflection을 사용하여 코드가 있는 어셈블리 경로 가져오기

1. Assembly. GetExecutingAssembly() 사용:이 방법은 가장 간단하고 일반적으로 사용되는 방법입니다. 다음 코드와 같이 사용됩니다.이 코드는 현재 실행 중인 어셈블리의 위치를 가져옵니다. 이 방법은 대부분의 경우 충분하지만 다음과 같은 몇 가지 제한 사항이 있습니다...



c# .net constants

C#, .NET, DateTime을 이용한 나이 계산

해결 방법:DateTime 타입 변수 선언: 생일을 저장할 DateTime 타입 변수 birthday를 선언합니다. 예시: DateTime birthday = new DateTime(1990, 1, 1);DateTime 타입 변수 선언:


C#에서 사전을 값으로 정렬하는 방법

1. Linq 사용하기LINQ(Language Integrated Query)는 C#에 내장된 기능으로, 데이터 쿼리 및 변환을 쉽게 수행할 수 있도록 합니다. 사전을 값으로 정렬하려면 다음과 같은 코드를 사용할 수 있습니다


C#, .NET 및 성능과 관련된 Type에서 새 개체 인스턴스를 만드는 방법

1. new 키워드 사용:위 코드는 MyClass 형식의 새 인스턴스를 myObject 변수에 할당합니다. new 키워드는 메모리에 새 개체를 할당하고 해당 클래스의 생성자를 호출합니다.2. Activator 클래스 사용:


C#에서 String과 string의 차이점

1. String 클래스String은 . NET Framework의 기본 문자열 클래스입니다. 문자열 데이터를 다루기 위한 다양한 메서드와 속성을 제공하며, 다음과 같은 특징을 가집니다.불변: String 객체는 생성 후 변경할 수 없습니다


Entity Framework 대 LINQ to SQL: .NET 프로그래밍 비교

1. 개요LINQ to SQL:2008년 . NET Framework 3.5에 도입된 최초의 . NET ORMSQL Server에만 국한비교적 단순하고 사용하기 쉬움Visual Studio 디자이너 도구 제공2008년