한국   대만   중국   일본 
反映 (컴퓨터 科學) - 위키百科, 우리 모두의 百科事典 本文으로 移動

反映 (컴퓨터 科學)

위키百科, 우리 모두의 百科事典.
( 反映 (컴퓨터) 에서 넘어옴)

反映 (reflection)은 컴퓨터 科學 用語로, 컴퓨터 프로그램에서 런타임 時點에 使用되는 自身의 構造와 行爲를 管理(type introspection)하고 修正할 수 있는 프로세스를 意味한다. “type introspection”은 客體 志向 프로그램諺語에서 런타임에 客體의 兄(type)을 決定할 수 있는 能力을 의미한다.

많은 컴퓨터 아키텍처에서, 프로그램 命令은 데이터와 같이 메모리에 積載되므로, 命令과 데이터 사이의 區分은 但只 컴퓨터와 프로그램 言語에 依하여 어떻게 情報가 處理되느냐의 問題이다. 一般的으로, 命令은 實行되고, 데이터는 (命令의 資料로서) 處理된다. 그렇지만, 어떤 言語에서는, 프로그램은 命令 亦是 데이터와 같은 方式으로 處理할 수 있기 때문에, reflective 修正이 可能하게 된다. 가장 一般的으로 反映은 스몰토크 , 스크립트 言語와 같이 높은 水準의 假想 머신 프로그램 言語에서 主로 많이 使用되고, 자바 , C 言語 와 같이 宣言的이거나 政敵 形式의 프로그램 言語에서는 드물게 使用된다.

利用 [ 編輯 ]

反映은 런타임에 프로그램의 遂行을 修正하고, 觀察하기 위하여 使用할 수 있다. 反映 志向的인 프로그램 構成 要素는 內部 코드의 實行을 監視할 수 있고, 構成 要素 自身의 窮極的인 目標에 맞도록 內部를 受精 할 수 있다. 이는 典型的으로 런타임에 프로그램 코드를 動的으로 割當하여 이루어진다.

反映은 프로그램을 서로 다른 狀況에서 動的으로 使用할 수 있게 한다. 例를 들어, 비슷한 動作을 遂行하는 서로 다른 클래스 ‘X’와 클래스 ‘Y’를 交替하여 使用하는 應用 프로그램을 考慮해보자. 反映 志向的이 아닌 프로그램 開發에서는, 應用 프로그램은 클래스 ‘X’와 클래스 ‘Y’의 函數를 呼出하기 위하여, 函數(이름)을 直接 코드로 作成해야 한다. 反面, 反映 志向的인 프로그램 패러다임에서, 應用 프로그램은 函數(이름)을 直接 코드로 作成하지 않고, 클래스 ‘X’와 클래스 ‘Y’의 函數를 呼出하기 위하여, 反映을 利用하여 設計되고 作成될 수 있다. 反映 志向的인 프로그램은 보다 普遍的인(Generic) 코드의 遂行의 機能을 使用하기 위하여, 거의 언제나 追加的인 情報, 프레임워크, 聯關 史上, 客體 關係 等을 必要로 한다. 反映 志向的인 프로그램 技術을 擴張하면, 하드 코딩을 防止할 수 있다.

機能 [ 編輯 ]

反映이 支援되는 言語는, 낮은 水準의 言語의 處理와는 다른, 런타임에 使用할 수 있는 매우 模糊한 몇 가지 特性을 提供한다. 이런 特性들은 다음과 같다.

  • 런타임에 First-Class 客體로서 소스 코드의 生聖子(코드 블록, 메소드, 프로토콜, ……)를 認識하고 修正할 수 있다.
  • 參照 및, 呼出되는 클래스 또는 函數와 一致하는 文字列을 클래스 또는 函數의 記號 이름으로 變換할 수 있다.
  • 런타임에 소스 코드 口文으로 構成된 文字列을 評價할 수 있다.
  • 프로그래밍 構成에 새로운 意味 또는 意圖를 附與하여, 프로그램 言語의 바이트 코드에 對한 새로운 飜譯機를 生成할 수 있다.

컴파일 言語들은 소스 코드에 對한 情報를 提供하기 위하여, 自身들의 런타임 시스템에 依存한다. 例를 들어, 컴파일 된 오브젝티브 C 實行 모듈은, 프로그램 컴파일 過程을 통하여 소스 코드와 메소드가 相應하는 테이블을 提供하여, 實行 모듈의 블록 안에 모든 메소드의 이름을 記錄한다. 커먼 리스프 (Common Lisp) 言語와 같이, 函數의 런타임 生成을 支援하는 컴파일 言語는 런타임 環境은 컴파일 또는 인터프리터를 包含해야 한다.

反映은 自動化된 소스 코드 變換 體系를 定義한 프로그램 變換 시스템을 使用하여, 反映 技法이 內藏되지 않은 言語에서 具現될 수 있다.

예제 [ 編輯 ]

다음은 여러 言語에서 具現된 反映의 使用 例를 表示한다.

C# :

Int32
 i
 =
 1234
;

Console
.
WriteLine
(
String
.
Format
(
"{0}"
,
 i
.
ToString
(
"F"
)));


Type
 t
 =
 typeof
(
Int32
);

// Reflection 1

Object
 res1

 =
 t
.
InvokeMember
(
"ToString"
,

 System
.
Reflection
.
BindingFlags
.
InvokeMethod
,

 null
,

 i
,

 new
 Object
[]{
"C"
,
 CultureInfo
.
CreateSpecificCulture
(
"ko-KR"
)});

Console
.
WriteLine
(
String
.
Format
(
"{0}"
,
 res1
));


// Reflection 2

System
.
Reflection
.
MethodInfo
 method

 =
 t
.
GetMethod
(
"ToString"
,
 new
 Type
[]
 {
 typeof
(
String
)
 });

Object
 res2
 =
 method
.
Invoke
(
i
,
 new
 Object
[]
 {
"X"
});

Console
.
WriteLine
(
String
.
Format
(
"{0}"
,
 res2
));

Objective-C

NSString
*
 str
 =
 [[
NSString
 alloc
]
 initWithString
:
@"1234"
];

NSLog
(
@"%d"
,
 (
int
)[
str
 length
]);


// Reflection

Class
 class
 =
 NSClassFromString
(
@"NSString"
);

id
 idOfClass
 =
 [[
class
 alloc
]
 initWithString
:
@"Reflection"
];

SEL
 selector
 =
 NSSelectorFromString
(
@"length"
);

NSLog
(
@"%d"
,
 (
int
)[
idOfClass
 performSelector
:
selector
]);


[
str
 release
];

[
idOfClass
 release
];

파이썬 :

>>>
 class
 MyClass
:

...
 def
 Hello
(
self
,
 sText
):

...
 return
 'Hello '
 +
 sText

...

>>>
 MyClass
()
.
Hello
(
'Peter'
)

'Hello Peter'

>>>

>>>
 getattr
(
globals
()[
'MyClass'
](),
 'Hello'
)(
'Peter'
)

'Hello Peter'

>>>

같이 보기 [ 編輯 ]