한국   대만   중국   일본 
演算子 오버로딩 - 위키百科, 우리 모두의 百科事典 本文으로 移動

演算子 오버로딩

위키百科, 우리 모두의 百科事典.

演算子 오버로딩 (operator overloading)은 客體 志向 컴퓨터 프로그래밍 에서 多形性 의 特定 境遇로 다른 演算子들이 函數 因子를 통해서 具現을 할 때를 말한다. 演算子 오버로딩은 一般的으로 言語, 프로그래머, 또는 두 가지 모두에 依해 定義된다.

演算子 오버로딩은 프로그램 開發者가 "가까운 目標 範圍(closer to the target domain)" 表記法을 使用할 수 있고 [1] 使用者 定義 타입과 비슷한 水準을 許諾하기 때문에 言語에 內藏된 形式으로 構文을 支援한다. 그것은 쉽게 函數 呼出을 使用하여 模倣할 수 있다; 例를 들어, 精髓 a, b, c를 생각하면:

a + b * c

演算子 오버로딩을 支援하는 言語에서, '*' 演算子는 '+' 優先 順位 보다 높고, 이것은 效果的으로 좀 더 簡潔한 作成 方法일 것이다:

add (a, multiply (b,c))

例示 [ 編輯 ]

使用者 定義 類型의 "Time"에 追加 許容하는 演算子 오버로딩의 例示 (C++에서):

 Time
 operator
+
(
const
 Time
&
 lhs
,
 const
 Time
&
 rhs
)
 {

     Time
 temp
 =
 lhs
;

     temp
.
seconds
 +=
 rhs
.
seconds
;

     if
 (
temp
.
seconds
 >=
 60
)
 {

         temp
.
seconds
 -=
 60
;

         temp
.
minutes
++
;

     }

     temp
.
minutes
 +=
 rhs
.
minutes
;

     if
 (
temp
.
minutes
 >=
 60
)
 {

         temp
.
minutes
 -=
 60
;

         temp
.
hours
++
;

     }

     temp
.
hours
 +=
 rhs
.
hours
;

     return
 temp
;

 }

덧셈은 왼쪽과 오른쪽 被演算子를 의미하는 이항 演算이다. C++에서, 傳達되는 因子는 被演算子이며, 臨時 個體가 返還 값이다.

演算子는 또한 클래스 메서드를 定義할 수 있으며, 숨겨진 this 引受로 lhs 를 代替한다. 그러나 이것은 왼쪽 被演算子 타입 Time 의 效果와 this 는 修正 可能하게 될 수 있는 lvalue(왼쪽 값) 을 推定한다.

 Time
 Time
::
operator
+
(
const
 Time
&
 rhs
)
 const
 {

     Time
 temp
 =
 *
this
;
  /* 'this' 값 複寫, 이것은 修正되지 않는다. */

     temp
.
seconds
 +=
 rhs
.
seconds
;

     if
 (
temp
.
seconds
 >=
 60
)
 {

         temp
.
seconds
 -=
 60
;

         temp
.
minutes
++
;

     }

     temp
.
minutes
 +=
 rhs
.
minutes
;

     if
 (
temp
.
minutes
 >=
 60
)
 {

         temp
.
minutes
 -=
 60
;

         temp
.
hours
++
;

     }

     temp
.
hours
 +=
 rhs
.
hours
;

     return
 temp
;

 }

this 에서 作動되는 클래스 메서드로 定義된 單桁 演算子 는 明白한 引受를 받을 일은 없을 거라고 한다:

 bool
 Time
::
operator
!
()
 const
 {

     return
 ((
hours
 ==
 0
)
 &&
 (
minutes
 ==
 0
)
 &&
 (
seconds
 ==
 0
));

 }

批評 [ 編輯 ]

演算子 오버로딩은 프로그래머가 演算子에 完全히 다른 意味를 줄 수 있기 때문에 批判을 받아왔다. 例를 들어, C++ 에서 演算子 << 使用時 :

a
 <<
 1

a 는 精髓 形式의 境遇 1 비트로 남아있는 變數 a 의 비트를 쉬프트한다, 하지만 萬若 a가 出力 스트림日 境遇 그러면 위의 코드는 出力 스트림에 "1" 을 出力한다.

이 批判에 對한 一般的인 答辯은 同一한 因子뿐 아니라 오버로딩을 函數에 適用되는 것이다. 또한 甚至於는 오버로딩이 없는 狀態에서 프로그래머는 이름에서 豫想되는 것과 完全히 다른 일을 하는 函數를 定義할 수 있다. 남아있는 問題는 그 言語와 같은 C++ 演算子 記號의 制限된 集合을 提供하고 따라서 프로그래머의 새로운 作業에 對한 보다 適切한 演算子 記號를 選擇 옵션에서 除去한다.

또, 演算子와 함께 더 많은 微妙한 問題는 數學에서 特定 規則이 잘못 豫想 또는 失手로 看做 될 수 있다는 것이다. 例를 들면 +의 交換 法則 (예: a + b == b + a ) 이 恒常 適用되지 않는다; 被演算子가 文字列日 때 이 예제가 發生한다, +는 一般的으로 오버로딩이 있기 때문에 文字列 連結을 遂行한다. (예: "school" + "bag" "schoolbag" 을 算出, 이것은 "bag" + "school" "bagschool" 을 算出하는 것과 다르다). 一般 計算 引受로 數學에서 直接 提供한다: + 는 精髓에서 交換法則이 成立 (그리고 一般的으로 어떠한 實際 數字) 하는 동안, 그것은 變數의 다른 "種類"에 對한 交換法則이 成立하지 않는다. 半올림 誤謬로 인해 實際 浮動小數點 값에서 그것은 그 + 도 聯關되지 않다고 더 指摘할 수 있다. 또 다른 例를 들어: 二項演算 * (곱셈) 은 定數에 對한 交換法則이 成立하지만, 行列 곱셈 의 境遇 交換法則이 成立하지 않는다.

目錄 [ 編輯 ]

몇 가지 一般的인 프로그래밍 言語의 分類는 프로그래머와 演算子가 미리 定義된 集合으로 오버로드 可能 與否를 나타낸 것이다.

演算子 오버로딩 不可能 오버로딩 可能
新規 正義
制限된 集合

演算子 오버로딩의 年代順 [ 編輯 ]

1960年代 [ 編輯 ]

ALGOL 68 機能은 演算子 오버로딩을 許容한다. [6]

演算子 오버로딩 ¬, =, ≠ 그리고 abs 가 定義된 ALGOL 68 言語 機能 (페이지 177)에서 抽出:

10.2.2. 부울 被演算子에 對한 演算
a) 
op
 ∨ = (
bool
 a, b) 
bool
:( a | 
true
 | b );
b) 
op
 ∧ = (
bool
 a, b) 
bool
: ( a | b | 
false
 );
c) 
op
 ¬ = (
bool
 a) 
bool
: ( a | 
false
 | 
true
 );
d) 
op
 = = (
bool
 a, b) 
bool
:( a∧b ) ∨ ( ¬b∧¬a );
e) 
op
 ≠ = (
bool
 a, b) 
bool
: ¬(a=b);
f) 
op
 abs
 = (
bool
 a)
int
: ( a | 1 | 0 );

特別한 宣言이 演算子를 오버로드하기 爲해 必要하지 않는다는 點을 參考하고, 프로그래머는 새로운 演算子를 자유롭게 만들 수 있다.

1980年代 [ 編輯 ]

에이다 는 에이다 83 言語 標準의 出版과 함께 처음 紹介됨에서 演算子 오버로딩을 支援한다. 그러나, 言語의 設計者는 새로운 演算子의 定義를 許容하지 않도록 選擇한다: 但只 言語의 旣存 演算子 (예 : "+", "*", "and" 等 識別子 새로운 機能을 定義하여)를 오버로딩할 수 있다. 言語의 後續 改正 (1995年과 2005年)은 旣存 演算子의 오버로딩에 對한 制限을 維持한다.

C++ 의 演算子 오버로딩은 ALGOL 68 에서 더 修正되었다. [7]

1990年代 [ 編輯 ]

Sun은 자바 言語로 오버로딩 演算子를 包含하지 않기로 選擇한다. [8] [9]

2001年 [ 編輯 ]

마이크로소프트는 C# 에서 演算子의 오버로딩을 包含했다.

같이 보기 [ 編輯 ]

各州 [ 編輯 ]

  1. “C++ FAQ Lite: What are the benefits of operator overloading?” . 2010年 6月. 2011年 8月 14日에 原本 文書 에서 保存된 文書 . August 2010에 確認함 .  
  2. 象徵的인 이름으로 바이너里 機能 揷入을 呼出할 수 있다
  3. 포트란 90에서 紹介
  4. 오버로딩의 類型 클래스를 代身함
  5. “Operator Overloading, Free Pascal Manual” . 2011年 6月 23日에 原本 文書 에서 保存된 文書 . June 2011에 確認함 .  
  6. A. van Wijngaarden , B.J. Mailloux , J.E.L. Peck and C.H.A. Koster ; 外. (1968年 8月). “알고리즘 言語 ALGOL 68에 對한 報告書, Section 10.2.2.” (PDF) . 2012年 7月 17日에 原本 文書 (PDF) 에서 保存된 文書 . April 2007에 確認함 .  
  7. Bjarne Stroustrup. “C++의 歷史: 1979?1991 - 페이지 12” (PDF) . April 2007에 確認함 .  
  8. [1]
  9. [2]