티스토리 뷰
연산자 오버로딩이란?
- 피연산자가 하나 또는 둘 모두가 사용자 정의 클래스거나 구조체 형식일 때 해당 클래스나 구조체 안에 사용자 정의 연산자를 구현할 수 있는 것
예를 들어 코드를 보겠다.
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는 명시적 형변환만을 하도록 하고 있다.
'C#' 카테고리의 다른 글
enum 열거형 (0) | 2016.03.02 |
---|---|
delegate 델리게이트 (함수를 담을 수 있는 객체) (0) | 2016.01.29 |
모든 타입의 조상 System.Object (1) | 2016.01.22 |
is 와 as 키워드(상속관계 및 형변환 가능 유무 판별) (0) | 2016.01.22 |
상속(inherit) (0) | 2016.01.16 |