본문 바로가기

개발/App Developer

Foundation Kit

Foundation Kit은 Cocoa framework의 일부분으로서 Java의 Standard API와 같은 역할을 한다.
즉, Foundation Kit에서 제공되는 class와 method 등을 이용하면 프로그램을 보다 쉽고 편하게 작성할 수 있다.

Tip : Xcode에서 작업 중인 코드의 class나 method 등을 "opt + double click" 하면 

       해당 class 또는 method에 대한 documentation을 볼 수 있다.



@ Some Useful Types 


    - NSRange


        NSRange 다음과 같이 정의된 구조체이다.


        typedef struct _NSRange {

            unsigned int location;

            unsigned int length;

        } NSRange;


        다음과 같이 초기화할 있다.


        NSRange range;

        range.location = 17;

        range.length = 4;


        또는


        NSRange range = {17, 4};


        또는


        NSRange range = NSMakeRange (17, 4);



    - Geometric Types


        typedef struct _NSPoint {

            float x;

            float y;

        } NSPoint;


        typedef struct _NSSize {

            float width;

            float height;

        } NSSize;


        typedef struct _NSRect {

            NSPoint origin;

            NSSize size;

        } NSRect;


        위의 타입들은 NSMakePoint(), NSMakeSize(), NSMakeRect() 함수로 초기화 있다.




@ Class Methods


    다음과 같이 '-' 아닌 '+' 정의되는 method class method로서 객체 생성 없이도 호출할 있는 메소드를 의미한다.

    Java static method 같다.

            

        + (id) stringWithFormat: (NSString*) format, ...;


    class method 다음과 같이 호출할 있다.


        NSString* str = [NSString stringWithFormat:@"I'm %d years old", 22];




@ NSString


    + (id) stringWithFormat: (NSString*) format, ...;


    - (unsigned int) length;

    

    - (BOOL) hasPrefix: (NSString*) string;

    - (BOOL) hasSuffix: (NSString*) string;

    - (NSRange) rangeOfString: (NSString*) string;


    - (NSArray) componentSeperateByString: (NSString*) string;


    - (BOOL) isEqualToString: (NSString*) string;

    - (NSComparisonResult) compare: (NSString*) string;

    - (NSComparisonResult) compare: (NSString*) string

                           options: (unsigned) mask;



    NSComparisonResult 다음과 같이 정의된 enum이다.


        typedef enum _NSComparisonResult {

            NSOrderedAscending = -1, NSOrderedSame, NSOrderedDescending

        } NSComparisonResult; 


    mask 옵션은 다음과 같은 세가지가 있고 '|' 옵션을 동시에 사용할 있다.

    

        NSCaseInsensitiveSearch : 대소문자 무시

        NSLiteralSearch : 대소문자 구분을 포함하여 완전히 일치하는지

        NSNumericSearch : 숫자를 character value 아닌 숫자 자체로 인식 */


    compare 메소드의 사용 예는 다음과 같다.


        if([string1 compare: string2

                    options: NSCaseInsensitiveSearch | NSNumericSearch]

           == NSOrderedSame)

        {

            NSLog(@"They match!");

        }

        

            

@ NSMutableString


    NSMutableString NSString subclass NSString 달리 변형가능한 string이다.

    , NSString Java String이라면 NSMutableString BufferedString이다.


    + (id) stringWithCapacity: (unsigned) capacity;

    - (void) appendString: (NSString*) string;

    - (void) appendFormat: (NSString*) format, ...;

    - (void) deleteCharactersInRange: (NSRange) range;



    NSMutableString 생성은 다음과 같이 한다


        NSMutableString* string = [NSMutableString stringWithCapacity: 50];


    capacity string 예상되는 최대 길이로 최적화를 위해 사용되는 것이지 최대 길이를 제한하는 것은 아니다.

    




@ NSArray


    NSArray object만을 담을 있고 다음과 같이 생성한다.


        NSArray* array = [NSArray arrayWithObjects: @"one", @"two" @"three", nil];



    + (id)arrayWithObjects:(id) object1, ...;

    - (unsigned) count;

    - (id) objectAtIndex: (unsigned int) index;


    - (NSString*) componentJoinedByString: (NSString*) string;



    NSString 클래스의 componentSeperateByString 메소드와 

    NSArray 클래스의 componentJoinedByString 메소드는 다음과 같이 사용한다.


        NSString* str1 = @"Mon:Tue:Wed:Thu:Fri:Sat:Sun";

        NSArray* days = [str1 componentsSeparatedByString:@":"];

        NSString* str2 = [days componentsJoinedByString:@"#"];


    결과 days {Mon, Tue, Wed, Thu, Fri, Sat, Sun} 되고

           str2 Mon#Tue#Wed#Thu#Fri#Sat#Sun 된다.



@ NSMutableArray


    NSArray 일단 생성되면 원소를 추가하거나 제거할 없다.

    반면 NSMutableArray 원소를 자유롭게 추가하거나 제거할 있다.

    NSArray Java 기본 array라면 NSMutableArray ArrayList 또는 Vector 유사하다고 있다.


    + (id) arrayWithCapacity: (unsigned) numItems;

    - (void) addObject: (id) object;

    - (void) removeObjectAtIndex: (unsigned) index;





@ NSEnumerator


    NSEnumerator 클래스는 array 원소에 차례로 접근하기 위하여 사용된다.

    array객체의 enumerator 생성한 nextObject 메소드를 통해 array 원소를 차례로 하나씩 접근할 있다.

    다음은 NSEnumerator 사용하는 예제 프로그램이다.


        #import <Foundation/Foundation.h>


        int main(void)

        {

            NSMutableArray* array = [NSMutableArray arrayWithCapacity:10];

            NSString* s1 = @"Hello";

            NSString* s2 = @"My";

            NSString* s3 = @"Name is Jaehee";

            

            [array addObject:s1];

            [array addObject:s2];

            [array addObject:s3];

            

            NSEnumerator* enumerator = [array objectEnumerator];

            

            id thingie;

            while(thingie = [enumerator nextObject]) {

                NSLog(@"%@", thingie);

            }

            

            return 0;

        }


   

    Mac OS X 10.5(Leopard) 이후 버전부터는 별도의 NSEnumerator 객체의 생성 없이

    다음과 같이 보다 간편한 enumeration 가능하다.


        for(NSString* element in array) {

            NSLog(@"%@", element);

        }

   




@ NSDictionary

   

    + (id) dictionaryWithObjectsAndKeys: (id) firstObject, ...;

    - (id) objectForKey: (id) key;


    NSDictionary 클래스는 일종의 HashTable이다.

    , table 어떤 object들과 각각에 해당하는 key들을 저장해놓으면 이제 key 통하여 

    table에서 해당 object 꺼내올 있고, 사용법은 아래와 같다.

   

        Student* s1 = [Student new];

        Student* s2 = [Student new];

        Student* s3 = [Student new];


        NSDictionary* students = [NSDictionary dictionaryWithObjectsAndKeys:

                                 s1, @"101", s2, @"102", s3, @"103", nil];


        Student* s = [students objectForKey: @"102"];


      

@ NSMutableDictionary


    NSMutableDictionary 클래스는 크기가 변할 있는 NSDictionary이다.


    + (id) dictionaryWithCapacity: (unsigned int) numItems;

    - (void) setObject: (id) object forKey: (id) key;

    - (void) removeObjectForKey: (id) key;





@ NSNumber


    NSArray, NSMutableArray NSDictionary, NSMutableDictionary 오직 object만을 담을 있다.

    int, float등과 같은 primitive type 값은 저장할 없다.

    NSNumber 클래스는 이와 같은 primitive type 값을 object wrapping하여 

    NSArray NSDictionary 등에 담을 있게 해준다.

    또한 NSNumber 값을 다시 primitive type으로 변경할 있도록 해준다.


    + (NSNumber*) numberWithChar: (char) value;

    + (NSNumber*) numberWithInt: (int) value;

    + (NSNumber*) numberWithFloat: (float) value;

    + (NSNumber*) numberWithBool: (BOOL) value;


    - (char) charValue;

    - (int) intValue;

    - (float) floatValue;

    - (BOOL) boolValue;

    - (NSString*) stringValue;



@ NSValue


    NSValue 구조체 등과 같은 임의의 값들을 object wrapping하고 

         그 object로부터 다시 원래 값을 꺼내올 있도록 해준다.

    NSNumber NSValue subclass이다.


    + (NSValue*) valueWithBytes: (const void*) value

                 objCType: (const char*) type;

    - (void) getValue: (void*) value;


    + (NSValue*) valueWithPoint: (NSPoint) point;

    + (NSValue*) valueWithSize: (NSSize) size;

    + (NSValue*) valueWithRect: (NSRect) rect;


    - (NSPoint) pointValue;

    - (NSSize) sizeValue;

    - (NSRect) rectValue;



@ NSNull


    NSArray NSDictionary에서는 nil 끝을 나타내기 때문에 원소로서 nil 가질 없다.

    그러나 경우에 따라 해당 원소에 '아무것도 없음' 나타내기 위하여 nil 집어넣고 싶을 때가 있다.

    이를 위하여 NSNull 클래스가 존재한다.


    + (NSNull*) null;



Reference

[1] Dalrymple. M., Learn Objective-C on the Mac, Apress.