'const'에 해당되는 글 1건

  1. 2018.05.06 C#/.NET readonly vs const 예제로 보는 차이점

C#, 닷넷에서 readonly 키워드와 const 키워드는 비슷하지만 다른 키워드 이다.

두 키워드의 차이점 및 공통점에 대해서 알아보자. 


 const 키워드는 대부분에 프로그래밍 언어에서 지원하는 기본적인 문법입니다. 변수를 선언할때 변수 타입앞이나 뒤에 명시하여 해당 변수를 상수화 합니다. 그래서 선언할때 변수값을 지정하면 이 변수는 이제 상수가 되어 값을 읽을 수는 있지만 수정이 불가능 합니다. 이런 불편한 상수를 왜 사용할까 하지만 많은 장점이 존재 합니다. 


 예를들어 원에 넓이를 구하는 문제에서 파이값을 3.14로 해서 파이값 X 반지름 X 반지름 해서 넓이를 구하는 문제에서 파이값은 항상 같기 때문에 변수에 넣어두고 사용하면 됩니다. 하지만 실수로 파이값에 다른 숫자나 변수를 대입하여 값이 변경되면 에러가 발생하게 됩니다. 그래서 파이변수를 선언할 때 const 키워드를 넣어서 상수화 합니다. 그러면 절대 변경될 일이 없기때문에 안정적인 프로그램이 됩니다. 혹시라도 값을 대입하는 코드를 작성하면 컴파일 단계에서 에러가 발생하기 때문에 쉽게 버그를 수정할 수 있습니다. 

 그리고 파라미터로 객체의 주소값을 받으면 해당 객체를 수정하지 못하게 파라미터 선언에 const 키워드를 붙이면 해당 함수에서 파라미터로 넘어온 값을 수정할 수 없게 됩니다. const 키워드를 사용해도 되는 곳이라면 최대한 많이 사용하는 것이 안정적인 코드를 작성하는 방법 입니다. 



1. 공통점


두 키워드 모두 한번 값이 정해지면 수정을 할 수 없다.



아래 두 예제를 보자.

두 예제 모두 클래스에 string 변수를 선언해서 const 키워드를 사용하였다. 해당 test 변수는 상수가 되어서 선언한 곳 이외에서는 수정이 될 수 없다.

혹시라도 수정하려고하면 컴파일 에러가 발생하게 된다.


- const 예제

class TEST
{
	private const string test = "test1234";
	public string getTest()
	{
		return test;
	}
}

class Program
{
	static void Main(string[] args)	
	{
		TEST t1 = new TEST();
		Console.WriteLine("t1 : " + t1.getTest());
	}
}


- readonly 예제

class TEST2
{
	private const string test = "test1234";
	public string getTest()
	{
		return test;
	}
}

class Program
{
	static void Main(string[] args)	
	{
		TEST2 t2 = new TEST();
		Console.WriteLine("t2 : " + t2.getTest());
	}
}



2. 차이점


const키워드와 readonly 키워드의 가장 큰 차이점은 const와는 다르게 readonly 는 생성자에서 값을 초기화 할 수 있다. 아래 예제를 보자. 생성자를 통해 readonly 값을 수정하는 것을 볼 수 있습니다.


- readonly 예제

class TEST
{
	public readonly string test = "start";
	public TEST()
	{
		test = "abc";
	}
	public TEST(string s1)
	{
		test = s1;
	}
}
class Program
{
	static void Main(string[] args)
	{
		TEST t1 = new TEST();
		TEST t2 = new TEST("def");
		Console.WriteLine("t1 : " + t1.test);
		Console.WriteLine("t2 : " + t2.test);
	}
}


test는 readonly 선언을 하였고 초기화를 하였지만 생성자인 TEST()와 TEST(string s1)에서 다시 초기화를 하고있다.

const 선언을 하면 에러가 발생하게 된다.


그리고 const는 선언과 동시에 static이 컴파일러에 의해 자동으로 붙게된다. 정적 필드가 되는것이다. 하지만 readonly의 경우 그렇지 않기 때문에 선언적으로 static 키워드를 붙여주면 정적 필드로 사용이 가능하다.


확장성이 좋고 생성자에 따른 값도 변경할 수 있다. 되도록 const 키워드 이외에 readonly 키워드를 사용하는 것이 좋다.


주의할점은 아래코드와 같이 함수에 지역변수에는 readonly 키워드를 사용할 수 없다.







Posted by 꿈만은공돌
,