Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
반응형
Archives
Today
Total
관리 메뉴

슈프림 블로그

[iOS/Obj-C] 코드를 읽기 위한 "아주아주아주 기초"적인 Objctive-C 문법 파악하기 본문

iOS_Swift

[iOS/Obj-C] 코드를 읽기 위한 "아주아주아주 기초"적인 Objctive-C 문법 파악하기

_슈프림 2021. 7. 6. 18:26
728x90

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) {
	// 여기서 초기화
}

 

반응형
Comments