์๋ ํ์ธ์! ์ด๋ฒ์๋ Objective-C์ ์ฐ๊ด ์ฐธ์กฐ(Associative References)์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ํด๋์ค ์ ์ธ์ ์์ ํ์ง ์๊ณ ๋ ๊ฐ์ฒด์ ์ ์ฅ ๊ณต๊ฐ์ ์ถ๊ฐํ ์ ์์ด ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
๐ ์ฐ๊ด ์ฐธ์กฐ๋?
OS X v10.6๋ถํฐ ์ฌ์ฉ ๊ฐ๋ฅํ ์ฐ๊ด ์ฐธ์กฐ๋ ๊ธฐ์กด ํด๋์ค์ ๊ฐ์ฒด ์ธ์คํด์ค ๋ณ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค. ์ฐ๊ด ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋์ค ์ ์ธ์ ์์ ํ์ง ์๊ณ ๋ ๊ฐ์ฒด์ ์ ์ฅ ๊ณต๊ฐ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์ฐ๊ด ์ฐธ์กฐ(Associative References): ๊ธฐ์กด ํด๋์ค์ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ฐํ์์ ๊ฐ์ฒด์ ๋์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ ์ ์๋ ๋ฉ์ปค๋์ฆ์ ๋๋ค.
์ด ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ํนํ ์ ์ฉํฉ๋๋ค:
- ํด๋์ค์ ์์ค ์ฝ๋์ ์ ๊ทผํ ์ ์๋ ๊ฒฝ์ฐ
- ๋ฐ์ด๋๋ฆฌ ํธํ์ฑ ์ด์ ๋ก ๊ฐ์ฒด ๋ ์ด์์์ ๋ณ๊ฒฝํ ์ ์๋ ๊ฒฝ์ฐ
์ฐ๊ด ์ฐธ์กฐ๋ ํค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์ด๋ค ๊ฐ์ฒด์๋ ์๋ก ๋ค๋ฅธ ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ ๋งํผ ๋ง์ ์ฐ๊ด์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๋ํ ์ฐ๊ด ๊ด๊ณ๋ ์์ค ๊ฐ์ฒด์ ์๋ช ๋์ ์ ์ด๋ ์ฐ๊ด๋ ๊ฐ์ฒด๊ฐ ์ ํจํ๊ฒ ์ ์ง๋๋๋ก ํ ์ ์์ต๋๋ค.
๐ ์ฐ๊ด ๊ด๊ณ ์์ฑํ๊ธฐ
Objective-C ๋ฐํ์ ํจ์ objc_setAssociatedObject๋ฅผ ์ฌ์ฉํ์ฌ ํ ๊ฐ์ฒด์ ๋ค๋ฅธ ๊ฐ์ฒด ์ฌ์ด์ ์ฐ๊ด ๊ด๊ณ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด ํจ์๋ ๋ค ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค:
- ์์ค ๊ฐ์ฒด: ์ฐ๊ด ๊ด๊ณ๋ฅผ ์ถ๊ฐํ ๊ฐ์ฒด
- ํค: ์ฐ๊ด ๊ด๊ณ์ ๊ณ ์ ์๋ณ์
- ๊ฐ: ์ฐ๊ด์ํฌ ๊ฐ์ฒด
- ์ฐ๊ด ์ ์ฑ ์์: ์ฐ๊ด ๊ด๊ณ์ ํน์ฑ์ ์ ์
ํค(Key): ์ฐ๊ด ๊ด๊ณ๋ฅผ ์๋ณํ๋ void ํฌ์ธํฐ์ ๋๋ค. ๊ฐ ์ฐ๊ด ๊ด๊ณ์ ํค๋ ๊ณ ์ ํด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ ์ ๋ณ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ฐ๊ด ์ ์ฑ (Association Policy): ์ฐ๊ด๋ ๊ฐ์ฒด๊ฐ ํ ๋น(assign), ์ ์ง(retain) ๋๋ ๋ณต์ฌ(copy)๋๋์ง, ๊ทธ๋ฆฌ๊ณ ์ฐ๊ด ๊ด๊ณ๊ฐ ์์์ (atomic)์ผ๋ก ๋ง๋ค์ด์ง๋์ง ๋น์์์ (non-atomic)์ผ๋ก ๋ง๋ค์ด์ง๋์ง ์ง์ ํฉ๋๋ค. ์ด ํจํด์ ์ ์ธ๋ ํ๋กํผํฐ์ ์์ฑ๊ณผ ์ ์ฌํฉ๋๋ค.
๋ค์ ์์ ๋ ๋ฐฐ์ด๊ณผ ๋ฌธ์์ด ์ฌ์ด์ ์ฐ๊ด ๊ด๊ณ๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค:
static char overviewKey;
NSArray *array =
[[NSArray alloc] initWithObjects:@"One", @"Two", @"Three", nil];
// ์ค๋ช
์ ์ํด initWithFormat:์ ์ฌ์ฉํ์ฌ ๋ฌธ์์ด์ด ํด์ ๋ ์ ์๊ฒ ํจ
NSString *overview =
[[NSString alloc] initWithFormat:@"%@", @"First three numbers"];
objc_setAssociatedObject(
array,
&overviewKey,
overview,
OBJC_ASSOCIATION_RETAIN
);
[overview release];
// (1) overview ์ฌ์ ํ ์ ํจ
[array release];
// (2) overview ์ ํจํ์ง ์์
์ ์ฝ๋์์ ํฌ์ธํธ 1์์๋ OBJC_ASSOCIATION_RETAIN ์ ์ฑ ์ด ๋ฐฐ์ด์ด ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์ ์งํ๋๋ก ์ง์ ํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์์ด overview๋ ์ฌ์ ํ ์ ํจํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ฐฐ์ด์ด ํด์ ๋ ๋(ํฌ์ธํธ 2์์), overview๋ ํด์ ๋์ด ์ด ๊ฒฝ์ฐ์๋ ํ ๋น ํด์ ๋ฉ๋๋ค.
๐ ์ฐ๊ด๋ ๊ฐ์ฒด ๊ฒ์ํ๊ธฐ
Objective-C ๋ฐํ์ ํจ์ objc_getAssociatedObject๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค. ์์ ์์ ๋ฅผ ๊ณ์ํด์, ๋ค์ ์ฝ๋ ์ค์ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์์ overview๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค:
NSString *associatedObject =
(NSString *)objc_getAssociatedObject(array, &overviewKey);
objc_getAssociatedObject: ํค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด์ ์ฐ๊ด๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฒ์ํ๋ ๋ฐํ์ ํจ์์ ๋๋ค.
๐ ์ฐ๊ด ๊ด๊ณ ๋๊ธฐ
์ฐ๊ด ๊ด๊ณ๋ฅผ ๋์ผ๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ผ๋ก nil์ ์ ๋ฌํ์ฌ objc_setAssociatedObject๋ฅผ ํธ์ถํฉ๋๋ค:
objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN);
์ฐ๊ด๋ ๊ฐ์ฒด๊ฐ nil๋ก ์ค์ ๋๋ฏ๋ก ์ ์ฑ ์ ์ค์ ๋ก ์ค์ํ์ง ์์ต๋๋ค.
๊ฐ์ฒด์ ๋ชจ๋ ์ฐ๊ด ๊ด๊ณ๋ฅผ ๋์ผ๋ ค๋ฉด objc_removeAssociatedObjects๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์ด ํจ์๋ ๋ชจ๋ ํด๋ผ์ด์ธํธ์ ๋ชจ๋ ์ฐ๊ด ๊ด๊ณ๋ฅผ ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ฐ์ฒด๋ฅผ "์์ ์ํ"๋ก ๋ณต์ํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ง ์ด ํจ์๋ฅผ ์ฌ์ฉํ์ธ์.
objc_removeAssociatedObjects: ๊ฐ์ฒด์ ๊ด๋ จ๋ ๋ชจ๋ ์ฐ๊ด ๊ด๊ณ๋ฅผ ์ ๊ฑฐํ๋ ๋ฐํ์ ํจ์์ ๋๋ค.
๐ ์ ์ฒด ์์
๋ค์ ํ๋ก๊ทธ๋จ์ ์์ ์น์ ์ ์ฝ๋๋ฅผ ๊ฒฐํฉํ ์ ์ฒด ์์ ์ ๋๋ค:
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
int main (int argc, const char * argv[]) {
@autoreleasepool {
static char overviewKey;
NSArray *array = [[NSArray alloc]
initWithObjects:@"One", @"Two", @"Three", nil];
// ์ค๋ช
์ ์ํด initWithFormat:์ ์ฌ์ฉํ์ฌ ํด์ ๊ฐ๋ฅํ ๋ฌธ์์ด์ ์ป์
NSString *overview = [[NSString alloc]
initWithFormat:@"%@", @"First three numbers"];
// ์ฐ๊ด ๊ด๊ณ ์์ฑ
objc_setAssociatedObject(
array,
&overviewKey,
overview,
OBJC_ASSOCIATION_RETAIN
);
[overview release];
// ์ฐ๊ด๋ ๊ฐ์ฒด ๊ฒ์
NSString *associatedObject =
(NSString *)objc_getAssociatedObject(array, &overviewKey);
NSLog(@"associatedObject: %@", associatedObject);
// ์ฐ๊ด ๊ด๊ณ ๋๊ธฐ
objc_setAssociatedObject(
array,
&overviewKey,
nil,
OBJC_ASSOCIATION_ASSIGN
);
[array release];
}
return 0;
}
์ฐ๊ด ์ฐธ์กฐ์ ์ค์ ์ฌ์ฉ ์ฌ๋ก
์ฐ๊ด ์ฐธ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ํนํ ์ ์ฉํฉ๋๋ค:
- ์นดํ ๊ณ ๋ฆฌ์ ํ๋กํผํฐ ์ถ๊ฐ: Objective-C์ ์นดํ ๊ณ ๋ฆฌ๋ ๊ธฐ์กด ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์์ง๋ง, ์ธ์คํด์ค ๋ณ์๋ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ฐ๊ด ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์นดํ ๊ณ ๋ฆฌ๋ฅผ ํตํด ํ๋กํผํฐ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
- ์๋ํํฐ ํด๋์ค ํ์ฅ: ์์ค ์ฝ๋์ ์ ๊ทผํ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ ์์ํฌ์ ํด๋์ค์ ์ถ๊ฐ ๊ธฐ๋ฅ์ด ํ์ํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ฐํ์ ๋ฐ์ดํฐ ์บ์ฑ: ๊ฐ์ฒด์ ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ์์๋ก ์ ์ฅํด์ผ ํ ๋ ์ ์ฉํฉ๋๋ค.
- ๋ธ๋ฆฌ๊ฒ์ดํธ ์ฐธ์กฐ ๊ด๋ฆฌ: ๋ธ๋ฆฌ๊ฒ์ดํธ ํจํด์ ๊ตฌํํ ๋ ์ฝํ ์ฐธ์กฐ(weak reference)๋ก ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค.
์ฃผ์์ฌํญ
์ฐ๊ด ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ ๋ ๋ช ๊ฐ์ง ์ฃผ์ํด์ผ ํ ์ ์ด ์์ต๋๋ค:
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ: ์ ์ ํ ์ฐ๊ด ์ ์ฑ ์ ์ ํํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๋ ๋๊ธ๋ง ํฌ์ธํฐ๋ฅผ ๋ฐฉ์งํด์ผ ํฉ๋๋ค.
- ํค ์ถฉ๋ ๋ฐฉ์ง: ๊ณ ์ ํ ํค๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ฝ๋์์ ์ถฉ๋์ ๋ฐฉ์งํด์ผ ํฉ๋๋ค.
- ์ฑ๋ฅ ๊ณ ๋ ค: ์ฐ๊ด ์ฐธ์กฐ๋ ์ผ๋ฐ ์ธ์คํด์ค ๋ณ์๋ณด๋ค ์ฝ๊ฐ ๋๋ฆด ์ ์์ผ๋ฏ๋ก ์ฑ๋ฅ์ด ์ค์ํ ์ฝ๋์์๋ ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- ๋๋ฒ๊น ์ด๋ ค์: ์ฐ๊ด ์ฐธ์กฐ๋ ์ฝ๋์์ ๋ช ์์ ์ผ๋ก ๋ณด์ด์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ฒ๊น ์ด ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
๋ง๋ฌด๋ฆฌ
Objective-C์ ์ฐ๊ด ์ฐธ์กฐ๋ ํด๋์ค ์ ์๋ฅผ ์์ ํ์ง ์๊ณ ๋ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ด๋ ํนํ ์๋ํํฐ ์ฝ๋๋ฅผ ํ์ฅํ๊ฑฐ๋ ์นดํ ๊ณ ๋ฆฌ์ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ ๋ ์ ์ฉํฉ๋๋ค.
'๐ฅ Bread Basics > Obj-c' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ค๋ ๋ฉ๊ณผ ๋๊ธฐํ (0) | 2025.04.14 |
---|---|
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์์ธ ์ฒ๋ฆฌ (1) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ ๋ ํฐ(Selector) (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ ์ ๋์ ์ดํดํ๊ธฐ (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ๋น ๋ฅธ ์ด๊ฑฐ(Fast Enumeration) (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 |