์๋ ํ์ธ์. ์ด๋ฒ์๋ Objective-C์ ์ ๋ ํฐ(Selector)์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
๐ ์ ๋ ํฐ๋ ๋ฌด์์ธ๊ฐ?
Objective-C์์ ์ ๋ ํฐ๋ ๋ ๊ฐ์ง ์๋ฏธ๋ฅผ ๊ฐ์ง๋๋ค:
- ์์ค ์ฝ๋์์ ๊ฐ์ฒด์ ๋ฉ์์ง๋ฅผ ๋ณด๋ผ ๋ ์ฌ์ฉ๋๋ ๋ฉ์๋ ์ด๋ฆ
- ์์ค ์ฝ๋๊ฐ ์ปดํ์ผ๋ ๋ ์ด๋ฆ์ ๋์ฒดํ๋ ๊ณ ์ ์๋ณ์ (ํ์ : 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 ์ฑ ๊ฐ๋ฐ์์ ์ฌ์ฉ๋๋ ํ๊ฒ-์ก์ ๋์์ธ ํจํด์ ๊ธฐ์ด๊ฐ ๋ฉ๋๋ค.
'๐ฅ Bread Basics > Obj-c' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ค๋ ๋ฉ๊ณผ ๋๊ธฐํ (0) | 2025.04.14 |
---|---|
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์์ธ ์ฒ๋ฆฌ (1) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ ์ ๋์ ์ดํดํ๊ธฐ (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ๋น ๋ฅธ ์ด๊ฑฐ(Fast Enumeration) (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ฐ๊ด ์ฐธ์กฐ(Associative References) (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - Categories์ Extensions (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ ์ธ๋ ํ๋กํผํฐ(Declared Properties) (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ํ๋กํ ์ฝ (0) | 2025.04.14 |