본문 바로가기
모바일앱/Objective - C

Objective C 울렁증 극복하기

by GeekCode 2022. 4. 21.
반응형

오늘 부터 회사에서 맡아야하는 앱은 Objective-C 였다.

 

하.. 전혀 열받지 않고 어질어질 할 뿐.... 이게 뭐야....?

난 크로스플랫폼으로 빌드한 건줄 알고... swift 파일 어딨지? 하고 있었다. 아.. swift가 아니니까 swift파일이 없는 거구나.....

h 랑 m 아이콘이 엄청 많다. 와...

 

그럼 일단... 왜 해야하는 지 바로 느껴졌다. 

 

오늘은 소들이 님의 블로그를 가지고 공부를 했다. 

 

objc를 공부해야하는 이유

장점

  • 회사코드 리팩토링이 가능
  • 기능검색시 굉장히 많은 비중으로 objc가 나온다
  • ios 언어의 왕이 될 수 있다.

단점

  • 어렵고 지저분
  • 처음볼 때 난해하다

깊게 공부하지는 않아도 이해할 수 있을 정도 수준으로 공부하기

프로젝트 생성

 생성시 language 선택 : Objective -c

 프로젝트 파일의 생김새

스위프트랑 다르게 헤더 파일이 존재한다. (.h)

C언어를 확장한 언어이다.

때문에 헤더파일이 존재하고, 이 헤더파일에는 외부에서 사용할 메서드나 변수(상수)를 선언해야 한다.

참고정리

C 언어에 대하여

ViewControlller.h 살펴보기

헤더파일 내용

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController


@end

# import

외부 라이브러리,프레임워크 뿐 아니라 프로젝트 내에 선언된 클래스 등을 불러올 때 사용

#import <UIKit/UIKit.h>

C언어에서는 #include Swift에서는 import에 해당

C언어와 다른 점은 같은 헤더파일이 여러번 불리는 것들 알아서 방지해준다.

swift의 경우 프로젝트 전체가 namespace 범위로 지정되어 있어 일일히 객체를 import하지 않아도 사용가능

하지만 외부 라이브러리나 프레임워크 (UIKitm Foundation 등)은 Swift에서도 당연히 import해야한다.

@interface, @end

선언부를 나타낸다.

@interface ViewController : UIViewController

@end

보통 헤더파일의 존재이유는 어떤 것을 선언하기 위해서 사용한다.

  • @interface 는 클래스 선언이 시작된다 라는 부분이다. 선언부
  • → 어떤 클래스를 상속받고, 어떤 변수와 메서드를 쓸건지 여기서 선언
  • @interface 로 시작되면 꼭 끝에 @end가 있어야한다.

📌 변수선언방법

변수가 두군데에 쓰여있다.

@interface ViewController : UIViewController {
     NSString *name;
}

@property NSString *alias;

@end

➖  인스턴스 변수

@interface의 괄호 안에 선언되는 변수

이 전역 변수의 기본 접근 지시자는 protected 이다.

따라서 자기 자신, 혹은 상속받은 자식 클래스에서만 접근 가능하다.

외부 클래스에서도 접근 가능하게 해주려면 (잘 사용X)

🟰 아래와 같이 @public으로 접근 지시자를 바꿔줄 수 있다.

@interface ViewController : UIViewController {
     @public NSString *name;
}

@property NSString *alias;

@end

🟰 getter, setter를 직접 만들어준다.

- (void)setName: (NSString *)name {
        name= name;
}
- (NSString *)name {
        return name;
}

프로퍼티를 이용하여 접근

interface field 내에 @property 라는 접근 지시자를 통해 선언되는 변수는 모두 프로퍼티

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController {
        NSString *name;
}

@property NSString *alias;  //프로퍼티
@end

프로퍼티의 특징

  • getter, setter를 자동으로 생성 → 별도의 작업없이 외부에서 접근 가능

참고 https://babbab2.tistory.com/74

📌 메서드 선언방법

메서드는 별다른 것 없이 프로퍼티 선언부에 메서드 이름을 입력한다.

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController {
        NSString *name;
}
- (void)name;        //메서드
@end

🟰 ViewController, UIViewController

           //선언할 클래스 명   // 상속받는 클래스 명
@interface ViewController : UIViewController {

@end

🟰  Protocol

swift와 달리 상속 외 프로토콜 채택시에는 <> 괄호(angle bracket)를 이용해서 열거해주어야한다.

@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
@end

.m 파일 살펴보기

#import "ViewController.h"

@interface ViewController : UIViewController

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

@end

# import

.m에서는 .h 헤더파일이 있다면 자신의 헤더파일을 무조건 import하고 있어야한다.

또한 헤더파일에서 import한 것은 .m 파일에서 import할 필요가 없다.

@ interface, @end

@interface ViewController ()

@end

헤더파일의 @interface와는 달리

여기 등장한 @interface는 익명 카테고리로 Extension을 의미한다.

따라서 프로퍼티나 익스턴스 변수를 Private으로 선언하고 싶을 때 여기에 선언한다.

참고: https://babbab2.tistory.com/73

@ implementation, @end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

@end

interface와 마찬가지로 implementation이 끝나는 곳에도 @end가 있어야한다.

선언부, 구현부 정리

@interface ViewController ()

            // 선언부 : 외부에서 사용할 메서드 이름, 인스턴스 변수, property 선언

@end

@implementation

            // 구현부 : 메서드 구현

@end

메서드구현

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

@end

@synthesize

구현부내에 @신thㅓ사이즈 라는 게 가끔 보인다.

먼저 프로퍼티를 알아야하는데 프로퍼티는 전부 아래와같이 선언부 (interface field)에 선언한다고 했다.

@interface ViewController ()

            // 선언부 : 외부에서 사용할 메서드 이름, 인스턴스 변수, property 선언
            @property NSString *name; // 프로퍼티

@end

@implementation

            // 구현부 : 메서드 구현
            // name = @"GeekCode"; // 에러발생
@end

만약 이 프로퍼티를 구현부의 메서드 내에 사용하면 에러가 발생한다.

name이 정의되어있지않으니 _name으로 대체하라는 내용이다.

_name으로 대체하지않아도 self를 통해서 접근이 가능하다.

@interface ViewController ()

            // 선언부 : 외부에서 사용할 메서드 이름, 인스턴스 변수, property 선언
            @property NSString *name; // 프로퍼티

@end

@implementation

            // 구현부 : 메서드 구현
            self.name = @"GeekCode";
@end

프로퍼티의 특성

  • 프로퍼티는 선언부에 선언한 이름을 구현부에서 그대로 접근할 수 없다.

아래와 같이 사용한다.

@interface ViewController ()

            // 선언부 : 외부에서 사용할 메서드 이름, 인스턴스 변수, property 선언
            @property NSString *name; // 프로퍼티

@end

@implementation

            // 구현부 : 메서드 구현
            // self.name = @"GeekCode";
            // _name = @"GeekCode";
@end

하지만 _ 와일드카드 패턴을 없애고 싶을 때, 사용하는 것이 synthesize이다.

→ 선언부에 선언된 이름 그대로 접근이 가능하게 해준다.

  • 이 경우 self는 사용할 수 있지만 더이상 와일드카드패턴으로는 접근 할 수 없다.
@interface ViewController ()

            // 선언부 : 외부에서 사용할 메서드 이름, 인스턴스 변수, property 선언
            @property NSString *name; // 프로퍼티

@end

@implementation
            // 구현부 : 메서드 구현
@synthesize name;

            name = @"GeekCode";
@end

이 내용은 프로퍼티에 한정하고, 멤버변수는 상관 없다.

참고: https://babbab2.tistory.com/74

반응형

'모바일앱 > Objective - C' 카테고리의 다른 글

개발 / 운영서버를 반영하는 변수 만들기  (0) 2022.04.27