Objective-C 기초 문법 정리

기초 문법

.h 헤더 파일과 .m 구현 파일 2개가 존재한다.

헤더 파일에는 클래스나 변수, 메서드를 선언해 주고 .m 파일에서 자세한 구현 사항을 기술한다.

한 문장이 끝날 때마다 세미콜론을 사용해야 한다.

 

#import

#import "headerSomethingHeader.h"
#import <folder/Something.h>

외부 라이브러리, 프레임워크, 프로젝트 내에 있지만 다른 파일에 선언된 클래스를 사용할 때 import해 준다.

구현 파일에서도 자신의 헤더 파일을 반드시 import 해야 하며, .h 파일에서 import 한 내용은 .m 에서 import할 필요가 없다.

각각 파일별로 관리된다고 보면 되며, C언어와 비슷하게 사용할 클래스가 있다면 import하여 사용한다.

 

클래스 선언

@interface Person : NSObject <someProtocol, anotherProtocol>
// instance
{
    int age;
		static int value2 // 선언한 파일 내에서만 접근 가능
				// 만약 method 내에서 static keyword 변수가 있다면 내부에서만 사용 가능
    NSString *name;
    NSString *favoriteSubject;
}

// property
@property (atomic, assign) int  age;
@property (nonatomic, retain) NSString *name;

// method 선언
- (void)methodWithParameter:(Int)value; // 인스턴스 메서드
@end

// 밖에서 선언 시 전역변수로 사용
  • atomic / nonatomic
    • atomic: 해당 값에 쓰기를 할 때 lock을 걸어 여러 스레드에서 동시에 한 변수에 접근하는 것을 막는다.
    • nonatomic: 위를 막지 않고 속도가 빠름
  • strong(retain), weak(assign)
    • strong: 강한 참조!
    • weak: 약한 참조
  • instance / class method
    • ‘-‘로 시작하는 함수는 instance method
    • ‘+’로 시작하는 함수는 class method

헤더 파일이 아닌 구현 파일에서 @interface , @end 를 사용할 경우, 해당하는 클래스 / 변수 / 메서드는 private 으로 동작한다.

class로 선언하려고 할 경우 NSObject 를 상속받아야 한다.

프로토콜을 채택할 때는 <> 을 이용한다.

변수의 경우, Objective-C 객체의 경우에는 변수명 앞에 *를 표시해 준다.

@property NSNumber *yearOfBirth; 
@property int yearOfBirth;

 

 

 

Enum

  • normally define
typedef enum ShapeType : NSUInteger {
    kCircle,
    kRectangle,
    kOblateSpheroid
} ShapeType;
  • macro
typedef NS_ENUM(NSUInteger, ShapeType) {
    kCircle,
    kRectangle,
    kOblateSpheroid
};

 

 

 

CG_INLINE

CG_INLINE NFilterMargin setMargin(NSInteger left, NSInteger top, NSInteger right, NSInteger bottom)
{
    NFilterMargin NFilterMargin;
    NFilterMargin.left = left;
    NFilterMargin.top = top;
    NFilterMargin.right = right;
    NFilterMargin.bottom = bottom;
    return NFilterMargin;
}

인라인 함수로 사용될 수 있다는 거인듯?

근데인라인함수가뭔데 모르겟어요 더알아볼게요

~ 나중에 계속 ~

 

 

id Type

  • C언어의 포인터를 포함하여 정의한 타입!
  • Objc의 모든 오브젝트 변수들은 모두 포인터 타입이기 때문에, 어떤 것도 지칭해서 사용할 수 있는 id Type으로 만들어 편하게 사용하기 위해 사용한다. (Swift에서는 Any랑 비슷한듯?)
  • 또한, 형변환 없이 사용할 수 있기 때문에 편리하다.
  • 객체가 무얼 담느냐, 무얼 지칭하느냐에 따라서 변수의 타입이 갈리기 때문에 런타임 시 타입이 정해진다.

 

 

bridging-header(swift↔Objc)

etc-image-0

objc .m 파일 하나 대충 만든다

그 이후에 Xcode가 너 bridgingHeader 만들 거냐고 물어봄

그럼 ㅇㅇ 하면 댐

근데 만약에 안 만들어 줬다?

그럼… 만들어야지…

프로젝트이름-Bridging-Header 로 옵젝씨 파일 만든 후에 사용할 헤더들 추가하면 된당

그리고 빌드 셋팅에서 확인!!

만약에 Xcode가 알아서 만들어줬더라도 혹시 안 되어 있을 수 있으니 확인 ㅇㅇ

 

 

 

 

현재 취뽀 해서 기존 프로젝트의 Objc 코드를 이해하고 잇다 ,, ^__^

근데 진짜 C랑 Swift의 언저리에 있는 느낌? 이지만 왠지 C에 더 가까운 것 같기도 하고?

뭔가 와 이 부분은 진짜 C기반 언어인 게 보인당!! 싶으면서도 Objc만의 문법도 많은 것 같다

물론 Swift랑 겹치는 부분도 있고~~ (당연함 Swift가 Objc기반 .. ..)

아무튼 :3

 

C도 했고 swift도 했어서 그나마~~~~ 적응하고 있는 것 같당...

뭔소린지 모르겠지만 뭔소린지 알겠는 수준임(앞으로는 더낫겟지..)

 

따라서 옵젝씨 문법 정리는 한 번으로 안 끝나고 계속될 예정이다 . . .

언제까지? 내가 짱이 될 때까지...................................

 

'iOS > Objective-C' 카테고리의 다른 글

Arithmetic Overflow in Swift & Objective-C  (0) 2025.04.07
[Objective-C] hooking과 method swizzling  (0) 2024.04.18