Auto Properties in C#

C#에서 Field(Variables) 대신 Property를 쓰게 되면, 변수의 Accessibility를 세밀하게 조정할 수 있고, Data Binding을 할 수도 있으며, Set, Get 함수에 추가적인 작업을 진행할 수 있다. Property를  써야 할 곳과 Variables을 써야 할 곳에 대한 논쟁도 많지만, Language 설계 상 Field(Variables)는 어떤 데이터를 저장해두는 것에 주 목적이 있었고, Property는 Access를 Contorl하기 위해 태어난 태생적 차이가 존재한다.

C#에서 Property를 선언하고 사용하는 기본적인 방식은 다음과 같다.

그런데, 사람들이 이렇게 Private 변수를 만들어 주고, 아래에 일반적인 Setter와 Getter를 선언해주는 것이 귀찮다고 Complain했다. 그래서 C# 3.0 버젼에서 Automatic Properties, 즉 Auto Properties를 도입하게 된다. 아래는 Auto Properties를 사용한 Property 선언이다.

1 줄로 가능하다. 나머지는 .Net Compiler가 알아서 만들어 준다. Private 변수나 Verbose한 Setter, Getter를 모두 자동으로 생성시켜 주는 것이다. set, get 모두 public인데, setter를 Class 내부에서만 하고 싶다면 private으로 만들어 주는 것도 가능하다. (Read Only)

그리고 이렇게 하면 Write Only Property가 된다.

이렇게 Auto Property를 이용한 Properties들을 보고 있자면 드는 생각은 “빈 껍데기 set, get을 왜 쓰는가?”  라는 질문이다. 이 빈껍데기 set, get을 쓰는 이유는 Class Variables을 외부로 노출하지 않는 프로그래밍 언어 설계 철학적인 면에서 기인한다. 변수 자체를 Private으로 만들고 Property를 Wrapping하여 외부에 Field 대신 노출 시켜서 전체적인 Calss의 데이터들을 Encapsulation 하는 것이 OOP 설계적인 면에서 훨씬 좋기 때문이다.

Unity 4.* 버젼들은 Mono 2.6 버젼을 기반으로 하기 때문에, C# 3.0 기능이 포함되어 있다. 따라서 Unity C#에서도 auto properties를 사용할 수 있다.

사실, C#에서 Property는 Variable과 거의 동일한 용도로 쓰인다. Properity와 관련한 몇가지 Code Smell이 있는데 아래와 같다.

1) Public Variables에 Property를 얹는 것은 의미 없는 짓이다.
2) Setter와 Getter가 너무 커질 경우 Method로 빼야 한다. 항상 Set, Get은 Light Weight하게!
3) 대부분의 변수들을 무조건 Property로 남발하는 것은 불필요한 짓이다.