본문 바로가기

C#

C# 3.0의 발전 (1) - Auto-Implemented Properties

Microsoft Patner 교육엘 다녀왔습니다. 처음 .NET을 접했을때 교육해주셨던 선생님이 Microsoft로 직장을 옮기셨는데, 이번 교육을 직접 진행하신다고 하길때 반가운 마음에 달려갔습니다.

교육은 Visual Studio 2008에 포함될 C# 3.0의 언어적인 발전부분에 대해서 Hands On Lab방식의 실습으로 이루어졌습니다. 사실 그동안 C# 3.0의 언어적인 발전부분에 대해서는 어느정도 관심은 있었지만, 게으른 관계로 깊이 공부해보지는 못했던 터라, 뜬 구름잡듯이만 알고 있었는데. 이번 교육을 통해서 개념을 잡을 수 있었던것 같습니다.

C# 3.0의 변화의 가장 핵심은 바로 Lambda Expression(람다식)의 지원이라고 할 수 있었습니다. 람다식을 지원하기 위해서 컴파일 타임의 형에 대한 추론능력이 비약적으로 발전하게 되었고, 그러한 타입에 대한 추론능력을 바탕으로 암시적 로컬 변수(Implicitly typed local variable) 및 익명타입(Anonymous Type)의 사용이 가능하게 되었으며, 개체와 컬렉션 이니셜라이저(Object and Collection Initializer)등으로 좀더 표현력이 뛰어난 언어로 발전할 수 있었던 것 같습니다.

그리고, 람다식이 가능하게 되므로서 C#언어 자체에서 데이터에 대한 SQL과 같은 구조적 질의또한 가능하게 되어 데이터의 활용이 한층 쉽고 강력해 진것도 느낄수 있더군요.

자동 구현 프로퍼티(Auto-Implemented Properties)

객체지향의 원칙중 캡슐화(Encapsulation)을 위하여 C#에서는 Property를 지원합니다. 하지만, 개발시에 private 접근자의 멤버변수와 이를 캡슐화하는 Property을 만들때 멤버변수로 접근하는 코드를 제외한 프로그래밍적인 처리가 들어가는 경우는 크게 많지 않습니다

private string name;

public string Name

{

    get { return name; }

    set { name = value; }

}

변수를 선언할때 위와 같이 거의 습관적으로 코딩하시는 분이 많을 겁니다. 저또한 거의 습관적으로 나오는 코드이고, 양이 많을 경우 매번 프로퍼티를 구현하는게 귀찮을 때도 많습니다. 물론 코드조각을 이용하시는 분들도 계시긴 하겠지만 저는 변수선언과 프로퍼티선언의 영역을 달리 하는 편이라 그것도 썩 맘에 들지 않아 그냥 손으로 코딩을 해버립니다.
물론 어쩔땐 get; set; 모두 노출해야 하는 멤버변수는 그냥 public으로 선언할 때도 있습니다.(-_-)

C# 3.0에서는 이러한 불필요한 듯한 노력을 줄여주는 자동 구현 프로퍼티가 반영되어 예전처럼 멤버변수와 프로퍼티의 구현을 기계적으로 할 필요가 없어졌습니다.
구문은 아래와 같습니다.

public string Name { get; set; }

public string Address { get; internal set; }

public string UserKey { get; private set; }

인터페이스에서 프로퍼티를 선언할 때와 거의 비슷한 구문을 가지고 있습니다만, 이는 인터페이스내에서 작성하는 코드가 아니라 클래스내에서 멤버변수의 선언과 프로퍼티의 선언을 한번에 해결할 수 있는 코드입니다.
하지만, 먼가 좀 이상하지 않으신가요? 프로퍼티란 메서드의 한 종류일뿐 분명히 변수는 아님에도 저게 어떻게 동작이 가능할까요? VB(.NET버전 이하)처럼 모든것을 포용해주는(가끔 프로그래머를 패닉상태로 몰고가기도 하죠.^^) C#이 아니지 않습니까? 깐깐한 C#이 변수도 선언하지 않았는데 메모리를 할당해 줄리는 만무 할텐데...
그것은 자동 구현 프로퍼티가 있으면 컴파일 타임에서 컴파일러가 멤버변수를 자동으로 생성해주게 되는 것입니다. 즉, 변수가 존재하지 않는게 아니라, 프로그래머가 해야할 일을 컴파일러가 대신해주는 것 뿐인거죠.

코드를 보시면 get; set;에 대하여 엑세스제한자를 지정할 수 있습니다. set에다 private를 지정할 수 있으므로 외부에서 값을 변경하는 것을 막을 수 있습니다.
하지만, 만일 set을 지정하지 않으면 내부에서 해당 변수에 접근이 불가능하기 때문에 get과 set 모두 존재해야지만 정상적인 사용이 가능합니다.