F.R.I.D.A.Y.

C# - 연산자 오버로딩 본문

DEV/.Net

C# - 연산자 오버로딩

F.R.I.D.A.Y. 2021. 5. 29. 04:22
반응형

 여러 타입으로 구성된 C#의 연산자 오버로딩


연산자

 프로그램에서의 연산자는 우리가 생각하는 일반적인 사칙연산자를 포함해 다양한 연산자가 존재한다. C#에서는 다음 항목의 연산자가 제공되고 일부는 개발자가 상황에 맞춰 기능을 구성할 수 있도록 연산자 오버로딩을 제공한다.

  • 단항 연산자
  • 이항 연산자
  • 인덱서
더보기

# 오버로드 불가능한 연산자

 타입캐스팅 연산자나 복합 대입 연산자 등은 오버로드가 불가능하다. 기존의 연산자는 불가능하지만, 타입캐스팅 연산자는 사용자 정의 자료형에 대해 캐스팅 연산을 생성할 수 있고, 복합 대입 연산자의 경우 연관된 이항 연산자를 오버로딩 하는 것으로 암시적으로 오버로드 할 수 있다고 한다.

https://docs.microsoft.com/ko-kr/dotnet/csharp/language-reference/operators/operator-overloading

 

연산자 오버로드 - C# 참조

C# 연산자를 오버로드하는 방법과 오버로드가 가능한 C# 연산자에 대해 알아봅니다.

docs.microsoft.com

 

 

연산자 오버로드

 다음은 연산자를 오버로드하는 구성을 살핀다. C#의 경우 특이하게도 인덱서 연산자([])에 대해 다른 연산자와는 특이한 방식으로 오버로딩을 제공한다. 정확히는 오버로딩이라 할수는 없겠지만 말이다.

 

 일반적으로 연산자 오버로딩은 사용자 정의 자료형을 일반 자료형과 엮을 때 코드를 쉽고 직관적으로 볼 수 있도록 하기 위해 작성하는 경우가 일반적이다. 따라서 다음의 예제 클래스를 이용한다.

 

    using AGE = System.Byte;
    class Person
    {

        private string name;
        private AGE age;
        public string Name
        {
            get { return name; }
            set {if (name != value) name = value;}
        }

        public Person(string name, AGE age)
        {
            this.Name = name;
            this.Age = age;
        }

        public AGE Age
        {
            get { return age; }
            set { age = value; }
        }

    }

 

일반 연산자

 연산자는 operator 키워드를 사용해 선언할 수 있다. 또한 오버로드를 위해서는 다음 규칙이 꼭 선행되어야 한다.

  • 접근 제한자는 public으로, static 한정자를 모두 작성해야한다.
  • 단한 연산자는 한 개의 매개변수, 이항 연산자는 두 개의 매개변수가 있다.

 

구현

  연산자 오버로드는 오버로드하는 대상 클래스 안에 존재해야한다. 예제로 보인 Person 클래스에 이항 연산자 + 를 적용하려면 Person 클래스 내부에 작성해야한다.

        public static string operator+(string str, Person person)
        {
            return $"{str} {person.Name}";
        }

 위 코드를 풀면 public static은 제한자이고, string 데이터를 반환하며, 이항 연산자 +를 오버로드하는 메서드임을 알 수 있다. 이항 연산자 + 는 양쪽 피연산자의 자료형이 매개변수의 자료형일때 오버로드 된 이항 연산자를 호출하도록 규정하고 있다.

 때문에 + 연산자의 좌측에는 string 데이터가, 우측에는 Person 객체가 들어섰을 때 해당 메서드가 동작한다. 만일 좌측에 Person 객체, 우측에 string 데이터가 들어가면 이는 매개변수 순서와 다르므로 오버로드된 연산자를 호출하지 않는다.

 

 한가지 재밌는 것은 해당 코드를 중괄호로 감싸지 않고 다음과 같이 구성할수도 있다.

        public static string operator+(string str, Person person) => $"{str} {person.Name}";

 이는 람다식을 이용한 코드 작성법으로 다음에 더 자세히 다룬다. 지금은 실행하는 명령이 한 줄인 경우에는 이런 식으로 작성할 수 있다는 것만 알아두자. 이것도 어렵다면 이런 작성법도 있다는 것 정도만 알자. 문법을 알아야 코드를 짜니까!

 

인덱서 연산자

 대괄호를 사용하는 인덱서 연산자는 다른 연산자 오버로딩과 모습에 있어 약간 차이가 있다. C++에선 모든 연산자 오버로딩이 동일했는데... 아무튼, C#에서 인덱서 연산자의 구성은 아래의 모습을 한다.

 

 예컨대 Person 객체에 자격증 이름을 저장할 수 있는 새로운 필드 certificationList를 만들었다고 가정하자.

        private string[] certificationList;

 기존의 생각대로라면 프로퍼티를 생성해 접근하도록 구성할 수 있겠지만, 인덱서를 이용하면 배열처럼 접근이 가능하다.

 

구현

 인덱서 연산자는 아래와 같은 모습으로 구성한다.

        public string this[int index]
        {
            get { return certificationList[index]; }
            set { certificationList[index] = value; }
        }

 인덱서 연산자는 특이하게도 this 키워드를 이용해 구성하도록 하며, 대괄호 사이에 인덱스 값을 넣도록 했다.

 

# 간단히 구성만 확인할 수 있도록 작성되었으므로 오류가 나더라도 넘어가도록 하자.

 

# index

728x90
반응형

'DEV > .Net' 카테고리의 다른 글

WinAPI 보호된 메모리를 읽거나 쓰려고 했습니다.  (0) 2022.04.06
C# - 접근제한자  (0) 2021.05.30
C# - 메서드에 대해서  (0) 2021.05.29
C# - 구조체와 클래스  (0) 2021.05.28
C# - namespace(네임스페이스)  (0) 2021.05.28
Comments