Haru's 개발 블로그

[Objective-C] Objective-C 파일 살펴보기 본문

IOS/Objective-C

[Objective-C] Objective-C 파일 살펴보기

Haru_29 2023. 2. 26. 22:21

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는 사용가능하다.

Comments