๋ญ”๊ฐ€ ๊ฐค ๋ณด๊ณ  ์žˆ์œผ๋ฉด 'UniRx๋ฅผ ๊ณต๋ถ€ํ•ด์•ผํ•˜๋‚˜?' ์ƒ๊ฐํ•˜๋Š” ์‚ฌ๋žŒ๋“ค๊ณผ
๋ฌด์ง€์„ฑ UniRX ์‹ ๋ด‰์ž๋“ค์ด ๊ฝค ์žˆ๋Š”๊ฑฐ ๊ฐ™์•„์„œ ์ œ๋Œ€๋กœ ์ •๋ณด๋ฅผ ์ฃผ๊ธฐ ์œ„ํ•ด ๊ธ€์”€.
๊ฒฐ๋ก ๋งŒ ๋ณผ ์‚ฌ๋žŒ์€ ๋งจ ์•„๋ž˜ ๊ฒฐ๋ก ๋งŒ ๋ณด์…ˆ.


https://neuecc.medium.com/r3-a-new-modern-reimplementation-of-reactive-extensions-for-c-cf29abcc5826
UniRX, UniTask, R3 ๊ฐœ๋ฐœ์ž์ธ ์นด์™€์ด ์š”์‹œํ›„๋ฏธ์˜ ๋ธ”๋กœ๊ทธ ๊ธฐ์‚ฌ ์ธ์šฉ

์ฐธ๊ณ ๋กœ ์š”์‹œํ›„๋ฏธ๋Š” Cysharp.Inc์˜ ๋Œ€ํ‘œ๋กœ ์‚ฌ์ด๊ฒŒ์ž„์ฆˆ ์žํšŒ์‚ฌ๊ณ ,
์ด ํšŒ์‚ฌ๋Š” ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์šฉ ์˜คํ”ˆ ์†Œ์Šค C# ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ „๋ฌธ ๊ฐœ๋ฐœ์‚ฌ๋กœ C#์„ ๊ฐœ๋ฐœ ์–ธ์–ด์˜ ํ‘œ์ค€์œผ๋กœ ๋งŒ๋“œ๋Š”๊ฒŒ ๋ชฉํ‘œ์ž„.
C#์— ๋ฏธ์นœ ์‚ฌ๋žŒ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋จ.


โ”€โ”€โ”€


"Rx๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? .NET์ด๋‚˜ Unity๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Java, Swift, Kotlin์—์„œ๋„ โ€œ์•„๋‹ˆ์š”โ€๋ผ๊ณ  ๋Œ€๋‹ตํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์กด์žฌ๊ฐ์ด ํ™•์—ฐํžˆ ์ค„์–ด๋“ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ? ๋Œ€๋‹ต์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค, async/await์˜ ์ถœํ˜„์ž…๋‹ˆ๋‹ค."

"async/await๊ฐ€ ๋„๋ฆฌ ์ฑ„ํƒ๋˜๋ฉด์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋งŒ์„ ์œ„ํ•œ Rx์˜ ํ•„์š”์„ฑ์ด ์ค„์–ด๋“ค๊ณ  ์ฑ„ํƒ๋ฅ ๋„ ๊ฐ์†Œํ–ˆ์Šต๋‹ˆ๋‹ค. Unity์˜ Rx ํ‘œ์ค€์ธ UniRx์˜ ๊ฐœ๋ฐœ์ž๋กœ์„œ ์ €๋Š” ๊ฒŒ์ž„ ์—”์ง„(Unity)์— ๋งž๋Š” async/await ๋Ÿฐํƒ€์ž„์˜ ํ•„์š”์„ฑ์„ ๋น ๋ฅด๊ฒŒ ์ธ์‹ํ•˜๊ณ  Unity์—์„œ ํ•„์š”ํ•œ ์กฐ๊ฑด(C# 7.0)์ด ์ถฉ์กฑ๋˜์ž๋งˆ์ž UniTask๋ฅผ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค."

์ด๊ฒŒ ๋ฌด์Šจ ์†Œ๋ฆฌ๋ƒ? Rx๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ LINQ, ๋‘ ๊ฐ€์ง€ ๋ถ€๋ถ„์—์„œ ๊ฐ•์ ์ด ์žˆ์—ˆ๋Š”๋ฐ, async/await์ด ์ถœํ˜„ํ•˜๋ฉด์„œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ถ€๋ถ„์—์„œ์˜ ๊ฐ•์ ์„ ์žƒ์–ด๋ฒ„๋ฆฌ์ž ์‚ฌ๋žŒ๋“ค์ด ๋ฐ”๋กœ Rx๋ฅผ ๋ฒ„๋ ธ๋‹ค๋Š” ์–˜๊ธฐ์ž„.

์ด์ƒํ•˜์ง€? ๊ฐ™์€ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์˜ ๊ฐœ๋…์ด๋ฉด ์“ฐ๋˜ Rx๋ฅผ ๊ณ„์† ์“ฐ์ง€ ์™œ Rx๋ฅผ ๋ฒ„๋ ค๋ฒ„๋ฆด๊นŒ?

๋‹ต์€ ๊ฐ„๋‹จํ•˜๋‹ค.

์ข‹๋‹ค๊ณ  ๋ฏฟ์€๊ฒŒ ์“ฐ๋‹ค๋ณด๋‹ˆ๊นŒ ๋ถˆํŽธํ•˜๊ธฐ ๋•Œ๋ฌธ์ž„.

์ŠคํŠธ๋ฆผ์ด๋ž€ ๊ฐœ๋…์ด ๋””๋ฒ„๊น…์„ ํž˜๋“ค๊ฒŒ ๋งŒ๋“ค๊ณ  ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ๊ฑฐ๋“ .
ํŠนํžˆ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ํฌ๋ฉด ํด์ˆ˜๋ก Rx๋Š” ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๋””๋ฒ„๊น…์„ ํž˜๋“ค๊ฒŒ ๋งŒ๋“ฌ.
์ŠคํŠธ๋ฆผ๋“ค์ด ์–ด๋–ป๊ฒŒ ์—ฎ์—ฌ์žˆ๋Š”์ง€ ์•Œ๊ธฐ ํž˜๋“œ๋‹ˆ๊นŒ.
๊ฐœ๋ฐœ ๊ธฐ๊ฐ„์˜ ๋งŽ์€ ๋น„์œจ์„ ๋””๋ฒ„๊น… ํ•˜๋Š”๋ฐ ๋ณด๋‚ด๋Š”๋ฐ ๊ทธ๊ฑธ ํž˜๋“ค๊ฒŒ ๋งŒ๋“ ๋‹ค? ์—„์ฒญ๋‚œ ๋””๋ฉ”๋ฆฌํŠธ์ง€.

๊ทธ๋‚˜๋งˆย ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์ชฝ์€ ๋Œ€์•ˆ์ด ์—†์œผ๋‹ˆ๊นŒ ์“ฐ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ๋Œ€์•ˆ์ด ๋‚˜์™”๋‹ค? ๊ณ„์† ์“ฐ๊ณ  ์žˆ์„ ์ด์œ ๊ฐ€ ์—†์Œ.

์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ LINQ,์ชฝ์œผ๋กœ๋Š” ์–ด๋•Œ?
๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ถ€๋ถ„์„ ๋บ€ Rx๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ์ƒ์—์„œ ์“ฐ์ผ ๋ถ€๋ถ„์ด ๊ทนํžˆ ์ ์Œ.

๊ตฌ๊ธ€์— UniRx๋‚˜ Rx๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋‹ค์–‘ํ•œ ์†Œ๊ฐœ ๋ธ”๋กœ๊ทธ๋“ค์ด ๋‚˜์˜ค๊ณ  ์ด๊ฒƒ์ €๊ฒƒ Before, After ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณด์—ฌ์ฃผ๋ฉด์„œ "Rx๋Š” ์ด๋ ‡๊ฒŒ ํ›Œ๋ฅญํ•˜๋‹ค!"๋ผ๊ณ  ์–˜๊ธฐํ•จ.

๋ฌธ์ œ๋Š” ๊ฑ”๋„ค๊ฐ€ ์ž‘์„ฑํ•œ Before ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋กœ์ง์ด ๋งค์šฐ ๋‹จ์ˆœํ•˜๊ฑฐ๋‚˜ ์ €๋Ÿฐ ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์•ˆ๋œ๋‹ค์˜ ํ‘œ๋ณธ์ ์ธ ์ฝ”๋“œ๋ผ๋Š”๊ฑฐ์ž„.

"HP๊ฐ€ 0์ด ๋  ๋•Œ๋ฅผ ๊ฐ์‹œํ•˜๋‹ค๊ฐ€ 0์ด ๋˜๋ฉด OnDead ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์š”"
=> HP์— event๋ฅผ ๋“ฑ๋กํ•ด๋‘๊ณ  HP ๊ณ„์‚ฐ ์ค‘์— 0์ด ๋์„ ๋•Œ ํ†ต๋ณด๋ฅผ ๋ฐ›์ง€ ๋ˆ„๊ฐ€ ๋ฉ์ฒญํ•˜๊ฒŒ HP๊ฐ€ 0์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ๊ณ„์† ๊ฐ์‹œํ•˜๊ณ  ์žˆ์Œ?

"Buffer๋ฅผ ์ด์šฉํ•ด์„œ ๋”๋ธ” ํด๋ฆญ์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”!"
=> ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋”๋ธ” ํด๋ฆญ ๊ฐ„๊ฒฉ์ด๋‚˜ ํด๋ฆญ ํšŸ์ˆ˜๋ฅผ ๋ฐ”๊พธ๊ณ  ์‹ถ์œผ๋ฉด ๊ทธ๋•Œ๋งˆ๋‹ค ์ŠคํŠธ๋ฆผ์„ ์ƒˆ๋กœ ๊ตฌ์„ฑํ•ด์•ผํ•˜์ž–์•„? ์ด๊ฒŒ ์ข‹์€๊ฑฐ ๋งž๋ƒ?

์‚ฌ์‹ค์ƒ ๊ฒ€์ƒ‰์œผ๋กœ ๋‚˜์˜ค๋Š” ์ •๋ณด๋“ค์€ ๊ทธ๋ƒฅ ์ง„์งœ ๋ญ๊ฐ€ ์ข‹์€์ง€ ๋ชจ๋ฅด๋Š” Rx ์ข‹์Œ ํ˜ธ์†Œ์ธ๋“ค์˜ ํ˜ธ์†Œ๋ผ๊ณ  ๋ด์•ผํ•œ๋‹ค.
๋‹ค๋งŒ ๋งํ–ˆ๋“ฏ์ด ์“ฐ์ผ ๋ถ€๋ถ„์ด ์•„์˜ˆ ์—†๋Š”๊ฒŒ ์•„๋‹ˆ๋‹ค, ์ ์€๊ฑฐ์ง€.

๋‹จ๋…์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€ UI ๋ถ€๋ถ„์—์„  ๋ถ„๋ช… ์œ ์šฉํ•˜๊ฒŒ ํ™œ์šฉํ•  ๊ณณ์ด ๋งŽ์Œ.

"- Use UniRx as well, if your game architecture relies heavily on event handling. I'm working on a mobile multiplayer RPG with real-time combat. We use ECS for the core gameplay loop, but everything else (UI, resource management, meta) is built using traditional event-based approach. So for gameplay events we have special IComponentData and separate systems to handle those, but for non-gameplay stuff I'd still use IObservable as it's the interface to describe push-based streams (as opposed to pull-based async IEnumerable)"

๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์–ด RPG ๊ฒŒ์ž„์„ ๋งŒ๋“œ๋Š” ํ•œ ๊ฐœ๋ฐœ์ž๋Š” ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด ๋ถ€๋ถ„์€ ์ „ํ†ต์ ์ธ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด ์•ˆ์“ฐ์ง€๋งŒ, ๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด ์™ธ์ ์ธ ๋ถ€๋ถ„์—์„  ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•จ.

๋ฌธ์ œ๋Š” ์•„์ฃผ ํ•œ์ •๋œ ๊ณณ์— ๋ถ€๋ถ„์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ ค๊ณ  Rx ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์–น์–ด์•ผํ•˜๋ƒ๋Š”๊ฑฐ์ž„.
๋ถ€๋ถ„์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด Rx ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์–น์Œ์œผ๋กœ์จ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋ฅผ ๊ฐ๋‹นํ•  ๊ฒƒ์ธ๊ฐ€?
๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์—ฌ๊ธฐ์— 'No'๋ผ๊ณ  ๋‹ตํ–ˆ๊ณ  ๊ทธ๋ž˜์„œ ๋ฒ„๋ ค์ง„ ๊ฒƒ์ž„.

์š”์‹œํ›„๋ฏธ๋Š” ๊ธฐ์‚ฌ์— ์•„์ง
Kotlin์ด๋ž‘ Swift์—์„œ Rx๊ฐ€ ํ™œ๋ฐœํžˆ ์“ฐ์ธ๋‹ค๊ณ  ์–˜๊ธฐํ•˜์ง€๋งŒ, ์ฐพ์•„๋ณด๋‹ˆ๊นŒ ์ €์ชฝ๋„ ๋ถ„์œ„๊ธฐ๋Š” ๊ฐ™๋”๋ผ.

์—ฌ๊ธฐ๋„ ๋””๋ฒ„๊น…๊ณผ ๊ฐ€๋…์„ฑ ๋ฌธ์ œ ๋•Œ๋ฌธ์— async/await์œผ๋กœ ๋„˜์–ด๊ฐˆ๋ ค๊ณ ํ•˜๊ณ , UI ์ชฝ์—๋Š” ์œ ์šฉํ•˜๋‹ˆ๊นŒ ๊ทธ ๋ถ€๋ถ„์—์„œ ํ•œ์ •ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•จ.

Kotlin๊ณผ Swift๋Š” ์ž์ฒด์ ์œผ๋กœ Rx ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ๋‹ค UI์ชฝ๊ณผ ํ˜ธํ™˜์„ฑ์ด ์ข‹๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ตณ์ด ๊ผญ ๋ฒ„๋ ค์•ผํ•  ์ด์œ ๋Š” ์—†์Œ.

ํ•˜์ง€๋งŒ ์œ ๋‹ˆํ‹ฐ๋Š” ์•„๋‹ˆ์ง€.

๊ทธ๋Ÿผ ์š”์‹œํ›„๋ฏธ๋Š” ์ƒˆ๋กœ์šด C# Rx ํ”„๋ ˆ์ž„์›Œํฌ์ธ R3๋ฅผ ์™œ ๋งŒ๋“ค์—ˆ๋ƒ?


"๊ทธ๋ ‡๋‹ค๋ฉด Rx์˜ ๊ฐ€์น˜๋Š” ์–ด๋””์— ์žˆ์„๊นŒ์š”? ์ €๋Š” 'LINQ์™€ LINQ to Events๋ฅผ ์ด์šฉํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ๋ฉ”์„ธ์ง€๋ฅผ ์ฒ˜๋ฆฌ'๋ผ๋Š” ๊ทผ๋ณธ์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค."


"๊ฒŒ์ž„ ์—”์ง„(Unity)์— ์‚ฌ์šฉ๋˜๋Š” UniRx ๊ฐœ๋ฐœ์ž๋กœ์„œ
๋ณต์žกํ•˜๊ณ  Event๊ฐ€ ๋งŽ์€ ๊ฒŒ์ž„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋„ ์ €๋Š” Rx๊ฐ€ ๋งค์šฐ ์œ ์ตํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ด€์ฐฐ์ž(Observer) ํŒจํ„ด๊ณผ Event์˜ ์ค‘์š”์„ฑ์€ ๋ถ€์ธํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, "๋” ๋‚˜์€ Event"๋กœ์„œ์˜ Rx์˜ ์—ญํ•  ๋˜๋Š” ๊ถ๊ทน์ ์ธ ๊ด€์ฐฐ์ž ํŒจํ„ด์€ ๋ณ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

"์ €๋Š” Rx์˜ ๊ฐ€์น˜๋ฅผ ๋˜์‚ด๋ฆฌ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Rx๋ฅผ ์žฌ๊ฑดํ•˜๋Š”๊ฑด ์ €๋งŒ์ด ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ์—ˆ์Šต๋‹ˆ๋‹ค."

// Rx๊ฐ€ ์ž๊ธฐ ์ปค๋ฆฌ์–ด์— ๋งŽ์€ ์˜ํ–ฅ์„ ๋ผ์ณ์„œ ์ด๋Ÿฐ ๋ง์„ ํ•˜๋Š”๊ฑฐ์ž„

์š”์•ฝํ•˜๋ฉด "Rx ์กด๋‚˜ ์ข‹์€๋ฐ ์™œ ์•ˆ์“ฐ๋ƒ? ๋‚ด๊ฐ€ ์ƒˆ๋กœ ๋งŒ๋“ค์—ˆ์œผ๋‹ˆ ์จ์ค˜."์ž„
์ฐธ ํŠธ๋ฃจ Rx ์ข‹์Œ ํ˜ธ์†Œ์ธ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Œ.

โ”€โ”€โ”€


๊ฒฐ๋ก 
UniRx ๋ฐฐ์›Œ์•ผํ•˜๋‚˜? ์ง„์ง€ํ•˜๊ฒŒ ๊ณ ๋ฏผํ•  ํ•„์š” ์ „ํ˜€ ์—†์Œ.
๋ฐฐ์šฐ๊ณ  ์‹ถ์œผ๋ฉด ๋ฐฐ์›Œ์„œ ์จ, ํŽธํ•œ ์‚ฌ๋žŒํ•œํ…Œ๋Š” ๋ถ„๋ช… ํŽธํ•˜๊ฒ ์ง€.
ํ•˜์ง€๋งŒ Rx๊ฐ€ ํ˜์‹ ๋„ ์•„๋‹ˆ๊ณ , ๋ฏธ๋ž˜๋ฅผ ์ง€๋ฐฐํ•  ํŒจ๋Ÿฌ๋‹ค์ž„๋„ ์•„๋‹ˆ๋ฉฐ, ์‹ ๋ด‰ํ•  ์ด์œ ๋„ ์—†๋‹ค.
์จ๋ณด๋‹ˆ๊นŒ ๋ณ„๋กœ ๊ฐ™์•„? ์“ฐ์ง€๋งˆ. ํ˜„์žฌ๋กœ์ฌ ๊ทธ์ € ๊ฐ€๋ผ์•‰๊ณ  ์žˆ๋Š” ๋ฐฐ์ผ ๋ฟ์ž„.

"์ด ์ข‹์€๊ฑธ ์™œ ์•ˆ์“ฐ์ง€? ์™œ ์ด๋ ‡๊ฒŒ ์ •๋ณด๊ฐ€ ์—†์–ด? ์—ญ์‹œ ํ•œ๊ตญ ๊ฐœ๋ฐœ์ž ์ƒˆ๋ผ๋“ค์€ ๋ฒ ๋‚„์ค„๋งŒ ์•Œ์ง€ ์‹ค๋ ฅ์ด ์—†์–ด"

์ข‹์€๊ฑธ ์™œ ์•ˆ์“ฐ๊ฒ ๋ƒ? ์•ˆ์ข‹์œผ๋‹ˆ๊นŒ ์•ˆ์“ฐ๋Š”๊ฑฐ์ž„.
๊ธฐ์ˆ ์„ ์˜›๋‚  ์ •๋ณด๋กœ ํŒ๋‹จํ•˜์ง€๋ง๊ณ  ์ตœ๊ทผ ์ •๋ณด๋กœ ํŒ๋‹จํ•ด๋ผ.

์•„ ๊ทธ๋ฆฌ๊ณ  UniRx๋ฅผ ์“ฐ๋ฉด ํผํฌ๋จผ์Šค์— ์ข‹๋‹ค๋А๋‹ˆ ์ด์ƒํ•œ ์†Œ๋ฆฌ๋ฅผ ํ•˜๋Š” ์• ๋“ค์ด ์žˆ๋Š”๋ฐ,

Observing ๋ฐฉ์‹์ด ์ ˆ๋•Œ ํผํฌ๋จผ์Šค์— ์ข‹์„ ์ˆ˜๊ฐ€ ์—†๋‹ค. ๋ฌผ๋ก  ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ํผํฌ๋จผ์Šค๊ฐ€ ๋” ๋‚˜๋น ์งˆ ๊ฒƒ๋„ ํฌ๊ฒŒ ์—†์Œ.
ํ‰์†Œ์— ์ฝ”๋“œ๋ฅผ ๊ฐœ๋–ก๊ฐ™์ด ์งฐ์œผ๋ฉด, Rx์— ๋งž์ถฐ์งœ๋ฉด์„œ ์ฝ”๋“œ๊ฐ€ ์ •๋ฆฌ๊ฐ€ ๋˜๋‹ˆ๊นŒ ์ƒ๋Œ€์ ์œผ๋กœ ํผํฌ๋จผ์Šค๊ฐ€ ์˜ฌ๋ผ๊ฐˆ ์ˆœ ์žˆ์Œ.