Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
05-17 00:00
관리 메뉴

nomad-programmer

[Programming/C#] const (상수화)와 readyonly (읽기전용)의 차이점 본문

Programming/C#

[Programming/C#] const (상수화)와 readyonly (읽기전용)의 차이점

scii 2020. 9. 29. 16:16

C# 에서 const와 readonly는 상수형 타입이다. 

  • const : 컴파일 상수
  • readonly : 런타임 상수

const

  • 컴파일 타입의 상수이다. 컴파일 시 const 변수의 값을 가져온다.
  • 내장자료형 (정수형, 실수형, Enum, String)에 대해서만 사용할 수 있다.
  • 변수 선언과 동시에 값을 할당 해야 한다.
  • 메모리 할당 위치는 heap memory이다. const는 선언과 동시에 static이 컴파일러에 의해 자동으로 붙게된다. (정적 필드가 됨)
using System;

namespace CSharpExample
{
    class Foo
    {
        // 선언과 동시에 static이 컴파일러에 의해 자동으로 붙게되어 
        // 정적 필드가 된다.
        const int bar = 55;
        public int Bar => bar;
    }

    internal class MainApp
    {
        static int Main(string[] args)
        {
            Foo foo = new Foo();

            Console.WriteLine(foo.Bar);

            return 0;
        }
    }
}


/* 결과

55

*/

readonly

  • 런타임 타입의 상수이다. exe 또는 dll을 사용할 때 변수의 값을 가져온다.
  • 모든 자료형에 사용할 수 있으며, 생성과 동시에 초기화할 필요는 없다.
  • 단, 생성자 단계에서 단 한번 할당을 통해 초기화할 수 있다.
  • 메모리 할당 위치는 stack memory이다. 허나 static 선언을 이용하면 heap memory에 저장 가능하다.
using System;

namespace CSharpExample
{
    class Foo
    {
        // static 키워드를 이용하면 정적 필드로 만들 수 있다.
        readonly int bar;

        public Foo() => bar = 5;
        public Foo(int val) => bar = val;

        public int Bar => bar;
    }

    internal class MainApp
    {
        static int Main(string[] args)
        {
            Foo foo = new Foo(55);
            Console.WriteLine(foo.Bar);

            Foo foo2 = new Foo(12);
            Console.WriteLine(foo2.Bar);

            return 0;
        }
    }
}


/* 결과

55
12

*/

const보다 readonly가 좋은 이유?

const는 heap memory에 저장 되기 때문에 접근이 빠르다는 장점이 있지만 const는 컴파일 상수이기 때문에 const 변수 값이 바뀌는 경우 해당 프로젝트 뿐만 아니라 참조 받거나 영향을 받는 프로젝트 모두 "재 컴파일을 해야 하는" 단점이 있다.

readonly는 생성시 선언하지 않아도, 생성자에서 초기화하여 사용할 수 있기 때문에 보다 유연하며, 실제 사용하는 단계에서 변수의 값을 가져오는 장점이 존재한다.

상수값 변경 시 "재 컴파일을 하지 않고" 생성자 단계에서 변수의 값을 할당하여 사용할 수 있기 때문에 const보다는 readyonly의 사용을 더 고려해볼 필요가 있다.

const 키워드 보다는 확장성이 좋고 생성자에 따른 값도 변경할 수 있는 readonly 키워드를 사용하는 것이 좋은 방법이겠다.

readonly의 주의할 점

using System;

namespace CSharpExample
{
    internal class MainApp
    {
        static int Main(string[] args)
        {
            const int a = 10;
            
            // 메소드 지역변수에 readonly 키워드를 사용할 수 없다.
            readonly int b = 15;

            return 0;
        }
    }
}

메소드 지역변수에는 readonly 키워드를 사용할 수 없다.

Comments