본문 바로가기
게임개발/Effective C#

[Effective C#] 1. 지역 변수에 대한 var 사용

by 개발도사(진) 2023. 11. 6.

1. var 

C#의 var keyword는 compile time에 변수의 자료형을 추론하는 keyword이다. 

int a = 100;
var b = 100;

b에 대하여 type을 명시해 주지 않았지만, 컴파일러가 자동으로 RHS의 타입을 b에 할당한다. 

(단, var keyword를 사용하려면 변수를 선언할 때 초기화해야 한다.)

 

2. 지역변수에 var keyword를 사용하는 이유

사실 명시적으로 type을 표기하는 것이 지금까지 내가 해 오던 방식이었기에 처음에는 상당히 의아했다. 코드를 이해하기 너무 어려워지는 것 아닌가 하는 생각이 들었기 때문이다.

 

하지만, var type을 사용하면서도 가독성을 유지하거나 상승시킬 수 있다. 정확히 타입을 기술하는 대신 타입을 유추할 수 있는 변수명을 도입하면 되기 때문이다. 

 

가령 Student라는 객체를 하나 만들려 할 때,

Student s = new Student(c);
var computerScienceStudent = new Student(c);
//c -> means computer science

이런 식으로 선언하여, 정확한 타입을 기술하지 않고서도 무엇을 나타내는지 가독성 있게 표기할 수 있다.

 

메서드 반환 타입의 경우도 마찬가지이다.

Student s = GetSummacumlaude();
var summacumlaudeStudent = GetSummacumlaude();

이렇게 의미를 명확히 드러내기 위한 변수명을 잘 고안하면, 가령 저 method의 이름이 저것보다 훨씬 더 모호하여 반환 type을 추론하기 어려운 경우에도 가독성을 끌어올릴 수 있다. 

 

그러나 여전히 var을 사용하면 프로그래머와 컴파일러의 추론이 달라 문제가 생길 위험이 있다. 가령 float, double 등 내장 숫자 타입 간의 변환이 이뤄지는 경우에는(특히 축소 변환) var을 사용하는 것이 예상과 전혀 다른 결과를 가져올 수 있으므로 주의해야 한다.

 

그럼에도 불구하고 var을 사용하는 것을 추천하는 이유는, 올바르지 않은 타입 명시로 인해 더 나쁜 코드를 쓸 수도 있기 때문이다. 가령 두 type 간 상속 관계가 있는 경우, 

//GetObject returns Child
Parent p = GetObject();

이 코드는 전혀 문제를 일으키지 않지만, p에서 Child가 제공하는 여러 기능들을 사용할 수 없을 것이다. 

//GetObject returns Child
var p = GetObject();

차라리 그냥 이렇게 선언했다면, 컴파일러가 알아서 p를 Child type으로 지정해 줬을 것이고 문제 없이 Child의 기능들을 사용할 수 있을 것이다. 

 

결론

1. 변수명을 올바르게 기재하여 가독성을 챙기고 type 유추가 쉽게 한다.

2. 명시적으로 type을 반드시 드러내야 하는 경우가 아니면 var keyword를 쓰는 것이 낫다.

3. 단, 내장 숫자 type의 경우에는 그냥 명시적으로 선언하자.

참고도서) Effective C#, Bill Wagner