์๋ ํ์ธ์. ์ค๋์ Objective-C์ Categories์ Extensions์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ์ด ๊ธฐ๋ฅ๋ค์ ๊ธฐ์กด ํด๋์ค์ ๊ธฐ๋ฅ์ ํ์ฅํ๋ ์ ์ฉํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
๐ Categories์ Extensions ๊ฐ์
Category๋ ๊ธฐ์กด ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ฌ์ง์ด ์์ค ์ฝ๋๊ฐ ์๋ ํด๋์ค์๋ ์ ์ฉ ๊ฐ๋ฅํฉ๋๋ค! Categories๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ธํด๋์ฑ ์์ด๋ ๊ธฐ์กด ํด๋์ค์ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์์ผ๋ฉฐ, ์์ ์ ํด๋์ค ๊ตฌํ์ ์ฌ๋ฌ ํ์ผ์ ๋ถ์ฐ์ํฌ ์๋ ์์ต๋๋ค.
Class Extensions(ํ์ฅ)์ Categories์ ์ ์ฌํ์ง๋ง, ์ฃผ ํด๋์ค์ @interface ๋ธ๋ก ์ธ๋ถ์์ ํด๋์ค์ ํ์ํ ์ถ๊ฐ API๋ฅผ ์ ์ธํ ์ ์๊ฒ ํด์ค๋๋ค.
Category: ๊ธฐ์กด ํด๋์ค์ ์๋ก์ด ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ Objective-C์ ๊ธฐ๋ฅ์ ๋๋ค.
Extension: ์ต๋ช ์นดํ ๊ณ ๋ฆฌ์ ์ ์ฌํ์ง๋ง, ์ ์ธ๋ ๋ฉ์๋๋ ๋ฐ๋์ ํด๋น ํด๋์ค์ ๋ฉ์ธ ๊ตฌํ๋ถ์์ ๊ตฌํ๋์ด์ผ ํฉ๋๋ค.
๐ ํด๋์ค์ ๋ฉ์๋ ์ถ๊ฐํ๊ธฐ
์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด ํด๋์ค์ ์๋ก์ด ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์นดํ ๊ณ ๋ฆฌ ์ด๋ฆ ์๋์ ์ธํฐํ์ด์ค ํ์ผ์ ๋ฉ์๋๋ฅผ ์ ์ธํ๊ณ , ๋์ผํ ์ด๋ฆ์ ๊ตฌํ ํ์ผ์์ ์ ์ํ๋ฉด ๋ฉ๋๋ค.
#import "ClassName.h"
@interface ClassName (CategoryName)
// ๋ฉ์๋ ์ ์ธ
@end
์นดํ ๊ณ ๋ฆฌ ์ด๋ฆ์ ์ด ๋ฉ์๋๋ค์ด ๋ค๋ฅธ ๊ณณ์์ ์ ์ธ๋ ํด๋์ค์ ๋ํ ์ถ๊ฐ์์ ๋ํ๋ ๋๋ค. ๊ทธ๋ฌ๋ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ฌ์ฉํด ํด๋์ค์ ์ธ์คํด์ค ๋ณ์๋ฅผ ์ถ๊ฐํ ์๋ ์์ต๋๋ค.
์ค์: ์นดํ ๊ณ ๋ฆฌ๋ ๋ฉ์๋๋ง ์ถ๊ฐํ ์ ์์ผ๋ฉฐ, ์ธ์คํด์ค ๋ณ์๋ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์นดํ ๊ณ ๋ฆฌ์ ๋์ ๋ฐฉ์
์นดํ ๊ณ ๋ฆฌ๊ฐ ์ถ๊ฐํ๋ ๋ฉ์๋๋ ํด๋์ค ํ์ ์ ์ผ๋ถ๊ฐ ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์นดํ ๊ณ ๋ฆฌ์์ NSArray ํด๋์ค์ ์ถ๊ฐ๋ ๋ฉ์๋๋ ์ปดํ์ผ๋ฌ๊ฐ NSArray ์ธ์คํด์ค๊ฐ ๊ฐ์ง๊ณ ์์ ๊ฒ์ผ๋ก ์์ํ๋ ๋ฉ์๋ ๋ชฉ๋ก์ ํฌํจ๋ฉ๋๋ค.
์นดํ ๊ณ ๋ฆฌ ๋ฉ์๋๋ ์๋ ํด๋์ค์ ์ ์๋ ๋ฉ์๋์ ๋์ผํ๊ฒ ๋์ํฉ๋๋ค. ๋ฐํ์์๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ์นดํ ๊ณ ๋ฆฌ๊ฐ ํด๋์ค์ ์ถ๊ฐํ๋ ๋ฉ์๋๋ ๋ค๋ฅธ ๋ฉ์๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ํด๋น ํด๋์ค์ ๋ชจ๋ ์๋ธํด๋์ค์ ์์๋ฉ๋๋ค.
// NSString+Utils.h
@interface NSString (Utils)
- (BOOL)isEmpty;
@end
// NSString+Utils.m
@implementation NSString (Utils)
- (BOOL)isEmpty {
return self.length == 0;
}
@end
์ ์์ ์์๋ NSString ํด๋์ค์ isEmpty๋ผ๋ ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๋ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ง๋ค์์ต๋๋ค.
์นดํ ๊ณ ๋ฆฌ์ ์ธ์คํด์ค ๋ณ์ ๋ฒ์
์นดํ ๊ณ ๋ฆฌ๋ ํด๋์ค์ ์ถ๊ฐ ์ธ์คํด์ค ๋ณ์๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํด๋์ค ๋ฒ์ ๋ด์ ๋ชจ๋ ์ธ์คํด์ค ๋ณ์๋ ์นดํ ๊ณ ๋ฆฌ์ ๋ฒ์ ๋ด์๋ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ @private์ผ๋ก ์ ์ธ๋ ๋ณ์๋ฅผ ํฌํจํ์ฌ ํด๋์ค๊ฐ ์ ์ธํ ๋ชจ๋ ์ธ์คํด์ค ๋ณ์๊ฐ ํฌํจ๋ฉ๋๋ค.
ํด๋์ค์ ์ถ๊ฐํ ์ ์๋ ์นดํ ๊ณ ๋ฆฌ ์์๋ ์ ํ์ด ์์ง๋ง, ๊ฐ ์นดํ ๊ณ ๋ฆฌ ์ด๋ฆ์ ๋ฌ๋ผ์ผ ํ๋ฉฐ, ๊ฐ๊ฐ ๋ค๋ฅธ ๋ฉ์๋ ์ธํธ๋ฅผ ์ ์ธํ๊ณ ์ ์ํด์ผ ํฉ๋๋ค.
๐ Extensions(ํ์ฅ)
Class Extensions๋ ์ต๋ช ์นดํ ๊ณ ๋ฆฌ์ ์ ์ฌํ์ง๋ง, ์ ์ธ๋ ๋ฉ์๋๋ ๋ฐ๋์ ํด๋น ํด๋์ค์ ๋ฉ์ธ @implementation ๋ธ๋ก์์ ๊ตฌํ๋์ด์ผ ํฉ๋๋ค. Clang/LLVM 2.0 ์ปดํ์ผ๋ฌ ์ด์์ ์ฌ์ฉํ๋ฉด ํด๋์ค ํ์ฅ์์ ํ๋กํผํฐ์ ์ธ์คํด์ค ๋ณ์๋ ์ ์ธํ ์ ์์ต๋๋ค.
@interface MyClass : NSObject
@property (retain, readonly) float value;
@end
// ๋น๊ณต๊ฐ ํ์ฅ, ์ผ๋ฐ์ ์ผ๋ก ๋ฉ์ธ ๊ตฌํ ํ์ผ์ ์จ๊ฒจ์ ธ ์์ต๋๋ค.
@interface MyClass ()
@property (retain, readwrite) float value;
@end
ํด๋์ค ํ์ฅ์ ํน์ง: ์นดํ ๊ณ ๋ฆฌ์ ๋ฌ๋ฆฌ ๋ ๋ฒ์งธ @interface ๋ธ๋ก์ ๊ดํธ ์์ ์ด๋ฆ์ด ์ง์ ๋์ง ์์ต๋๋ค.
ํ์ฅ์ ์ผ๋ฐ์ ์ธ ์ฉ๋
ํด๋์ค ํ์ฅ์ ์ผ๋ฐ์ ์ธ ์ฉ๋๋ ๊ณต๊ฐ์ ์ผ๋ก ์ฝ๊ธฐ ์ ์ฉ(readonly)์ผ๋ก ์ ์ธ๋ ํ๋กํผํฐ๋ฅผ ๋น๊ณต๊ฐ์ ์ผ๋ก ์ฝ๊ธฐ-์ฐ๊ธฐ(readwrite)๋ก ์ฌ์ ์ธํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํด๋์ค ์ธ๋ถ์์๋ ๊ฐ์ ์ฝ์ ์๋ง ์์ง๋ง, ํด๋์ค ๋ด๋ถ์์๋ ๊ฐ์ ๋ณ๊ฒฝํ ์๋ ์์ต๋๋ค.
๋ํ ํด๋์ค๊ฐ ๊ณต๊ฐ์ ์ผ๋ก ์ ์ธ๋ API๋ฅผ ๊ฐ์ง๊ณ , ์ถ๊ฐ์ ์ผ๋ก ํด๋์ค๋ ํด๋์ค๊ฐ ์ํ ํ๋ ์์ํฌ ๋ด์์๋ง ์ฌ์ฉํ๊ธฐ ์ํ ๋ฉ์๋๋ฅผ ๋น๊ณต๊ฐ์ ์ผ๋ก ์ ์ธํ๋ ๊ฒ๋ ์ผ๋ฐ์ ์ ๋๋ค.
@interface MyClass : NSObject
- (float)value;
@end
@interface MyClass () {
float value;
}
- (void)setValue:(float)newValue;
@end
@implementation MyClass
- (float)value {
return value;
}
- (void)setValue:(float)newValue {
value = newValue;
}
@end
์ด ์์ ์์ setValue: ๋ฉ์๋์ ๊ตฌํ์ ํด๋์ค์ ๋ฉ์ธ @implementation ๋ธ๋ก ๋ด์ ๋ํ๋์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ปดํ์ผ๋ฌ๋ setValue: ๋ฉ์๋์ ์ ์๋ฅผ ์ฐพ์ ์ ์๋ค๋ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์์ํต๋๋ค.
๐ ์นดํ ๊ณ ๋ฆฌ์ ํ์ฅ์ ์ค์ฉ์ ์ฌ์ฉ ์
์นดํ ๊ณ ๋ฆฌ ์ฌ์ฉ ์
- ๊ธฐ๋ฅ ๊ทธ๋ฃนํ: ํฐ ํด๋์ค์ ๊ด๋ จ ๋ฉ์๋๋ฅผ ๋
ผ๋ฆฌ์ ๊ทธ๋ฃน์ผ๋ก ๋ถํ
@interface UIView (Animation) // ์ ๋๋ฉ์ด์ ๊ด๋ จ ๋ฉ์๋ @end @interface UIView (Layout) // ๋ ์ด์์ ๊ด๋ จ ๋ฉ์๋ @end
- ์ธ๋ถ ํ๋ ์์ํฌ ํ์ฅ: ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ๋ ์์ํฌ์ ํด๋์ค์ ์ ํธ๋ฆฌํฐ ๋ฉ์๋ ์ถ๊ฐ
@interface NSString (URLEncoding) - (NSString *)urlEncodedString; @end
- ํ๋กํ ์ฝ ๊ตฌํ ๋ถ๋ฆฌ: ํ๋กํ ์ฝ ๊ตฌํ์ ๋ณ๋์ ํ์ผ๋ก ๋ถ๋ฆฌ
@interface MyViewController (UITableViewDataSource) <UITableViewDataSource> // UITableViewDataSource ํ๋กํ ์ฝ ๋ฉ์๋ @end
ํ์ฅ ์ฌ์ฉ ์
- ๋น๊ณต๊ฐ ๋ฉ์๋ ์ ์: ํด๋์ค์ ๋ด๋ถ ๊ตฌํ์์๋ง ์ฌ์ฉ๋๋ ๋ฉ์๋ ์ ์ธ
@interface MyClass () - (void)privateHelperMethod; @end
- ์ฝ๊ธฐ ์ ์ฉ ํ๋กํผํฐ์ ๋น๊ณต๊ฐ ์์ :
// ๊ณต๊ฐ ์ธํฐํ์ด์ค @interface Account : NSObject @property (nonatomic, readonly) double balance; @end // ๋น๊ณต๊ฐ ํ์ฅ @interface Account () @property (nonatomic, readwrite) double balance; @end
๋ง๋ฌด๋ฆฌ
Categories์ Extensions๋ ๊ธฐ์กด ํด๋์ค๋ฅผ ํ์ฅํ๊ณ ์ฝ๋๋ฅผ ๋ ๋ชจ๋ํํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ธํด๋์ฑ ์์ด๋ ๊ธฐ์กด ํด๋์ค์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ, ํ์ฅ์ ํด๋์ค์ ๋ด๋ถ ๊ตฌํ์ ๋ ๊น๋ํ๊ฒ ์ ๋ฆฌํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
'๐ฅ 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 ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ฐ๊ด ์ฐธ์กฐ(Associative References) (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ์ ์ธ๋ ํ๋กํผํฐ(Declared Properties) (0) | 2025.04.14 |
Obj-C ๊ณต์ ๋ฌธ์ ์ ๋ฆฌ - ํ๋กํ ์ฝ (0) | 2025.04.14 |