Objective-C 공부하는 이유
- 오픈 소스들을 살펴보면 옵젝씨를 사용하는 곳이 많다.
- Unity를 iOS에 연동하여 사용하는데 옵젝씨 코드였다.
- 회사에 들어가면 옵젝씨 코드를 볼수도 있다(주로 리펙토링)
- Swift랑 옵젝씨를 다 할 줄알면 앞으로가 든든해진다.
1. 프로젝트 생성하기
2. 생성된 파일 체크하기
이미지를 확인해보면 헤더 파일(.h)을 발견할 수 있다. -> 마치 C언어 느낌 -> Objective-C는 C언어를 확장한 언어이다!
따라서 Objective-C에서는 C언어의 모든 문법을 사용 가능
Objective-C는 C언어를 객체지향형으로 확장한 언어이다.
3. ViewController.h를 살펴보기
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
3-1. #import
C언어에서는 #include에 해당, Swift에서는 import에 해당함
C언어와의 차이점 : 헤더 파일이 여러번 불리는 것을 알아서 방지 해준다.
쓰는 시기 : 외부 라이브러리, 프레임워크 뿐만 아니라 프로젝트 내에 선언된 클래스등을 불러올 때도 꼭 import를 해주어야 한다.
Swift에서 import를 하지 않았는 이유
- Swift는 프로젝트 전체가 namespace 범위로 지정되있기 때문
- Swift도 프로젝트 내 객체에서만 국한되기 때문에 외부 라이브러리나 프레임워크(UIKit, Foundation 등)은 import 해야함
3-2. @interface, @end
@interface와 @end란?
- 클래스의 선언이 시작되는 것을 의미함
- 이때, 어떤 클래스를 상속받고, 어떤 변수와 메서드를 쓸 건지 여기서 선언해 준다.
- 또한, @interface로 시작되면 꼭 @end가 있어야 한다.
- 이유로는 @interface에서 시작해서 @end가 나오기 전까지는 interface field로 선언부에 해당하기 때문이다.
1️⃣변수 선언 방법
이런 식으로 변수 선언을 2번 해주어야한다.
@interface의 대괄호 안에 선언되는 변수
- Instance variable(인스턴스 변수)이다.
- 이 전역 변수의 기본 접근 지시자는 protected이므로 자기 자신, 혹은 상속받은 자식 클래스에서만 접근이 가능하다.
만약 외부 클래스에서 접근 가능하게 하고 싶을 때 하는 방법
1. 사용하지 않는 방법
- @public으로 접근지시자를 바꾸어준다.
@interface ViewController : UIViewController {
@public NSString *name;
}
- getter, setter를 직접 만들어 준다
- (void)setName:(NSString *)name {
name = name;
}
- (NSString *)name {
return name;
}
2. Objective-C에서 사용하는 방법
@property NSString *yoon;
이렇게 interface field 내에 @property나는 접근 지시자를 통해 선언되는 변수 -> 프로퍼티
이 프로퍼티의 특징으로는 getter,setter를 자동으로 생성해준다.
그리고 헤더 파일에선 변수 초기화를 할 수가 없다!
2️⃣메서드 선언 방법
메서드는 프로퍼티 선언해주는 곳에 메서드이름을 사용해 주면 된다.
4. ViewController.m 살펴보기
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
@end
1-1. @implementation @end 살펴보기
interface와 마찬가지로 implementation이 끝나는 곳에는 @end가 있어야한다.
@implementation에서 시작해서 @end가 나오기 전까지는 implementation field으로 구현부에 해당하기 때문
@interface ~ @end | @implementation field ~ @end |
선언부 | 구현부 |
외부에서 사용할 메서드 이름, 인스턴스 변수, property 선언 | 메서드 구현 |
1-4. 메서드 구현
@implementation과 @end 사이에 구현해주면 된다.
1-5. synthesize
프로퍼티를 interface field에 선언한 뒤 구현부의 메서드내에 구현하는데 아래와 같은 에러가 나옴
그 뒤 fix를 하면 _가 생성되는 것을 확인 할 수가 있다.
이유로는 이것이 프로퍼티의 특징으로 선언부에 선언한 이름을 구현부에서 그대로 접근할 수 없다.
따라서 사용을 할려면 _ 및 self.yoon으로 사용한다.
이때, 나는 _을 사용하고 싶지 않다 -> synthesize를 사용하면 된다!
다만, synthesize를 사용하게 되면 _는 사용 할 수가 없고 self는 사용가능하다.
'IOS > Objective-C' 카테고리의 다른 글
[Objective-C] 객체 생성 메소드 (0) | 2023.03.09 |
---|---|
[Objective-C] 동적 타입과 바인딩 (0) | 2023.03.09 |
[Objective-C] Class 상속 (0) | 2023.03.09 |
[Objective-C] Class 만들어보기 (0) | 2023.02.28 |
[Objective-C] 기본 표기법 및 객체 지향 프로그래밍 (0) | 2023.02.27 |