.Net Project/.Net C#

90장 연산자오버로딩

Magic_kit 2009. 8. 17. 16:31
반응형

연산자오버로딩이란? 
C#에서는 사용자 정의 형식에서 operator 키워드로 정적 멤버 함수를 정의하여 연산자를 오버로드할 수 있습니다.

 연산자  오버로드 가능성  +, -, !, ~, ++, --, true, false : 오버로드 가능   
 
+, -, *, /, %, &, |, ^, <<, >> : 이 이항 연산자는 오버로드할 수 있습니다.
 
==, !=, <, >, <=, >= :  비교 연산자는 오버로드할 수 있습니다.
 
&&, || :  조건 논리 연산자는 오버로드할 수 없지만, 오버로드 가능한 & 및 |를 사용
 
[]  :  배열 인덱싱 연산자는 오버로드할 수 없지만 인덱서를 정의할 수 있습니다.
 
() :  캐스트 연산자는 오버로드할 수 없지만 새로운 변환 연산자를 정의
 
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= :  할당 연산자는 오버로드할 수 없다.

=, ., ?:, ->, new, is, sizeof, typeof :  이 연산자는 오버로드할 수 없습니다.

 사용자 지정 클래스에 대한 연산자를 오버로드하려면 올바른 시그니처를 사용하여
 클래스 의 메서드를 만들어야 합니다.
 
 이 메서드의 이름은 "operator X"여야 합니다.
 여기서 X는 오버로드하려는 연산자의 이름이나 기호입니다. 
 단항 연산자에는 매개 변수가 하나이고, 이항 연산자에는 매개 변수가 두 개입니다.
 각각의 경우에 매개 변수 중 하나는 연산자를 선언하는 클래스나 구조체와
 동일한 형식으로 사용.

 Program.cs

using System;
public class 연산자오버로드
{
    public static void Main()
    {
        //int 키워드를 Integer로 모방
        Integer i = 10;
        Integer j = 20;
        Integer k = 0;
       
        //i.Value++; //증간연산자 적용
        //i++; //단항 연산자 오버로드 구현 되어있어야만 가능

        //k.Value = i.Value + j.Value;
        //k = i + j; //이항연산자 활용
       
        //Integer i = new Integer (10);
        //Integer j = new Integer (20);
        //nteger k = new Integer (0); //Tostring() 메서드 오버라이드

        Console.WriteLine(Integer.MaxValue);
        Console.WriteLine(Integer.MinValue);        
        Console.WriteLine(k);
        //Console.WriteLine(k.Value);
    } 
   
}
public partial class Integer
{
    //상수형 필드 선언 : 상수는 반드시 선언 동시 초기화
    public const int MaxValue = int.MaxValue;
    //선언과 동시초기화 또는 생성자 초기화
    public static readonly int MinValue = int.MinValue; //읽기 전용 필드로 선언

    //정적생성자를 통해서 읽기전용필드 초기화 가능
    static Integer() { MinValue = int.MinValue; }

}

 Interger.cs

using System;

public partial class Integer
{
    private int value;
    public Integer(int value){this.value = value;}
    public int Value { get { return value; } set { this.value = value; } }

    //변환연산자
    public static implicit operator Integer(int value)
    {
        return new Integer(value);
    }
   
    //ToString() 오버라이드
    public override string ToString()
    {
        return value.ToString(); //기본 값을 외부에 개체명으로 공개
    }

    //단항 연산자 오버로드
    public static Integer operator ++(Integer data)
    {
        return ++data.value;
    }

    //이항 연산자 오버로드
    public static Integer operator +(Integer a, Integer b)
    {
        return (a.value + b.value);
    }

}

반응형