티스토리 뷰

연산자 오버로딩이란?

- 피연산자가 하나 또는 둘 모두가 사용자 정의 클래스거나 구조체 형식일 때 해당 클래스나 구조체 안에 사용자 정의 연산자를 구현할 수 있는 것


예를 들어 코드를 보겠다.

class Kilogram { int kg; public int Kg { get { return kg; } } public Kilogram(int kg) { this.kg = kg; } public int Add(Kilogram k) { return this.kg + k.kg; } public static Kilogram operator +(Kilogram k1, Kilogram k2){ return new Kilogram(k1.kg + k2.kg); } } class Program { static void Main(string[] args) { Kilogram k1 = new Kilogram(60); Kilogram k2 = new Kilogram(40); //일반적인 메서드를 사용해서 킬로그램을 연산. int kg = k1.Add(k2); Console.WriteLine(kg); //연산자 오버로드를 사용해서 킬로그램을 연산. //public static 리턴타입 operator +(매개변수2개); Kilogram k3 = k1 + k2; Console.WriteLine(k3.Kg); } }

결과



연산자 오버로딩을 정의 하는 방법은 사용자 클래스나 구조체에

public static 리턴타입 operator 연산자(매개변수1, 매개변수2);

처럼 선언하여 구현부의 내용을 코딩하면 된다.



위의 예는 kg을 클래스로 만들어서 클래스끼리의 더하기 연산이 가능하도록 코딩한 것이다.

사용자 정의 클래스 타입인 Kilogram의 참조변수끼리 +더하기 연산이 가능하도록 하였는데...

일반적인 메서드를 정의해서 사용하고 있는 Add메서드보다 더 깔끔해 보인다.


그리고...

실무에서 쓰이는지는 잘 모르겠지만..그냥 메서드를 사용하는 것이 나아보인다. 

+ 연산은 문자나 숫자타입의 연산을 위한 것이므로 우선은 그 기능만을 하도록 하는게 좋을 것 같고..

Kilogram의 연산자 오버로딩 코드를 보면 알겠지만 new를 사용해 새로운 인스턴스를 리턴 하고 있다.

이것(new)은 가상머신의 힙을 사용하고 스택과 관련있는 메서드의 사용보다 더 메모리를 많이 차지하기 때문에

효율은 없어 보인다. 물론 자주 사용되지 않는 클래스라면 별 문제 없을지 모르지만...빈번히 사용되는 객체라면 성능상에 문제가 될 수 있다고 생각한다.








implict와 explict

- implict와 explict는 클래스간의 형변환 연산자에 사용된다.

- 형변환 연산자란 operator를 이용하여 사용자 정의 클래스끼리 형변환이 가능하도록 구현한 연산자를 말한다.


위의 Kilogram 예제에 더하여 Gram클래스를 만들어서 둘 사이에 형식 변환이 가능하도록 코딩을 해볼 것이다.

다음은 "1kg은 1000g 이다"를 형변환에 접목한 예이다.

class Kilogram
    {
        
        int kg;
        public int Kg
        {
            get { return kg; }
        }

        public Kilogram(int kg)
        {
            this.kg = kg;
        }

      public static explicit operator Gram(Kilogram k){
          return new Gram(k.kg*1000);
      }

      public override String ToString()
      {
          return kg + "kg";
      }

    }


    class Gram
    {
        int g;
        public int G 
        {
            get { return g; }
        }

        public Gram(int g)
        {
            this.g = g;
        }

        public static implicit operator Kilogram(Gram g){
            return new Kilogram(g.g/1000);
        }

        public override String ToString()
        {
            return g + "g";
        }

    }

    
    class Program
    {
        static void Main(string[] args)
        {

            Kilogram k1 = new Kilogram(60);
            Kilogram k2 = new Kilogram(40);

            Gram g = (Gram)k1; //명시적 형변환
            Console.WriteLine(g);

            k1 = g;  //암시적 형변환
            Console.WriteLine(k1);

        }
    }


Gram을 Kilogram으로 Kilogram을 Gram으로 사용자 정의에 맞게 형변환이 될 수 있게 하기 위해서는

implict나 explict키워드를 사용한 operator 메서드를 선언하고 구현해야 한다.


public static implict/explict operator 형변환클래스명(형변환대상클래스명 변수){ 구현부 }

처럼 정의하면된다.


그럼 Main메서드에서 처럼 형변환이 가능하다.

implict는 암시적 형변환, 명시적 형변환 모두 가능하고,

explict는 명시적 형변환만을 하도록 하고 있다.




Comments
최근에 올라온 글
최근에 달린 댓글
TAG
more
Total
Today
Yesterday