본문 바로가기

ETC Programmings

[C#] 함수형 멤버 - Method Overloading, Property, Operator Overloading

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
C# 은 본디 본질이 OOP (Object Oriented Programming) 언어이기 때문에 기본적인 특징들이 자바의 그것과 아주 유사하다. 처음 책을 펴면서 배우는 내용들은 우리가 C에서 배우는 그것이나 자바나 자바스크립트가 별반 차이없게 배우는 기본적인 문법이라던가 표현식들에 대해서 배우게 된다. 특히 함수형 멤버 라는 이름을 가진 항목은 OOP 언어를 배운다면 필히 나오는 부분이다. 상속이나 인터페이스와 같은 부분도 마찬가지이다.

클래스의 구성요소 라는 이름으로 대학때 3가지 요소에 대해서 배운적이 있다. Attribute, Constructor 그리고 바로 Method 이다. 엄밀히 말하면 Constructor 라는 것도 메소드의 범주에 속할 수도 있겠으나 하는 역할이 엄연히 틀리니 구분을 해둔것이 아닌가 추측이 된다.

Method는 Class 가 하나의 동물 개체인 고양이로 비유를 한다면, 고양이가 하는 행동들을 정의한 것이라고 볼 수 있다. 야옹거린다던가 잠을 잔다던가 걷는다던가 하는 행동들을 말한다. 다시 말해 클래스가 취할 수 있는 Action 을 말한다. 그 Action은 어떤 결과를 돌려 줄 수도 있고, 아무런 결과를 보이지 않을 수도 있다. 이런 것들을 Method 라고 한다.


C# 에서 가장 특징 적인 것은 아무래도 프로퍼티라는 부분이었다. C# 이라는 언어가 자바보다 편리한 점 중에 하나이다. 그 이후에도 여러가지 C#만의 문법들이 종종 등장하는데 이럴때마다 대단한 언어라는 생각이 든다.

클래스의 각각의 Attribute 마다 접근제어자(public, private, protected) 가 붙기 때문에 외부에서 접근 할 수 없는 Attribute의 경우에 Accessor 와 Mutator (Getter, Setter) Method를 생성해 줘야 한다. 뭐 아주 간단하게 생성할 수 있고.. 특히 이클립스에서는 자동으로 만들어주는 기능이 있기에 쉽게 사용할 수 있지만 여러 Attribute를 사용하는 클래스의 경우 기하급수적으로 그 Get/Set Method 가 늘어나니 코드의 길이도 길어지도 다소 지저분 해지게 된다.

C# 에서 Getter, Setter 를 컴파일러가 대신하게 하고 전혀 새로운 이름의 '변수' 처럼 프로퍼티라는 것을 제공한다. 아래의 소스를 보면 더욱 이해가 갈 것이다.

  public class UserProperty
    {
        private string name;
        private string id;
        private uint level;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public string Id
        {
            get { return id; }
            set { id = value; }
        }
        public uint Level
        {
            get { return level; }
            set { level = value; }
        }
    }

다소 간결하면서도 좀 더 가독성이 높은 코드를 만들수 있다는 점에서 아주 감동적이다. 보통 오버로딩이라고 하면 많이 알고 있고 또 너무 지겹기 때문에 오버로딩은 그냥 넘어가려고 했는데 아주 독특한 형태의 오버로딩이 있었다. 바로 연산자 오버로딩(Operator Overloading) 이라는 것인데 사용자의 구색에 맞춰서 사칙연산이나 논리식을 수정할 수 있다는 것이다.

솔직히 말하면 별로 쓰고 싶지는 않다... 이외에도 explicit, implicit 이라는 키워드를 사용하여 형변환하는 것을 오버로딩 할 수 있다. 허나 이 역시도 해당 라이브러리를 사용하는 사용자에게는 혼동을 주지 않을까.. 하는 생각이 든다. 뭐 앞으로 실전에 필요하다면 쓰게 되겠지만 지금은 별로 구미가 당기지 않는 그런 기능이다.


C# 에는 과거에 Java 로 처음 공부를 시작했던 나에게는 아주 매력적인 기능들과 다소 거부감 느껴지는 기능들이 동시에 있다. 때문에 이 두가지를 모두 잘 활용하려면 그에 상응하는 기능들의 숙지가 필요할 듯 하다. 기본기에 충실하는 것이 내 모토이니 기본들을 잘 배우고 가도록 하겠다.

이번에는 Property가 핵심이다!!