-
읽기라도 하자! 나를 위한 Objective-C 속성 문법 정리Objective-C 2021. 10. 11. 00:33
기초
C언어 상위 호환
Objectvie-C는 이름에서도 볼 수 있듯이 C랑 비슷하다. 기본 문법은 거의 C언어를 따른다고 보면 된다.
- .h의 헤더 파일과 .m의 구현 파일 2개가 존재한다.
- 헤더 파일에는 클래스나 변수, 메서드 등을 선언해 두고, .m 파일에서 자세한 구현 사항을 기술한다.
- 세미콜론 사용
- 한 문장이 끝나면 세미콜론을 꼭 써준다!
- /* */ 로 주석을 달 수 있다.
- 접근 제한에 관련한 키워드 유의!
로그 출력
- NSLog
- %d, %@ 등 이용
NSLog(@"count: %d \\n", sizeof(int)); // 숫자 출력 NSLog(@"Hi! %@ \\n", name); // 문자 출력
NSLog는 Xcode에서 Build Configuration이 Debug일 때만 출력된다.
- printf
NSString *name = @"이름"; printf("print NSString %s \\n", [name UTF8String]);
NSString을 printf로 출력할 때는 UTF8String으로 변환해서 사용.
기본 문법
변수
- 인스턴스 변수
예시의 title 변수. 자기 자신과 자신을 상속받은 자식 클래스에서만 사용가능한 접근제한을 가진다 (protected)@interface ViewController : UIViewController { NSString *title; }
- 프로퍼티 (변수)
프로퍼티는 getter, setter를 자동으로 생성해 준다. 따라서 외부에서 접근이 가능함.@property NSString *title;
외부에서 해당 변수를 읽기만 허용하고 싶으면 (readonly) 키워드를 붙여준다.@property (readonly) NSString *id;
- 전역 변수, static 키워드
일반적으로 선언문 (@interface-@end) 사이 밖에서 선언하면 전역 변수로 사용된다. static 키워드 해당 변수의 접근 제한 범위를 지정하는데, static 키워드가 붙은 변수는 선언된 파일 내에서만 접근 가능하다. 만약 메서드 내부에서 static 키워드로 선언된 변수가 있다면, 그 변수는 해당 메서드 내부에서만 사용 가능하다.int value1; static int value2;
+) extern
-(void)printValue1{ extern int value1; }
value1은 static 키워드가 없기 때문에 다른 파일에서도 접근 가능하다. 다른 파일에서 해당 변수를 사용할 때 extern 키워드를 붙여준다. extern은 메서드에서도 사용한다.
헤더 파일
- #import
외부 라이브러리, 프레임워크, 프로젝트 내에 있지만 다른 파일에 선언된 클래스를 사용할 때 import 해준다. (swift와 다른점!)#import <UIKit/UIKit.h>
- @interface/@end
@interface - @end 가 하나의 쌍으로 이 사이에 클래스, 변수, 메서드 등의 선언을 한다.@interface ViewController : UIViewController @end
- 메서드 선언
- (void)name;
- 클래스 상속
swift 에서와 마찬가지로 : 뒤에 상속할 클래스 명을 써준다. 단일 상속만 가능.@interface ViewController : UIViewController
- 프로토콜 채택
프로토콜을 채택할 때에는 <> 를 이용한다.@interface MyClass : NSObject <NSCoding, NSCopying>
구현 파일
- #import
헤더 파일이 있으면 자신의 헤더 파일을 반드시 import 해야한다. .h 파일에서 import한 내용들을 .m에서 import 할 필요는 없다. import문에는 세미콜론 안씁니다!#import "ViewController.h"
- @interface/@end
구현 파일에서 위와 같이 쓰면 프로퍼티나 인스턴스 변수, 메서드를 private로 사용한다. (extension과 비슷)@interface ViewController () @end
- @implementation/@end
구현부로 메서드를 직접 구현한다.@implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. } @end
클래스
개요
Objective-C는 대부분의 객체가 상속받는, 가장 기본적인 기능을 기술하고 있는 루트 클래스인 NSObject를 정의한다.
@interface Person : NSObject @property NSString *name; @property NSString *sex; @end
클래스 정의는 다음과 같이 한다.
우선 가장 기본적인 기능을 기술하는 루트 클래스인 NSObject 클래스를 상속받고 해당 클래스가 public하게 상호작용 하기 위한 방식을 @interface - @end 키워드 쌍 사이에 작성해줄 것이다.
💡클래스 이름은 앱, 심지어 앱에 포함되는 다른 라이브러리나 프레임워크 내에서의 다른 클래스와도 겹치면 안된다! 따라서 일반적인 클래스 이름 앞에 접두어가 붙는 경우가 많다!
@interface WLPerson : NSObject
person앞에 WL 이라는 나만의 접두어를 붙여서 중복을 피한다.
변수
위의 예에서 Person 클래스는 Objective-C 객체인 NSString 타입의 name, sex 변수를 갖는다.
Objective-C 객체이기 때문에 변수명 앞에 *를 표시해준다.
@property NSNumber *yearOfBirth; @property int yearOfBirth;
숫자 타입 변수를 선언하고 싶으면 이렇게 2가지 방법이 있다.
메서드
- (void)myMethod;
반환 값 및 매개변수가 없는 메소드 선언은 다음과 같이하고, - 기호는 인스턴스 메서드임을 나타낸다. (클래스 메서드와 다르다!)
인스턴스 메서드는 해당 클래스의 모든 인스턴스에서 사용가능함.
- (void)myMethodWithParameter:(Type명)value; - (void)myMethodWithFirstValue:(Type명)value1 secondValue:(Type명)value2;
매개변수를 가지는 메서드를 위와 같이 선언한다.
매개변수가 여러개일 때가 좀 특이한데, 저 secondValue: 부분까지 함수의 이름, 즉 myMethodWithFirstValue:secondValue: 가 함수명이 되기 때문에 파라미터 순서를 바꾼다거나 할 수 없다. 단 value1, value2 부분 이름은 마음대로 써도 됨.
+ (id)string;
클래스 메서드는 인스턴스 메서드와 달리 + 기호를 가진다. 클래스 메서드는 인스턴스 메서드와 달리 인스턴스를 생성하지 않고 클래스 그 자체로 사용할 수 있는 메서드. 인스턴스 내부의 메서드와 관련없이 클래스가 같으면 같은 결과를 낼 때 사용.
여기까지가 Objective-C의 가장 기본적인 내용이랑 apple의 Objective-C 프로그래밍 가이드의 제일 첫 장,
"Defining Classes" 의 내용이다.
다음부터는 프로그래밍 가이드 내용을 번역하고 공부해가면서 포스팅 해봐야지~
참고 자료
Objective-C) Swift 개발자를 위한 Objective-C (1) - .h 파일 살펴 보기
https://www.tutorialspoint.com/objective_c/objective_c_basic_syntax.htm
- .h의 헤더 파일과 .m의 구현 파일 2개가 존재한다.