본문 바로가기

Software/iOS & Objective-C

Xcode & Objective-C - 기초개념 1.


모든 App은 단 하나의 Window만을 가지며 UIView를 통해 View를 꾸미게 된다.

상속을 지원.
메소드 오버라이딩 = 기존의 것 + 추가 (재정의)
메소드 오버로딩    = 메소드의 이름은 같은나 입출력 값의 타입을 다르게 선언
------------------------------------------------------------------------------------------

메세징 문법

Objective-C에서는 다음과 같은 방식으로 객체에게 메시지를 보내게 된다. 메시지를 보낸다는 것은 객체의 메소드를 호출하는 것을 의미한다.

[Receiver Message]  ,  ex) [self initWithConnection];

메소드에 인자를 넘겨주는 형식  ->    [Receiver Message:23];
           인자가 2개 이상일 경우 ->    [Receiver Message:23 withOptionA:23 withOptionB:23];
                                               
                                                이것은 다른 객체지향 언어에서
                                                Receiver.MessageWithOptionAndOptionB(23, 23, 23); 과 같다.

부모클래스의 메소드 호출시 super키워드 사용 ex)[super draw];
------------------------------------------------------------------------------------------

데이터 타입

id  = void
nil = null

불리언 타입 : BOOL (YES,NO)

함수포인터와 유사한 개념 : SEL
------------------------------------------------------------------------------------------

클래스의 생성

클래스 인스턴스에 메모리를 할당하고 초기화!
id myRectangel = [[Rectangle alloc] init];

alloc 메소드는 Rectangle 클래스의 인스턴스 변수들에 메모리를 할당하고 이를 리턴하게 된다.
그런데 이때 인스턴스 변수들은 모두 0의 값을 가지게 되므로 init 메소드를 호출하여 초기화를 수행해야 한다.

Rectangle 클래스로부터 인스턴스를 하나 선언하기
Rectangle *myRectangle = [[Rectangle alloc] init];

이 인스턴스는 id타입의 변수에 저장될 수 있다.
------------------------------------------------------------------------------------------

클래스의 선언 및 정의하기

헤더파일과 소스 파일의 분리
Objective-C에서는 클래스를 작성할 때 일반적으로 인터페이스 부분(헤더)과 구현 부분(소스)을 별도의 파일로 나누어 작성한다. 헤더와 소스 파일의 이름은 내부에 정의된 클래스의 이름으로 정해지며
헤더 파일은h, 소스 파일은m 확장자를 사용한다.

#import <Foundation/Foudation.h>
#import  "Shape"

@class Circle

@interface Rectangle : Shape {
NSString *name;
NSInteger width;
NSInteger height; 
}
-(NSString *)description;
-(void)setName:(NSString *)myName;
-(void)setWidth:(NSInteger)myWidth height:(NSInteger)myHeight;
-(void)draw;

@end



#import는 기본적으로 #include와 같지만, 다른 점은 중복선언을 자동으로 처리 해준다.
(C나 C++에서 헤더 파일을 선언시 중복선와과 관련된 처리를 해야 한다)

@class는 해당 클래스를 import하지 않고 선언만 해서 사용할 수 있도록 해준다.

클래스 선언은 @interface 부터 @end 까지

NSString은 문자열을 나타내는 타입인데 파운데이션 프레임워크 에서 제공하는 다양한 클래스 중 가장 많이 쓰이는 것 중 하나다. 클래스에서 변수를 선언하는 경우에는 이와 같이 항상 포인터 타입으로 선언하게 된다.

이와 달리 NSInteger는 포인터 타입으로 선언하지 않는다. 그이유는 NSInteger가 클래스가 아닌, 기본 데이터 타입이기 때문이다. (정수)


클래스의 메소드를 선언하는 부분은    (클래스 메소드)와 (인스턴스 메소드)로 나뉜다.

ex)
id myRectangle;

myRectangle = [[Rectangle alloc] init];

[myRectangle setName:@"Test"];

[myRectangle setWidth:10 height:10];

[myRectangle draw];

alloc 메소드는 호출의 주체가 myRectangle이 아닌 Rectangle이다. 이처럼 클래스의 인스턴스가 아닌 클래스 자체로부터호출되는 메소드를 (클래스 메소드)라고 한다. 

클래스 메소드는 메모리를 할당하고 초기화하는 과정 없이 언제든 호출 가능.

alloc 메소드는 루트 클래스인 NSObect에 선언되어 있으므로 따로 선언할 필요가 없다.

반면 setName:, setWidth:height:, draw 메소드는 호출의 주체가 Rectangle 아닌 myRectangle이다.
이처럼 인스턴스로부터 호출되는 메소드를 (인스턴스 메소드)라 한다.

인스턴스메소드를 호출하려면 반드시 메모리를 할당하고 초기화를 해야 한다.

[클래스 메소드는 앞에 +를 인스턴스 메소드는 -를 시작으로 한다]

메소드 선언시 리턴 타입이나 인자의 타입을 명시하지 않으면 기본 데이터 타입인 id로 인식된다.
------------------------------------------------------------------------------------------

소스파일.m

#import "Rectangle.h" // 클래스를 선언하는 헤더 파일을 포함

@implementation Rectangle
//클래스의 구현의 시작 과 끝

-(void)setName:(NSString *myName {
...
}

@end

------------------------------------------------------------------------------------------

인스턴스 변수의 접근 권한 설정

@private        :    인스턴스 변수를 선언한 클래스에서만 접근 가능
@protected    :    인스턴스 변수를 선언한 클래스 및 해당 클래스를 상속한 클래스에서 접근 가능
@public         :    어디에서나 접근 가능
------------------------------------------------------------------------------------------























 
반응형

'Software > iOS & Objective-C' 카테고리의 다른 글

멀티스레딩 <NSThread>  (0) 2011.12.30
메모리 관리 <Objective-C?>  (0) 2011.12.29
iPhone 개발 듀토리얼 - Window and view  (0) 2011.09.17
네트워크 in iPhone & iPad  (0) 2011.09.17
해킨토시 설치 삽질중...  (0) 2011.09.16