SSISO Community

갤러리정

연산자 오버로딩 - CSharp

연산자 오버로딩(Operator overloading)
- 연산도 특수한 메소드 일종(내부 메소드)
- 메소드에 비해 연산자 사용 시 코드가 단순, 명확
- 기존 연산자를 메소드 오버로딩 하듯이 사용자가 오버로딩 가능
- 객체들간의 연산에 유용

 

    public Static void Main()
    {
        int i =10;
        int j =20;
        int k, l

        k = i + j;
        l = Add(i,j);

        Console.WriteLine(k);
        Console.WriteLine(l);
    }

    public static int Add(int value1, int value2)
    {
        return value1 + value2;
    }

 

연산자 오버로딩이 가능한 연산자
- 단항연산자 : +, -, !, ~, ++, --, true, false
- 이항연산자 : +, -, *, /, %, &, |, ^, <<, >>, ==, !=, >, <, >=, <=

 

    public static 반환형 operator OP (object1, object2)
    {
        구현부;
    }

 

- Op : 연산자(+, -, ....)
- 일반적으로 반환형은 인자형과 일치시켜준다. (int + int = int)
- 인자의 수는 기존 연산자가 가지는 인자 수와 일치 시켜준다.
- 단항 연산자는 인자가 반드시 연산자 오버로딩을 구현하는 구조체나 클래스이어야 한다.
- 이항 연산자는 보통 첫번째 인자는 오버로딩 하는 클래스나 구조체, 두번째는 자유
- C#에서 정의되지 않은 연산자 사용 불가

 

        class Time
        {
            private int hours;
            private int minutes;

 

            //생성자 초기화 리스트
            public Time(int minutes) : this(0, minutes){}

            public Time(int hours, int minutes)
            {
                //멤버초기화
                this.hours = hours;
                this.minutes = minutes;

                //hours, minutes값 검증
                Examine();  //총분수를 시간과 분으로 분리하는 메소드
            }

            private void Examine()
            {
                //hours와 minutes가 음수이면 예외발생
                if(hours<0 || minutes<0)
                    throw new Exception("올바르지 않은 인자입니다");

                //hours와 minutes가 범위를 벗어나는 경우
                hours = hours + (minutes/60);
                minutes = minutes%60;
            }

            //총분수를 반환
            private int TotalMinutes()
            {
                return hours * 60 + minutes;
            }

            //ToString 오버라이드
            public override string ToString()
            {
                return hours + ":" + minutes;
            }
            //++연산자 오버로딩(1분추가)
            public static Time operator ++ (Time t)
            {
                return new Time(t.TotalMinutes()+1);
            }
            //+연산자 오버로딩(분 합산)
            public static Time operator + (Time t1, Time t2)
            {
                return new Time(t1.TotalMinutes()+ t2.TotalMinutes());
            }
        }

        class  MainClass
        {
            [STAThread]
            static void Main(string[] args)
            {
                Time t1 = new Time(10, 20);
                t1++;       //연산자 오버로딩시 피연산자(객체)안에서 오버로딩한다.
                Console.WriteLine(t1);

                Time t2 = new Time(1, 30);
                Time t3 = t1 + t2;
                Console.WriteLine(t3);

                Console.Read();
            }
        }

 

관계형 연산자 오버로딩
- ==, <=, >=, <, >
- 관계형 연산자 오버로딩은 항상 쌍으로 해야한다.
- ==, != 연산자 오버로딩을 할때는 반드시 Equals메소드도 오버라이드 한다.

 

연산자 다중 오버로딩

1425 view

4.0 stars