Home » iOS -2. Objective-C 프로그래밍 기본

iOS -2. Objective-C 프로그래밍 기본

2.1. Objective-C

  • C언어의 문법을 모두 사용할 수 있다.
  • 스몰 토크 언어의 문법을 사용할 수 있다.
  • 다중상속을 지원하지 않는다.
  • 프로토콜을 정의하여 사용할 수 있다.
  • 클래스 확장이 가능하다.
  • 동적 형 변환(Dynamic Typing)을 지원한다.

2.2. 파일 확장자

파일 확장자 설명
h 헤더 파일, C언어의 헤더 파일과 동일한 역할을 한다.
m 구현 파일, C언어의 *.c파일과 동일한 역할을 한다. 구현 파일로 통칭
storyboard 인터페이스 빌더를 사용하여 만들어진 사용자 인터페이스 정보 파일
pch 미리 컴파일 된 헤어 파일
plist Xcode 프로젝트 정보가 저장되어있는 파일

2.3. 오브젝트와 메소드

메소드 호출

C++ Objective-C
오브젝트->함수명(값1, 값2); [오브젝트 메서드명:값1인자명:값2];
EX)
Calculator *cal = new Calculator();
cal->Sum(3, 9);
EX)
Calculator *cal = [Calculator init];
[cal Sum:3 number2:9];
  • Objective-C에서도 인자가 존재하지 않는 메서드가 존재할 수도 있으며, 그 경우에는 [오브젝트 메서드명];
    위와 같은 표현식을 사용한다.

  • 중첩 호출
     C언어의 경우 함수의 인자 값으로 또 다른 함수의 결과 값을 넣어서 사용할 수 있다.
     Objective-C 문법에서도 메서드를 중첩하여 사용할 수 있다.
     Objective-C 문법에서는 오브젝트와 메서드의 앞과 뒤에 [ ]로 감싸서 사용해야 한다.
     오브젝트와 메서드 사이에는 공백(space)을 넣어 구분한다.

C Objective-C
함수1(값1, 함수2(값2, 값3)); [오브젝트1메서드명[오브젝트2 메서드명:값1]];
EX) AddFunc(16, (SubFunc(4, 3)); EX) [button setFrame:CGRectMake(0, 50, 280, 40)];
  • 접근자
     Objective-C는 C언어와 달리 모든 멤버변수(인스턴스 변수)들이 기본적으로 private으로 작동된다.
     변수에 저장되어 있는 값을 얻거나 새로 지정하기 위해서 접근자(accessor)를 사용해야 한다.
표현식 예시
멤버 변수에 저장된 값을 획득하기 위한 표현식 획득값 = 오브젝트.멤버변수;
획득값 = [오브젝트 멤버변수];
멤버 변수에 새로운 값을 지정하기 위한 표현식 오브젝트.멤버변수 = 새로운값;
[오브젝트 set멤버변수:새로운값];

2.4. 오브젝트의 생성과 소멸

C++ Objective-C
new / delete (생성자 / 소멸자) alloc / release (생성자 / 소멸자)
EX)
Calculator *cal = new Calculator(); //생성
delete cal; //소멸
EX)
Calculator *cal = [[Calculator alloc] init]; //생성
[cal release]; //소멸

ARC(Automatic Reference Counting)

  • ARC(Automatic Reference Counting)은 코코아 애플리케이션에서 오브젝트 생명주기를 관리해주는 컴파일러의 기능으로 아래와 같은 특징이 있다.
    • 클래스 오브젝트 생성 코드에 autorelease를 사용하지 않는다.
    • 오브젝트 사용이 완료되었어도 release를 호출하지 않는다.

2.5. Objective-C 클래스

 모든 객체지향 언어로 작성되는 프로그램은 클래스의 집합을 사용하여 작성한다.
 Objective-C언어의 클래스가 다른 언어의 클래스와 가장 다른 점은 모든 클래스들이 루트 클래스(root class)의 자손이어야 한다는 것이다.
 코코아 애플리케이션에서의 루트클래스는 NSObject 클래스이다.
 따라서, 클래스 생성시 부모 클래스로 NSObject 클래스나 NSObject 클래스를 부모로 갖는 클래스를 부모 클래스로 지정해야 한다.

C++과 Objective-C의 클래스 비교

C++ Objective-C
class ClassName
{
// variables
public:
//functions
intfunc();
};
intClassName::func() {….};
@interface ClassName:NSObject
{
// variables
}
//functions
-(int) func();
@end

@implementation ClassName
-(int) func{…};
@end

클래스 선언부

 클래스 선언부는 @interface와 @end 사이에 기술한다.
 중괄호 안에는 멤버변수만 선언할 수 있다.
 메서드와 프로퍼티는 중괄호가 닫힌 부분부터 @end 사이에 기술해야 한다.
 프로퍼티란 Objective-C 클래스의 멤버변수들은 기본적으로 private이기 때문에 외부에서 접근 할 수 있도록 @property를 사용하여 프로퍼티로 등록한다.

  • Objective-C 클래스 선언부
    [php]
    //클래스선언부시작
    @interface ClassName:NSObject
    {
    //변수선언
    var_typevar;
    }
    //메서드선언
    -(ReturnType)MethodName;
    //프로퍼티선언
    @property var_typevar;

    //클래스선언부종료
    @end
    [/php]

  • 예제
    [php]
    //클래스선언부시작
    @interface Calculator:NSObject
    {
    //변수선언
    intnumX;
    intnumY;
    }
    //메서드선언
    -(NSInteger)Sum:(NSInteger)x number2:(NSInteger)y;
    -(NSInteger)Sum;
    //프로퍼티선언
    @property intnumX;
    @property intnumY;

    //클래스선언부종료
    @end
    [/php]

클래스 구현부

 클래스 구현부는 @implementation과 @end 사이에 기술한다.
 클래스 선언부에 기술되어있는 멤버변수를 사용하여 메서드 구현 코드를 작성한다.
 구현 클래스명: @implementation을 사용하여 구현될 클래스 이름을 기술하며, 선언부에서 기술한 클래스명과 동일하게 작성한다.
 메서드 구현: 선언부에서 기술한 메서드들을 반드시 작성해야 정상적으로 컴파일이 가능하다. @implementation과 @end사이에 작성한다.
 Objective-C언어는 private, public을 사용하지 않는다.
 클래스 선언부에 정의한 메서드들은 C++의 Public과 같은 동일하게 작동하며, 구현부에 메서드를 작성하면 C++의 private과 동일하게 작동한다.

  • Objective-C 클래스 구언부
    [php]
    //클래스구현부시작
    @implementation ClassName

    //선언된프로퍼티들을연결
    @synthesize var;

    //메서드구현
    -(ReturnType)MethodName
    {
    return ReturnType;
    }

    @end
    [/php]

  • 예제
    [php]
    //클래스구현부시작
    @implementation Calculator

    //선언된프로퍼티들을연결
    @synthesize numX, numY;

    //입력된숫자를이용한덧셈
    -(NSInteger)Sum:(NSInteger)x number2:(NSInteger)y
    {
    //계산결과반환
    return x+y;
    }
    //멤버변수를사용하여덧셈
    -(NSInteger)Sum
    {
    return self.numX+self.numY;
    }
    @end
    [/php]

2.6. 데이터 타입

  • 기본 데이터 타입
데이터 타입 설명
int 정수형 데이터 타입으로 C언어와 동일한 형식으로 사용한다.
bool Objective-C에서는 true, false 대신 YES, NO를 값으로 지정하여 사용한다.
float 부동 소수점 값의 마지막에 ‘f’문자를 표기하여 사용한다.
char 단일문자를 저장할 수 있으며, 문자열을 저장하기 위해서는 배열 또는 포인터 형태로 변수를 선언하여 사용해야 한다.

참고.
Objective-C에서는 NULL대신 nil을 사용한다.

  • Objective-C 데이터 타입
    데이터 타입 설명
    id Objective-C에서 사용되는 모든 오브젝트들을 식별하기 위해 사용하는 데이터 타입이다. Objective-C의 클래스는 모두 NSObject를 최상위 클래스로 지정하는 데, 오브젝트들이 모두 같은 데이터 타입을 사용하기 위해서이다.
    NSInteger C언어의 int와 같이 integer값을 지정하여 사용할 수 있다. 음수와 양수 정수 값을 저장한다. 오브젝트가 아닌 원시 데이터 타입(primitive data type)이므로 해당 변수에 접근하기 위해서 포인터를 사용할 필요 없다.
    NSUInteger C언어의 unsigned int와 같이 사용할 수 있다. 0과 양의 정수 값을 저장할 수 있다.
    NSString 문자열을 저장하여 사용할 수 있으며, 다양한 초기화 메서드를 포함한다. 오브젝트이므로 ARC를 사용하지 않으면 메모리 관리가 필요하다.