๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿฅ– Bread Basics/Obj-c

Obj-C ๊ณต์‹ ๋ฌธ์„œ ์ •๋ฆฌ - ์…€๋ ‰ํ„ฐ(Selector)

by BreadDev 2025. 4. 14.
728x90

์•ˆ๋…•ํ•˜์„ธ์š”. ์ด๋ฒˆ์—๋Š” Objective-C์˜ ์…€๋ ‰ํ„ฐ(Selector)์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ์…€๋ ‰ํ„ฐ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

Objective-C์—์„œ ์…€๋ ‰ํ„ฐ๋Š” ๋‘ ๊ฐ€์ง€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค:

  1. ์†Œ์Šค ์ฝ”๋“œ์—์„œ ๊ฐ์ฒด์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ ์ด๋ฆ„
  2. ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์ปดํŒŒ์ผ๋  ๋•Œ ์ด๋ฆ„์„ ๋Œ€์ฒดํ•˜๋Š” ๊ณ ์œ  ์‹๋ณ„์ž (ํƒ€์ž…: SEL)

์…€๋ ‰ํ„ฐ(Selector): ๋ฉ”์„œ๋“œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ณ ์œ  ์‹๋ณ„์ž๋กœ, ๋Ÿฐํƒ€์ž„์— ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋Š” ๋™์ผํ•œ ์…€๋ ‰ํ„ฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด์— ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” Cocoa์˜ ํƒ€๊ฒŸ-์•ก์…˜(target-action) ๋””์ž์ธ ํŒจํ„ด ๊ตฌํ˜„์˜ ๊ธฐ์ดˆ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ฉ”์„œ๋“œ์™€ ์…€๋ ‰ํ„ฐ์˜ ๊ด€๊ณ„

ํšจ์œจ์„ฑ์„ ์œ„ํ•ด ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ์—์„œ๋Š” ์ „์ฒด ASCII ์ด๋ฆ„์ด ๋ฉ”์„œ๋“œ ์…€๋ ‰ํ„ฐ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ํ…Œ์ด๋ธ”์— ์ž‘์„ฑํ•œ ๋‹ค์Œ, ์ด๋ฆ„๊ณผ ๋Ÿฐํƒ€์ž„์— ๋ฉ”์„œ๋“œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ณ ์œ  ์‹๋ณ„์ž๋ฅผ ์Œ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ค‘์š”: ๋Ÿฐํƒ€์ž„ ์‹œ์Šคํ…œ์€ ๊ฐ ์‹๋ณ„์ž๊ฐ€ ๊ณ ์œ ํ•˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์…€๋ ‰ํ„ฐ๊ฐ€ ๋™์ผํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋Š” ๋™์ผํ•œ ์…€๋ ‰ํ„ฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

SEL๊ณผ @selector

์ปดํŒŒ์ผ๋œ ์…€๋ ‰ํ„ฐ๋Š” ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์™€ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ํŠน์ˆ˜ ํƒ€์ž…์ธ SEL์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. ์œ ํšจํ•œ ์…€๋ ‰ํ„ฐ๋Š” ์ ˆ๋Œ€ 0์ด ์•„๋‹™๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์ด ๋ฉ”์„œ๋“œ์— SEL ์‹๋ณ„์ž๋ฅผ ํ• ๋‹นํ•˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค; ์ž„์˜๋กœ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

@selector() ์ง€์‹œ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ „์ฒด ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ๋Œ€์‹  ์ปดํŒŒ์ผ๋œ ์…€๋ ‰ํ„ฐ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

SEL setWidthHeight;
setWidthHeight = @selector(setWidth:height:);

์ปดํŒŒ์ผ ์‹œ๊ฐ„์— @selector() ์ง€์‹œ์–ด๋กœ SEL ๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Ÿฐํƒ€์ž„์— ๋ฌธ์ž์—ด์„ ์…€๋ ‰ํ„ฐ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” NSSelectorFromString ํ•จ์ˆ˜๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

setWidthHeight = NSSelectorFromString(aBuffer);

๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ์˜ ๋ณ€ํ™˜๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. NSStringFromSelector ํ•จ์ˆ˜๋Š” ์…€๋ ‰ํ„ฐ์— ๋Œ€ํ•œ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค:

NSString *method;
method = NSStringFromSelector(setWidthHeight);

๐Ÿ“Œ ์…€๋ ‰ํ„ฐ์˜ ํŠน์„ฑ

๋ฉ”์„œ๋“œ ์ด๋ฆ„ vs ๊ตฌํ˜„

์ปดํŒŒ์ผ๋œ ์…€๋ ‰ํ„ฐ๋Š” ๋ฉ”์„œ๋“œ ๊ตฌํ˜„์ด ์•„๋‹Œ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•œ ํด๋ž˜์Šค์˜ display ๋ฉ”์„œ๋“œ๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์ •์˜๋œ display ๋ฉ”์„œ๋“œ์™€ ๋™์ผํ•œ ์…€๋ ‰ํ„ฐ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

๋‹คํ˜•์„ฑ(Polymorphism): ์ด๊ฒƒ์€ ๋‹คํ˜•์„ฑ๊ณผ ๋™์  ๋ฐ”์ธ๋”ฉ์— ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์†ํ•œ ์ˆ˜์‹ ์ž์—๊ฒŒ ๋™์ผํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ ๊ตฌํ˜„๋‹น ํ•˜๋‚˜์˜ ์…€๋ ‰ํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด, ๋ฉ”์‹œ์ง€๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ๋‹ค๋ฅผ ๋ฐ” ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ์™€ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ

๊ฐ™์€ ์ด๋ฆ„์˜ ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ์™€ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋Š” ๋™์ผํ•œ ์…€๋ ‰ํ„ฐ๋ฅผ ํ• ๋‹น๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์„œ๋กœ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ ๋•Œ๋ฌธ์— ๋‘˜ ์‚ฌ์ด์— ํ˜ผ๋™์€ ์—†์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋Š” display ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ ์™ธ์—๋„ display ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜ ํƒ€์ž…๊ณผ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…

๋ฉ”์‹œ์ง• ๋ฃจํ‹ด์€ ์…€๋ ‰ํ„ฐ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋ฉ”์„œ๋“œ ๊ตฌํ˜„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋™์ผํ•œ ์…€๋ ‰ํ„ฐ๋ฅผ ๊ฐ€์ง„ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์ •์ ์œผ๋กœ ํƒ€์ž…์ด ์ง€์ •๋œ ์ˆ˜์‹ ์ž์—๊ฒŒ ๋ณด๋‚ด๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ œ์™ธํ•˜๊ณ , ๋™์  ๋ฐ”์ธ๋”ฉ์€ ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ชจ๋“  ๊ตฌํ˜„์ด ๋™์ผํ•œ ๋ฐ˜ํ™˜ ํƒ€์ž…๊ณผ ๋™์ผํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์„ ๊ฐ€์งˆ ๊ฒƒ์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋Ÿฐํƒ€์ž„์— ๋ฉ”์‹œ์ง€ ๋ณ€๊ฒฝํ•˜๊ธฐ

NSObject ํ”„๋กœํ† ์ฝœ์— ์ •์˜๋œ performSelector:, performSelector:withObject:, performSelector:withObject:withObject: ๋ฉ”์„œ๋“œ๋Š” ์ดˆ๊ธฐ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ SEL ์‹๋ณ„์ž๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์„ธ ๋ฉ”์„œ๋“œ ๋ชจ๋‘ ๋ฉ”์‹œ์ง• ํ•จ์ˆ˜์— ์ง์ ‘ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค:

[friend performSelector:@selector(gossipAbout:) withObject:aNeighbor];

์ด๋Š” ๋‹ค์Œ๊ณผ ๋™๋“ฑํ•ฉ๋‹ˆ๋‹ค:

[friend gossipAbout:aNeighbor];

์ด ๋ฉ”์„œ๋“œ๋“ค์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๋Š” ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Ÿฐํƒ€์ž„์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค:

id helper = getTheReceiver();
SEL request = getTheSelector();
[helper performSelector:request];

์ฃผ์˜: performSelector: ๋ฐ ๊ด€๋ จ ๋ฉ”์„œ๋“œ๋Š” id ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜ํ–‰๋˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ๋‹ค๋ฅธ ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ ์ ˆํ•œ ํƒ€์ž…์œผ๋กœ ์บ์ŠคํŒ…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ํƒ€๊ฒŸ-์•ก์…˜ ๋””์ž์ธ ํŒจํ„ด

AppKit๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ์ปจํŠธ๋กค ์ฒ˜๋ฆฌ์—์„œ ๋Ÿฐํƒ€์ž„์— ์ˆ˜์‹ ์ž์™€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ชจ๋‘ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ž˜ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

NSControl ๊ฐ์ฒด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ง€์‹œ๋ฅผ ๋‚ด๋ฆฌ๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋ž˜ํ”ฝ ์žฅ์น˜์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์€ ๋ฒ„ํŠผ, ์Šค์œ„์น˜, ๋…ธ๋ธŒ, ํ…์ŠคํŠธ ํ•„๋“œ, ๋‹ค์ด์–ผ, ๋ฉ”๋‰ด ํ•ญ๋ชฉ ๋“ฑ๊ณผ ๊ฐ™์€ ์‹ค์ œ ์ œ์–ด ์žฅ์น˜๋ฅผ ๋‹ฎ์•˜์Šต๋‹ˆ๋‹ค.

ํƒ€๊ฒŸ-์•ก์…˜ ํŒจํ„ด(Target-Action Pattern): ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ๊ฐ€ ํŠน์ • ๊ฐ์ฒด(ํƒ€๊ฒŸ)์— ํŠน์ • ๋ฉ”์‹œ์ง€(์•ก์…˜)๋ฅผ ๋ณด๋‚ด๋Š” ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

AppKit๋Š” ์ œ์–ด ์žฅ์น˜๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์„ ์ •์˜ํ•˜๊ณ  ์ž์ฒด์ ์œผ๋กœ ๋ช‡ ๊ฐ€์ง€ ๊ธฐ์„ฑํ’ˆ ์žฅ์น˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, NSButtonCell ํด๋ž˜์Šค๋Š” ํฌ๊ธฐ, ๋ ˆ์ด๋ธ”, ๊ทธ๋ฆผ, ํฐํŠธ, ํ‚ค๋ณด๋“œ ๋‹จ์ถ•ํ‚ค๋กœ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:

[myButtonCell setAction:@selector(reapTheWind:)];
[myButtonCell setTarget:anObject];

์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋ฒ„ํŠผ ์…€์€ NSObject ํ”„๋กœํ† ์ฝœ ๋ฉ”์„œ๋“œ์ธ performSelector:withObject:๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋ชจ๋“  ์•ก์…˜ ๋ฉ”์‹œ์ง€๋Š” ๋‹จ์ผ ๋งค๊ฐœ๋ณ€์ˆ˜, ์ฆ‰ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ์ œ์–ด ์žฅ์น˜์˜ id๋ฅผ ์ทจํ•ฉ๋‹ˆ๋‹ค.

Objective-C๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, ๋ชจ๋“  NSButtonCell ๊ฐ์ฒด๋Š” ๋™์ผํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ ์ด๋ฆ„์€ NSButtonCell ์†Œ์Šค ์ฝ”๋“œ์— ๊ณ ์ •๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ์ฒด๊ฐ€ ๋‘˜ ์ด์ƒ์˜ ๋ฒ„ํŠผ ์…€์— ์‘๋‹ตํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ณ , ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์žฌ๋ฐฐ์—ดํ•  ๋•Œ๋งˆ๋‹ค ์•ก์…˜ ๋ฉ”์‹œ์ง€์— ์‘๋‹ตํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์„ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ฉ”์‹œ์ง• ์˜ค๋ฅ˜ ๋ฐฉ์ง€ํ•˜๊ธฐ

๊ฐ์ฒด๊ฐ€ ๋ ˆํผํ† ๋ฆฌ์— ์—†๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ข…๋ฅ˜์˜ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฉ”์‹œ์ง•์€ ๋Ÿฐํƒ€์ž„์— ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅ˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€ ์…€๋ ‰ํ„ฐ๊ฐ€ ์ƒ์ˆ˜์ด๊ณ  ์ˆ˜์‹  ๊ฐ์ฒด์˜ ํด๋ž˜์Šค๋ฅผ ์•Œ๊ณ  ์žˆ์„ ๋•Œ ์ด ์˜ค๋ฅ˜๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋Œ€์ ์œผ๋กœ ์‰ฝ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ๋•Œ ์ˆ˜์‹ ์ž๊ฐ€ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์‹ ์ž๊ฐ€ ์ •์ ์œผ๋กœ ํƒ€์ž…์ด ์ง€์ •๋œ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฉ”์‹œ์ง€ ์…€๋ ‰ํ„ฐ๋‚˜ ์ˆ˜์‹ ์ž์˜ ํด๋ž˜์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ, ์ด ํ…Œ์ŠคํŠธ๋ฅผ ๋Ÿฐํƒ€์ž„๊นŒ์ง€ ์—ฐ๊ธฐํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. NSObject ํด๋ž˜์Šค์— ์ •์˜๋œ respondsToSelector: ๋ฉ”์„œ๋“œ๋Š” ์ˆ˜์‹ ์ž๊ฐ€ ๋ฉ”์‹œ์ง€์— ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค:

if ([anObject respondsToSelector:@selector(setOrigin::)])
    [anObject setOrigin:0.0 :0.0];
else
    fprintf(stderr, "%s can't be placed\n",
        [NSStringFromClass([anObject class]) UTF8String]);

respondsToSelector: ๋Ÿฐํƒ€์ž„ ํ…Œ์ŠคํŠธ๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ์ œ์–ดํ•  ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ๋•Œ ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋กœ ํ‘œํ˜„๋˜๋Š” ๊ฐ์ฒด์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ, ์ˆ˜์‹ ์ž๊ฐ€ ๋ฉ”์‹œ์ง€์— ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ : ๊ฐ์ฒด๋Š” ์ง์ ‘ ์‘๋‹ตํ•˜์ง€ ์•Š๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์ „๋‹ฌํ•˜๋„๋ก ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ํ˜ธ์ถœ์ž์˜ ๊ด€์ ์—์„œ ๊ฐ์ฒด๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์ „๋‹ฌํ•˜์—ฌ ๊ฐ„์ ‘์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋”๋ผ๋„ ๋ฉ”์‹œ์ง€๋ฅผ ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๋งˆ๋ฌด๋ฆฌ

์…€๋ ‰ํ„ฐ๋Š” Objective-C์˜ ๋™์  ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„์— ๋ฉ”์„œ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” iOS/macOS ์•ฑ ๊ฐœ๋ฐœ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํƒ€๊ฒŸ-์•ก์…˜ ๋””์ž์ธ ํŒจํ„ด์˜ ๊ธฐ์ดˆ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.