[IOS, XCode]Objective-C 간편 정리 – 1

@interface 란?

@interface 부분은 클래스, 데이터형 메서드를 선언하여 컴파일러에게 알려주는 기능을 담당

메서드 정의 방법

– (void) SampleMethod : (int) value;

  • – : 메서드형 (-/+)
  • (void) : 반환 데이터형
  • SampleMethod : 메서드 이름
  • (int) : 인수 데이터형
  • value : 인수 이름
  • ; : 선언 종료

: (int) value: (int) value2: … 식으로 인수를 두개 이상 가능

+ 란?

클래스 메서드로 C++, Java등의 static 메서드와 동일한 기능을 가짐
클래스 메서드는 클래스를 초기화하지 않고도 호출할 수 있는 메서드이며 메서드 내부에서는 클래스 메서드와 변수만 호출할 수 있다.
일반적으로 이 클래스는 선언해서 사용하는 클래스가 여럿이고 그 클래스에서 같은 값을 사용해야 하는 경우나 초기화하지 않아도 되는 간단한 기능들을 클래스 메서드로 선언해서 사용.

– 란?

인스턴스 메서드로 다른 언어의 public 메서드와 동일한 기능을 가지며 클래스의 특정 인스턴스에 작업을 수행

리턴값이란?

메서드를 선언할 때 메서드 실행 결과값을 반환할지 어떤 타입으로 반환할지 등에 대해 컴파일러에게 알려줘야한다. 다음 예제에서 앞부분의 괄호 안에 있는 데이터형이 반환될 데이터형이다.

그리고 아무값을 반환하지 않을 경우에는 위의 예제에서 int를 void로 대체하여 사용.

@property 란?

@property는 다른 클래스에서 클래스 내 변수를 사용할 수 있게 getter, setter 접근자 메서드를 자동으로 생성해 주는 편리한 지시어다. @property 지시어를 사용하여 프로퍼티를 지정해 주면되지만 실질적으로 getter, setter 메서드를 컴파일러가 자동으로 생성하기 위해서는 구현 파일(*.m)에 @systhesize@dynamic 지시어를 사용해야 한다.
@property는 헤더파일(*.h)에 선언하며 @interface의 대괄호 끝부분과 @end 사이에 선언.

@property 속성

getter = gettername

입력하는 파라미터가 없고, 리턴값도 없는 인스턴스 메서드, getter의 이름을 변경해 주는 속성. 기본적으로 getter는 프로퍼티로 선언한 이름과 같은 이름으로 되어 있는데 이런 getter 이름을 변경해 줘야 할 때 사용할 수 있는 속성.
주로 상태가 변경되었는지 또는 준비가 완료되었는지 확인하는 bool 자료형의 데이터에서 많이 사용

getter가 선언되지 않은 경우는

로 프로퍼티에 접근하지만 위의 경우는

로 프로퍼티에 접근

setter = settername

setter의 이름을 변경해 주는 속성으로 일반적으로 setter의 이름은 프로퍼티 이름 앞에 set을 붙여서 생성

readwrite(기본값)

프로퍼티에 접근하는 권한을 설정하는 속성으로 getter와 setter를 다 사용할 수 있게 권한을 설정한다는 뜻.

readonly

프로퍼티에 접근하는 권한을 설정하는 속성으로 getter만 사용할 수 있게 권한을 설정한다는 뜻

assign(기본값)

프로퍼티 접근 방법에 대해 설정하는 속성으로 자신이 직접 메모리를 관리할 수 있는 키를 가져오는 방식으로 프로퍼티에 접근하는 방법을 사용

retain

프로퍼티의 접근 방법에 대해 설정하는 속성으로 같은 메모리에 관리할 수 있는 키를 하나 더 주는 방식으로 프로퍼티에 접근하는 방법을 사용

copy

프로퍼티의 접근 방법에 대해 설정하는 속성으로 다른 메모리를 새로 생성하는 방식으로 프로퍼티에 접근하는 방법을 사용

atomic

메모리에 접근하는 방식을 결정하는 설정으로 여려개의 스레드를 사용할 때 또는 동시에 접근하여 프로퍼티의 값을 변경할 때 원하지 않는 결과가 생기는 경우가 있기 때문에 순차적으로 접근하여 문제가 생기지 않도록 하나의 스레드가 접근하려고 하면 다른 스레드들이 대기하도록 락을 걸게되는데 이기능을 사용

nonatomin

프로퍼티에 접근하는 방식을 결정하는 설정으로 atomic의 경우 락과 언락을 하게 되어 속도 면에서 기능을 수행하지 않을 때보다 프로퍼티에 접근할 때느리게 작동하게되는데 이 여러개의 스레드를 이용하지 않을 경우 이 기능이 동작하지 않게 하여 프로퍼티에 접근할 수 있는 속도를 향상 시킬수 있다.

#import 란?

전처리 지시어로 다른 파일에 정의를 #import문을 이용해 프로그램에 포함시킬 때 사용하며 보통 ‘*.h’로 끝나는 헤더 파일을 참조.

선언하는 위치 : 헤더파일과 구현파일
선언의 형태 : #import<파일이름> , #import “파일이름”

#Import “*.h 파일의 절대 경로나 상대 경로”

선언하는 파일의 위치에서 절대 경로나 상대 경로를 찾아서 참조하겠다는 뜻

ex)

#import <폴더이름/파일이름>

선언하는 파일을 기존에 설정된 폴더 내에서 찾아서 참조

import와 비슷한 지시어로 @class가 있는데 @class는 #import되어 있지 않은 클래스를 변수로 선언해야 할 경우에 선언하는 형태가 클래스라는 것을 알려주는 역할을 하며 단지 선언하는 형태가 클래스인 것을 알려주기만 할 뿐이지 이 클래스의 구조와 가지고 있는 메서드, 프로퍼티에 대한 정보는 없기 때문에 포인터를 보관하는 용도로 사용하는 경우가 일반적이며 헤더파일 전체를 참조할 필요가 없어 효율적이지만 클래스 내 메서드를 이용할 경우에는 더 많은 정보가 필요하여 #import구문을 사용해야 함.

#implementation 란?

@interface에서 이미 어떻게 하겠다고 정의한 내용을 실제로 컴파일러에게 구현해야함을 알리는 식별자이며 메서드가 어떻게 동작하고 다른 메서드들과 어떻게 연관이 되는지 실제로 구현하는 영역

@synthesize 와 @dynamic

앞서 @interface에서 프로퍼티로 선언했다면 컴파일러에게 해당 메서드를 자동으로 생성하도록 하는 지시어, 물론 자동 접근자 지시어를 이용하지 않고 직접 해당 메서드를 구현할 수도 있으나 컴파일러가 직접 생성한 메서드가 더 효율적

@synthesize는 일반저긍로 구현 파일(*.m)에 구현하지만 헤더 파일(*.h)에 구현할 수도 있다.

위에 선언된 world는 다음 코드가 생략된것.

@dynamic 지시어는 getter와 setter가 구현되어 있지 않아도 상위 클래스 어딘가에서 선언되어 있다고 미리 알려주기 때문에 컴파일 요류가 발생하지 않으며 접근할 수 있는 메서드들이 미리 생성되어 있지 않고 런타임시 제공되는 경우에도 @dynamic 지시어로 컴파일 오류가 발생하지 않게 할수 있다.

 

 

 

댓글 남기기