일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Flutter
- Houdini
- jupyter
- Python
- Unity
- c언어
- git
- github
- 구조체
- Data Structure
- 유니티
- c#
- 플러터
- HTML
- c# 윈폼
- vim
- docker
- 깃
- Algorithm
- C++
- 다트 언어
- C# delegate
- 포인터
- c# winform
- gitlab
- 도커
- dart 언어
- c# 추상 클래스
- jupyter lab
- C언어 포인터
Archives
- Today
- Total
nomad-programmer
[Programming/C#] const (상수화)와 readyonly (읽기전용)의 차이점 본문
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 키워드를 사용할 수 없다.
'Programming > C#' 카테고리의 다른 글
[Programming/C#] Monitor 저수준 동기화 : Wait() & Pulse() (0) | 2020.09.29 |
---|---|
[Programming/C#] Monitor 클래스로 동기화 : Enter() & Exit() (0) | 2020.09.29 |
[Programming/C#] 스레드 동기화 (Thread Synchronization) (0) | 2020.09.29 |
[Programming/C#] 스레드 인터럽트 (Thread Interrupt) (0) | 2020.09.29 |
[Programming/C#] 스레드의 일생과 상태 변화 (0) | 2020.09.29 |
Comments