Creative Commons License

Microsoft .NET

닷넷!시작하기
닷넷! Ver 2.0~
닷넷!스킬업
웹개발
윈폼개발
실용모듈개발
Tip & Tech
하루 한 문법

Microsoft .NET 개발자들을 위한 공간입니다. 기초강의에서 부터 고급 기술 정보 및 팁등을 다루도록 하겠습니다.

.

닷넷!시작하기

Microsoft. NET 을 시작하는 분들을 위한 강좌입니다. 주로 기초적인 내용과 때론 기본적인 내용을 다룹니다

Operator Overloading (연산자 오버로딩)

작성자 : 박종명
최초 작성일 : 2008-05-30 (금요일)
최종 수정일 : 2008-05-30 (금요일)
조회 수 : 4914

* 정의
연산자 오버로딩은 각종 연산자에 대한 의미를 프로그래머가 재정의 할 수 있게 한다
 
* 목적
연산자 오버로딩을 사용하면 메쏘드로 연산을 처리 할때에 비교해 다음과 같은 장점이 있다
1) 메쏘드로 처리하는 것 보다 명확하다
2) 메쏘드를 사용하여 연산을 처리 할때는 그 사용법이 직관적이지 못하며 잠재적 버그 유발성도 높아진다

아래의 데모를 보자.
덧셈 연산을 수행하는 Int 클래스의 Add 메소드를 사용한다고 가정하자
myIntVar1 = Int.Add(myIntVar2,Int.Add(Int.Add(myIntVar3,myIntVar4).,33))
이 것을 연산자 오버로딩을 사용하면..
myIntVar1 = myIntVar2 + myIntVar3 + myIntVar4 + 33;
 
위의 두가지 모두 결과는 동일할 것이다. 그러나 메쏘드를 사용할 경우 코드의 직관성은 상당히 떨어지며
또한 사용중에 에러 혹은 의도하지 않은 결과를 도출하는 실수를 할 수 있다.
반면 연산자를 사용하면 코드가 직관적이며 실수의 확률도 줄어들 것이다.
 
* 연산자 오버로딩 방법
연산자 오버로딩을 하기 위해 생성하는 사용자 정의 연산자를 정의 할때는 아래의 사항을 반드시 지켜야 한다.
1) 사용자 정의 연산자는 반드시 static 로 정의 되어야 한다
2) 사용자 정의 연산자는 반드시 public 로 정의 되어야 한다
3) 매개변수 중 하나 이상은 반드시 그 클래스의 형식과 동일 해야 한다.
    즉, 사용자 정의 연산자에서의 매개변수는 중 하나 이상은 반드시 그 연산자가 정의된 클래스의 타입과 동일해야 한다
4) 사용자 정의 연산자 역시 오버로딩 가능하다
    즉, 동일한 연산자에 대한 다중 오버로딩이 가능하다(메쏘드 오버로딩과 동일)
5) 연산자 오버로딩 구문
    operatorop 구문 사용 (op 는 오버로딩할 연산자를 말한다)
 
* Demo
연산자 오버로딩을 사용하여 Time 클래스의 덧셈 연산자를 오버로딩 하는 예제를 보자.
Time 객체의 덧셈 연산자를 수행하면 시간,분이 더해져 또다른 Time 객체를 반환하는 예제이다.
 
1) Time 클래스 정의



2. Time 클래스 사용하기


* 관계형 연산자 오버로딩
1) 관계형 연산자를 오버로딩 할 경우에는 반드시 관계되는 연산자 쌍으로 오버로딩을 해야 한다.(필수 사항)
- < , >
- <= , >=
- == , !=
 
즉 < 연산자를 오버로딩 할 경우 반ㄴ드시 > 연산자도 같이 오버로딩 해야 한단 말이다
 
2) == , != 연산자를 오버로딩 할 경우 Equals 메쏘드도 같이 오버라디잉 하는 것이 좋다(권장 사항)
3) Equals 메쏘드를 오버라이딩 할 경우 GetHashCode 메쏘드도 같이 오버라이딩 하는 것이 좋다(권장 사항)
 
 
* 형변환 연산자 오버로딩
1) 키워드
묵시적 형변환 시 : implicit
명시적 형변환 시 : explicit
 
2) Demo
정수값인 분을 받으면 기본 시간 값(0)으로 한 새로운 Time 객체 반환하는 명시적 형변환 오버로딩 과
Time 객체를 받으면 시,분을 string 으로 반환하는 묵시적 형변환 오버로딩 예제이다.





참고 : string 형 변환 오버로딩을 할 경우 ToString 메쏘드도 같이 오버라이딩 해 주는 것이 좋다

∵Commented by 김창민 at 2012-07-09 오전 10:29:07  
결과가 이상하다 싶어 직접 타이핑 해봤습니다.
명시적 형변환시 결과는 "0시, 30분" 이고,
묵시적 형변환시 결과는 "5시, 5분" 입니다.
이름
비밀번호
홈페이지
IZ <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요