📄
목차
Objective-C
는 객체지향 프로그래밍을 목적으로 C언어의 확장 형태로 개발되었다. C나 C++과 호환됨녀서 다른 문법을 추가로 지원한다.
파일 구조
Header파일(.h)과 Implementaion파일(.m)
.swift파일
하나만 있는 Swift와는 달리 Objective-C
는 선언파일(.h)과 구현파일(.m)로 나뉘어진다.
/// NSString+Size.h
#import <Foundation/Foundation.h>
@interface NSString (Size)
- (CGSize)stringSize:(NSInteger)fontSize;
@end
/// NSString+Size.m
#import "NSString+Size.h"
@implementation NSString (Size)
- (CGSize)stringSize:(NSInteger)fontSize {
return [self sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:fontSize]}];
}
@end
위의 코드는 Swift로 치면 String에 Extension으로 메소드를 추가하는 코드이다. 파일 하나에 구현하면 되는 Swift와 달리 헤더파일에 추가할 메서드를 선언하고 해당 메서드를 .m파일에서 한다.
import
/// NSString+Size.h
#import <Foundation/Foundation.h>
/// NSString+Size.m
#import "NSString+Size.h"
import 할 때에도 차이점이 있는데 다음과 같다.
“”
를 사용한 import는 개발자가 프로젝트 내부에서 구현한 헤더파일을 가져올 때 사용한다.
<>
를 사용한 import는 시스템에서 구현한 헤더파일이나 외부 프레임워크에서 헤더파일을 가져올 때에 사용한다.
클래스 구조
Class와 Category
/// NSString.h
@interface NSString : NSObject <NSCopying, NSMutableCopying, NSSecureCoding>
/// NSSTring+Size.h
@interface NSString (Size)
ObjC는 객체지향의 클래스와 기존의 정의된 클래스를 확장시켜주는 카테고리 기능을 지원한다.
- class
@interface
,@implementation
/@end
으로 정의한다.
- Swift와 같이 상속(NSObject)과 프로토콜(<NSCopying, NSMutableCopying, NSSecureCoding>)을 지원한다. 동일하게 단일 상속만 지원된다.
- category
- 기존 클래스를 확장한다.
- Swift의 Extension과 비슷하지만 카테고리명을 추가적으로 달아 사용한다. 위의 코드에서는 (Size)
category에 대해서는 추후에 자세히 정리해봐야겠다.
@interface,@implementation / @end
/// NSString+Size.h
@interface NSString (Size)
...
@end
/// NSString+Size.m
@implementation NSString (Size)
...
@end
각각 선언과 구현을 맡는다.
@interface
/@end
:class
와category
의 메서드와 프로퍼티를 정의하는데 사용된다.
- 다른 클래스가 해당 클래스를 사용할 때에 접근할 수 있는 메서드와 프로퍼티를 결정한다.
@interface
와@end
사이에 해당 메서드와 프로퍼티를 정의하는 것으로 사용한다.
- 보통은
.h파일
에서 사용하며,.m파일
에서 쓰면 해당 프로퍼티나 메서드는 외부에 공개되지 않고 클래스 내부에서만 private으로 사용 가능하다.
- @implementation / @end:
@interface
에서 정의된 메서드와 프로퍼티를 구체적으로 구현한다.
메서드의 선언
/// NSString+Size.h
- (CGSize)stringSize:(NSInteger)fontSize;
/// NSString+Size.m
- (CGSize)stringSize:(NSInteger)fontSize {
return [self sizeWithAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:fontSize]}];
}
- 인스턴스 메서드는 -, 클래스 메서드는 +로 선언한다.
/// 파라미터가 없는 경우
- (리턴타입)메서드 이름;
/// 파라미터가 1개인 경우
- (리턴타입)메서드 이름: (파라미터 타입) 파라미터이름;
/// 파라미터가 여러개인 경우
- (리턴타입)메서드 이름: (파라미터1 타입) 파라미터1 이름
파라미터2 외부변수명: (파라미터2 타입) 파라미터2 이름
파라미터3 외부변수명: (파라미터3 타입) 파라미터3 이름
...
- 메서드가 1개인 경우에는 외부 변수명을 생략할 수 있다. 하지만 관행적으로 메서드 이름을 (메서드이름 with 파라미터1 외부변수명) 으로 작성하는 것 같다.
- 메서드가 여러개인 경우에는 외부변수명을 꼭 써줘야한다. 메소드를 이름을 정할 때에 외부변수명까지 포함된다는데, 아마 오버로딩을 염두해두고 이렇게 메소드를 정의하게 만든게 아닐까 싶다.
함수의 호출
/// NSString+Size.m
[NSString @{NSFontAttributeName: [UIFont systemFontOfSize:fontSize]}];
- 메소드의 호출은 .이 아니라 []를 통해 호출한다.
Reference
Objective-C
Objective-C에 대한 짧은 소개
![](https://seorenn.github.io/static/seorenn-symbol.png)
Objective-C에서 Swift로 - iOS Tech Talk
아직 Swift에 익숙하지 않은 분들이나, Swift로의 전환이 내키지 않아서 Objective-C 스타일로 사용하는 분들을 위한 Swift 베이직 강연입니다.
![](https://academy.realm.io/images/favicons/favicon-180x180.png)
![](http://images.ctfassets.net/s72atsk5w5jo/1ty7DioMQgicKeECUaU6M8/d7cd4ef64345d1c780e4fb4de19a324f/toSwift-iOSTechTalk.png)
Uploaded by N2T