본문 바로가기
프로그래밍 놀이터/iOS

Objective-C 고급 ( Advanced Objective-C )

by 돼지왕 왕돼지 2015. 6. 18.
반응형
Objective-C 고급 ( Advanced Objective-C )

출처 : http://www.tutorialspoint.com/objective_c/objective_c_classes_objects.htm


<< Classes/Objects >>

-
class 는 @interface 와 @implementation 의 두 파트로 나뉘어 정의된다.


-
대부분이 objects 를 상속한다.


-
objects 는 메세지를 받기 때문에 receiver 로 불리기도 한다.


-
Properties 는 다른 class 에서의 access 를 접근하도록 도와준다.



-
ex)

@interface Box:NSObject
{
double length;
double breadth;
}
@property(nonatomic, readwrite) double height;
@end


-
Objective-C object 를 allocate 하고 initializing 하는 것은 다음과 같이 한다.

Box box1 = [[Box alloc]init];


-
data member 접근은 . 을 이용해 바로 접근한다.


@interface Box:NSObject
{
double length;
double breadth;
double height;
}
@property(nonatomic, readwrite) double height;
-(double) volume;
@end

@implementation Box
@synthesize height;
-(id) init
{
self = [super init];
length = 1.0;
breath = 1.0;
return self;
}

-(double) volume
{
return length*breadth*height;
}
@end


int main()
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
Box *box1 = [[Box alloc]init];
double volume = 0.0;
box1.height = 5.0;
volume = [box1 volume];
[pool drain];
return 0;
}


-
Properties

property 는 class 의 변수를 다른 class 에서 접근할 수 있다는 것을 명시한다.
(properties 로 명시한다는것은 내부적으로 getter, setter 가 생긴다는 것을 의미한다.)
@property 라는 키워드로 명시하며, access specifier 가 따라온다.
그 다음은 data type 과 property name 을 명시해준다.

access specifier 는 nonatomic or atomic, readwrite or readonly,. strong or unsafe_unretained or weak 중 필요한 것을 명시한다.
pointer type 에는 string, unsafe_unretained, 또는 weak 을 명시한다.

implementation 구분에서는 synthesize 를 이용해서 이를 명시해준다.
( 최신 XCode 에서는 synthesize 가 필요 없다고 한다.. )




<< Inheritance >>

-
Base class 하나만 상속 가능하기에, multilevel inheritance 를 사용해야 한다.
모든 class 는 NSObject 를 상속한다.

@interface derived-class : base-class


-
subclass 는 super class 의 interface에 정의된 모든 private member 에 접근 가능하다. ( extension 으로 뭔가 처리하지 않는 한 )







<< Polymorphism >>


-
기본 Java 와 동일하다.




<< Data Encapsulation >>

-
interface 안에 정의되는 변수들은 private access.
interface 안에 정의되는 함수들은 public access 이다.
private method 는 interface 에 정의하지 않고, implementation 에만 정의하면 된다.




<< Categories >>

-
기존에 존재하는 class 에 어떤 method 를 추가하고 싶다면 category 를 이용하면 된다.
category 는 @interface 키워드를 통해 정의할 수 있다.

@interface ClassName ( CategoryName )

@end


-
Category 는 original impl code 가 없어도, 어떤 class 를 위해서든 정의될 수 있다.
category 에 정의한 함수들은 original class 의 모든 instance 에서 접근 가능하다. sub class 도 물론이다.
Runtime 에는 category 에 의해 추가된 함수와 원래 있는 함수와 사용상의 차이가 없다.
사용할 때는 category 의 header file 을 import 해주어야 한다.


-
ex)
@interface NSString(MyAdditions)
+(NSString *)getCopyRightString;
@end

@implmenetation NSString(MyAdditions)
+(NSString *)getCopyRightString{
return @"Copyright";
}
@end

int main(int argc, const char* argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *copyrightString = [NSString getCopyRightString];
NSLog(@"Accessing Category: %@", copyrightString);
[pool drain];
return 0;
}




<< Posing >>

-
OSX 10.5 부터 deprecated 되었다.


-
Object 에 있는 poseAsClass: 메소드를 이용하여 어떤 class 의 역할 자체를 user define 한 것으로 바꾸는 녀석이다.




<< Extensions >>

-
category 와 다르게 extension 은 compile 타임에 source 를 가지고 있는 경우에만 사용할 수 있다.
Extension 은 category name 이 없는 category 라고 볼 수 있다.
그래서 anonymous category ( 익명 카테고리 ) 라고도 불린다.



-
다음의 syntax 를 가진다.

@interface ClassName()

@end



-
extension 으로는 private variable 과 private method 를 추가할 수 있다.
extension 안에 정의한 method 와 variable 은 상속받은 class 들이 접근할 수 없다.




<< Protocols >>

-
protocol 의 syntax 는 아래와 같다.

@protocol ProtocolName
@required
// list of required methods
@optional
// list of optional methods
@end


-
Java 의 interface 와 같은 개념으로 아래와 같이 사용한다. 여러 개의 protocol 을 받아 들이려면 , 로 separation 한다.

@interface MyClass :NSObject <MyProtocol>
...
@end









<< Dynamic Binding >>

-
dynamic binding 은 compile time 이 아닌 runtime 에 호출할 method 를 결정하는 것을 말한다.
late binding 이라고도 한다.


-
Objective-C 에서는 모든 method 가 runtime 에 dynamical 하게 정해진다.
코드 실행은 method name 과 receiving object 에 의해 결정된다.
dynamic binding 은 polymorphism 을 가능하게 한다.


-
ex)

@interface Square:NSObject
{
float area;
}
- (void) printArea;
@end

@implementation Square
- (void) printArea
{
NSLog(@"square %d", area);
}
@end

@interface Rectangle:NSObject
{
float area;
}
- (void) printArea;
@end

@implementation Rectangle
- (void) printArea
{
NSLog(@"rectangle %d", area);
}
@end

int main()
{
Square *square = [[Square alloc]init];
Rectangle *rectangle = [[Rectangle alloc]init];
NSArray *shapes = [[NSArray alloc]initWithObjects: square, rectangle, nil];
id object1 = [shapes objectAtIndex:0];
[object1 printArea];
id object2 = [shapes objectAtIndex:1];
[objectt2 printArea];
return 0;
}



<< Composite Objects >>

-
Class Cluster 는 여러개의 비슷한 성질의 것들을 한 class 에 넣어 관리하는 것을 얘기한다.
예를 들어 NSNumber 는 char, int, bool 등의 클래스들의 cluster 를 가지고 있다고 말할 수 있다.


-
기본적인 composite 개념은 같으나, 여기서는 참조를 갖는게 아닌 상속을 받는 것을 이야기한다.

ex)
@interface ValidatingArray:NSMutableArray
{
NSMutableArray *embeddedArray;
}
+ validatingArray;
- init;
- (unsigned)count;
...
@end

@implementation ValidatingArray
-init
{
self = [super init]
if (self){
embeddedArray = [[NSMuttableArray allocWithZone:[self zone]] init];
}
return self;
}

+validatingArray
{
return [[self alloc]init];
}

- (unsigned) count
{
return [embeddedArray count];
}
@end

...



<< Foundation Framework >>

-
NS 는 NeXTStep 에서 왔기에..


-
NSObject 는 memory 관리도 하고 기본 interface 역할도 하며, Object 자체의 역할도 한다.


-
Data Storage

* NSArray & NSMutableArray

* NSDictionary & NSMutableDictionary

* NSSet & NSMutableSet



-
Text and strings

* NSCharacterSet



-
Dates and Times

* NSDate & NSDateFormatter


-
Exception Handling

* @try
* @catch
* @finally


-
URL loading System

* NSMutableURLRequest
* NSURLConnection
* NSURLCache
* NSURLAuthenticationChallenge
* NSURLCredential
* NSURLProtectionSpace
* NSURLResponse
* NSURLDownload
* NSURLSession








<< Fast Enumeration >>

-
collection 을 빠르게 enumerating 할 수 있다. ( for-each 문 성격 )


-
아래와 같은 syntax 를 갖는다.

for ( classType variable in collectionObject )
{
...
}


-
backward fast enumeration 은

for( classType variable in [collectionObject reverseObjectEnumerator] )
{
...
}





<< Memory Management >>


-
Objective-C 는 두 가지 형태의 메모리 관리 기술로 구분된다.
1. Manual Retain-Release or MPR
2. Automatic Reference Counting or ARC


-
MPR ( Manual Retain-Release )

메모리를 우리가 직접 alloc 하고 추적하다가 release 까지 하는 것.
alloc/init 하는 순간 retain count = 1
retain 을 호출하면 retain count++
release 를 호출하면 retain count--
retain count 가 0 이 되면 destroy 된다.


-
MPR 의 기본 rule 은
alloc, new, copy, mutableCopy 등을 이용해 object 를 만든다.
retain 을 통해 ownership 을 갖는다.
release 를 통해 ownership 을 포기 ( ownership 을 안 가지고 있는데 호출하면 안 된다. )


-
ARC ( Automatic Reference Counting )

MPR 과 같은 reference counting system 을 사용한다.
compile time 에 memory management method call 을 추가함으로써 자동으로 메모리 관리가 된다.
새로운 프로젝트에는 ARC 를 사용하는 것이 좋다.


-
자동 메모리 관리가 되기 때문에 retain, release 함수들을 호출해줄 필요가 없다.
따라서 가독성도 높여주고, 에러 확률도 줄여주며, 토드 양도 줄어들고, 메모리 릭도 적어진다.


-
GC 개념이 있었는데 OS-X Mountain Lion 부터 deprecated 되었다. ( MPR 과 관련 )
iOS 의 경우에는 GC 개념이 아예 없었다.
ARC 에서 사용하는 것은 GC 가 아니다.






반응형

댓글