슈프림 블로그
[iOS/Obj-C] 코드를 읽기 위한 "아주아주아주 기초"적인 Objctive-C 문법 파악하기 본문
iOS 개발 하면서 Swift밖에 안 써본 나는.. Objctive-C 문법을 보고 아주 당황했다ㅋㅋ
C언어와 비슷한 맥락인 것 같은데 지금까지 써왔던 C 계열 언어와 생김새부터가 다르다.
그래서 objc 코드를 읽을 수 있을 정도로 정리하는 아주아주 기초중에 기초 문법!!
1. 헤더파일과 구현파일이 있다.
.h 파일은 헤더파일 - 선언부, 헤더 파일에서 선언된 부분은 헤더를 추가한 곳에서 전체 공개됨 (일반적)
.m 파일은 구현파일 - 구현부, 해당 구현 파일 내에서 선언된 부분은 내부에서만 공개됨 (일반적)
2. 헤더 추가
소스코드 최상단에 #include <헤더파일>
3. 메소드 정의
+ or - (return type
) method name
;
+ or - (return type
) method name
: (param type
) param
;
+ or - (return type
) method name
: (param0 type
) param0
param1 label
: (param1 type
) param1
;
+ : 클래스 메소드, - : 인스턴스 메소드
return type : 반환값이 없으면 (void
), 반환값이 class 객체면 (class명 \*
) -> 포인터라는 의미
4. 메소드 호출
[리시버 메소드명];
[리시버 메소드명: param0 label1: param1 label2: param2];
객체선언: [[리시버 alloc] init]; -> alloc은 클래스 메소드, init은 인스턴스 메소드
문자열 관련 메소드 호출
NSString *str = @"hello";
[str length];
[str compare: @"HELLO"];
* nil에 대한 함수롤 호출하면 무시된다. -> 로그를 찍으려고 할 때는 null이 뜬다.
5. 로그 출력
NSLog( @"포멧문자열", ...);
객체 : %@ - NSString도 이것으로 출력
정수 : %d
6. 클래스
일반적으로 NSObject를 상속받음 (단일상속만 가능)
선언
@interface 클래스이름: 부모클레스
// 선언부 ...
@end
구현
@implementation 클래스이름
// 구현부 ...
@end
멤버변수의 선언 : 선언부(공개), 또는 구현부(비공개) 중 선택해서 중괄호 안에 선언한다.
메소드의 선언 : 공개하고 싶으면 선언부에 적지만, 비공개하고 싶으면 선언을 생략하고 구현부에서만 작성할 수도 있다.
7. 데이터 입출력 메소드
클래스의 데이터는 캡슐화되어야 한다.
getter와 setter 메소드 사용 -> 직접 구현하는 방법
getter : -(멤버변수타입)멤버변수명
setter : -(void)set변수명: (멤버변수타입) 초기화 할 파라미터 ...
8. 셀렉터
메소드를 구분할 수 있는 방법이다. 셀렉터로 메소드를 호출할 수 있다.
SEL sel = @selector(셀렉터)
[str performSelector: sel]
- (NSComparisonResult)compare: (NSString *)string;
=> compare:
- (NSComparisonResult)compare: (NSString *)string options: (NSStringCompareOptions)mask;
=> compare: options:
- (NSComparisonResult)compare: (NSString *)string options: (NSStringCompareOptions)mask range: (NSRange)compareRange;
=> compare: options: range
* nil값에 대한 메소드를 호출하면 무시되지만, 없는 selector를 호출하는 것은 크래시가 발생한다.
9. 프로퍼티
.을 이용하여 데이터에 접근 (cf. 멤버변수는 getter, setter 메소드를 이용한다).
@property ([options]) type name;
프로퍼티만 선언하면 자동으로 _프로퍼티이름의 멤버변수가 선언된다.
getter, setter를 만들어줄 필요도 없다. 컴파일러가 자동으로 만들어줌
자동으로 생성되는 멤버변수의 이름을 좀 다르게 주고 싶다면? @implementation 부분에서
@synthesize 프로퍼티명;
@synthesize 프로퍼티명 = 멤버변수명;
프로퍼티 옵션
- 읽기쓰기 : readwirte(default) / readonly
- thread 접근제어 : atomic(동시접근제어, default) / nonatomic
- getter setter
: 자동생성말고 지정해주고 싶은 경우 사용.
: 구현부에서 재정의도 가능 (주의, self.프로퍼티가 아닌 멤버변수로 사용할 것!)- @property (getter = getWidth, setter = setWidth:) int width;
10. 지연 초기화 Lazy Initialize
ivar 또는 property를 선언만하고 초기화하지 않으면 nil값을 가지고 있게 된다.
직접 초기화하지 않고, getter애서 다음과 같은 방법으로 지연초기화 하는 방식을 구현할 수 있다.
Swift에서는 lazy라는 키워드를 통해 구현 가능하다.
if (프로퍼티 == nil) {
// 여기서 초기화
}
'iOS_Swift' 카테고리의 다른 글
[Xcode] 여러 버전의 Xcode로 작업하기 (3) | 2022.03.30 |
---|---|
[XCode] 실제 기기 테스트 시 발생하는 에러 모음 (0) | 2021.11.19 |
[iOS/Swift] iOS 앱 현지화 (한국어 앱 이름 변경까지!) - XCode Project Localization & CFBundleDisplayName (0) | 2021.05.31 |
[Swift/iOS] 소셜로그인 - Facebook Login (0) | 2021.05.11 |
[Swift] 코딩테스트 보다가 열 받아서 정리하는 Swift 정규식 - NSRegularExpression (Regex) (1) | 2021.03.21 |