Objective-C 클래스 및 객체

Objective-C 프로그래밍 언어의 주요 목적은 C 프로그래밍 언어에 객체 지향을 추가하는 것이며 클래스는 객체 지향 프로그래밍을 지원하는 Objective-C의 핵심 기능이며 종종 사용자 정의 유형이라고합니다.

클래스는 객체의 형태를 지정하는 데 사용되며 데이터 표현과 해당 데이터를 하나의 깔끔한 패키지로 조작하기위한 메서드를 결합합니다. 클래스 내의 데이터와 메서드를 클래스의 멤버라고합니다.

Objective-C 특성

  • 클래스는 두 개의 다른 섹션에서 정의됩니다. @interface@implementation.

  • 거의 모든 것이 물체의 형태입니다.

  • 객체는 메시지를 수신하고 객체는 종종 수신자라고합니다.

  • 개체에는 인스턴스 변수가 포함됩니다.

  • 개체 및 인스턴스 변수에는 범위가 있습니다.

  • 클래스는 객체의 구현을 숨 깁니다.

  • 속성은 다른 클래스의 클래스 인스턴스 변수에 대한 액세스를 제공하는 데 사용됩니다.

Objective-C 클래스 정의

클래스를 정의 할 때 데이터 유형에 대한 청사진을 정의합니다. 이것은 실제로 데이터를 정의하지는 않지만 클래스 이름이 의미하는 바, 즉 클래스의 객체가 구성되는 것과 그러한 객체에서 수행 할 수있는 작업을 정의합니다.

클래스 정의는 키워드로 시작합니다. @interface인터페이스 (클래스) 이름이 뒤 따릅니다. 클래스 본문은 중괄호 쌍으로 묶여 있습니다. Objective-C에서 모든 클래스는 다음과 같은 기본 클래스에서 파생됩니다.NSObject. 모든 Objective-C 클래스의 수퍼 클래스입니다. 메모리 할당 및 초기화와 같은 기본 방법을 제공합니다. 예를 들어, 우리는 키워드를 사용하여 Box 데이터 유형을 정의했습니다.class 다음과 같이-

@interface Box:NSObject {
   //Instance variables
   double length;    // Length of a box
   double breadth;   // Breadth of a box
}
@property(nonatomic, readwrite) double height;  // Property

@end

인스턴스 변수는 비공개이며 클래스 구현 내에서만 액세스 할 수 있습니다.

Objective-C 객체 할당 및 초기화

클래스는 객체에 대한 청사진을 제공하므로 기본적으로 객체는 클래스에서 생성됩니다. 기본 유형의 변수를 선언하는 것과 똑같은 종류의 선언으로 클래스의 객체를 선언합니다. 다음 문장은 Box 클래스의 두 객체를 선언합니다-

Box box1 = [[Box alloc]init];     // Create box1 object of type Box
Box box2 = [[Box alloc]init];     // Create box2 object of type Box

box1 및 box2 개체는 모두 데이터 멤버의 자체 복사본을 갖습니다.

데이터 멤버에 액세스

클래스 개체의 속성은 직접 멤버 액세스 연산자 (.)를 사용하여 액세스 할 수 있습니다. 명확하게하기 위해 다음 예제를 시도해 보겠습니다.

#import <Foundation/Foundation.h>

@interface Box:NSObject {
   double length;    // Length of a box
   double breadth;   // Breadth of a box
   double height;    // Height of a box
}

@property(nonatomic, readwrite) double height;  // Property
-(double) volume;
@end

@implementation Box

@synthesize height; 

-(id)init {
   self = [super init];
   length = 1.0;
   breadth = 1.0;
   return self;
}

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

@end

int main() {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];    
   Box *box1 = [[Box alloc]init];    // Create box1 object of type Box
   Box *box2 = [[Box alloc]init];    // Create box2 object of type Box

   double volume = 0.0;             // Store the volume of a box here
 
   // box 1 specification
   box1.height = 5.0; 

   // box 2 specification
   box2.height = 10.0;
  
   // volume of box 1
   volume = [box1 volume];
   NSLog(@"Volume of Box1 : %f", volume);
   
   // volume of box 2
   volume = [box2 volume];
   NSLog(@"Volume of Box2 : %f", volume);
   
   [pool drain];
   return 0;
}

위의 코드가 컴파일되고 실행되면 다음과 같은 결과가 생성됩니다.

2013-09-22 21:25:33.314 ClassAndObjects[387:303] Volume of Box1 : 5.000000
2013-09-22 21:25:33.316 ClassAndObjects[387:303] Volume of Box2 : 10.000000

속성

Objective-C에는 클래스 외부에서 클래스의 인스턴스 변수에 액세스 할 수 있도록 속성이 도입되었습니다.

속성 선언은 다음과 같습니다.
  • 속성 시작 @property, 키워드

  • 그 뒤에는 비 원자 또는 원자, 읽기 쓰기 또는 읽기 전용 및 strong, unsafe_unretained 또는 weak 액세스 지정자가 있습니다. 이것은 변수의 유형에 따라 다릅니다. 모든 포인터 유형에 대해 strong, unsafe_unretained 또는 weak를 사용할 수 있습니다. 다른 유형에서도 마찬가지로 readwrite 또는 readonly를 사용할 수 있습니다.

  • 그 다음에는 변수의 데이터 유형이옵니다.

  • 마지막으로 세미콜론으로 끝나는 속성 이름이 있습니다.

  • 구현 클래스에 synthesize 문을 추가 할 수 있습니다. 그러나 최신 XCode에서는 합성 부분이 XCode에 의해 처리되므로 synthesize 문을 포함 할 필요가 없습니다.

클래스의 인스턴스 변수에 액세스 할 수있는 속성을 통해서만 가능합니다. 실제로 내부적으로 속성에 대해 getter 및 setter 메서드가 생성됩니다.

예를 들어, 속성이 있다고 가정 해 보겠습니다. @property (nonatomic ,readonly ) BOOL isDone. 후드 아래에는 아래와 같이 생성 된 세터와 게터가 있습니다.

-(void)setIsDone(BOOL)isDone;
-(BOOL)isDone;