Swift개발자의 Objective-C 입문 - Method
다음의 포스트를 참고하여 작성하였습니다.
Cocoa Dev Central: Learn Objective-C, (2022.01.22)
1. Basic
1-1. 기본 문법
[object method];
[object methodWithInput:input];
다른 언어에서 주로 사용하는 object.method
를 Objc에서는 대괄호와 스페이스로 호출한다.
입력 파라미터가 있는 경우 :
를 메소드와 파라미터 사이에 작성한다.
너무 어색하다
1-2. 리턴값이 있는 경우
output = [object methodWithOutput];
output = [object methodWithInputAndOutput:input];
1-3. 클래스 메소드 사용
id myObject = [NSString string];
근데 여기서 id를 처음 본다.
id
는 Objective-C의 자료형으로
모든 종류의 객체를 참조할 수 있는 자료형이다. (id형은 *다형성과 *동적 바인딩을 위한 Objective-C의 기능) 잘 모르겠지만, 아무 객체나 참조 가능한 자료형으로 알고 넘어가보려 한다.
*다형성 : 하나의 객체가 여러 가지 타입을 가질 수 있는 것(회사원이면서, 남자이면서, 한국인 등) *동적 바인딩 : 런타임 시점에 객체 타입을 기준으로 실행될 함수를 호출하는 것
만약 명확하게 타입이 NSString일 경우, 다음과 같이 작성할 수 있다
NSString* myString = [NSString string];
오브젝트 타입 뒤에 *
이 등장한다.
모든 Objective-C의 오브젝트 변수들은 포인터 타입이다. id타입은 이미 포인터 타입으로 정의되었기에 붙일 필요가 없다.
2. Nested Message(중첩 메세지)
내가 일반적으로 알아왔던 함수 호출의 개념을 Objective-C에서는 메세지 전송이라고 한다. (잘 모르겠어서 다음에 더 자세히 알아보려고한다.)
많은 프로그래밍 언어에서 Nested 메소드 혹은 함수를 호출할 때에는 다음과 같이 작성한다.
function1 ( function2() );
function2의 결과를 function1의 입력으로 던지는 것.
Objective-C에서는 다음과 같이 작성한다.
[NSString stringWithFormat:[prefs format]];
Nested Mesage는 가독성이 떨어지게 되므로 한 번에 두 개 넘게 사용하는 것을 피해야 한다.
3. Multi-Input Methods
몇몇 메소드들은 여러개의 입력값을 갖는데, Objective-C에서는 메소드 이름을 여러 세그먼트로 나누어 사용하여 헤더에서 다음과 같이 선언한다.
-(BOOL)**writeToFile**:(NSString *)path **atomically**:(BOOL)useAuxiliaryFile;
위의 메소드를 다음과 같이 작성하여 호출한다.
BOOL result = [myData **writeToFile**:@"/tmp/log.txt" **atomically**:NO];
내가 알던 거랑 많이 다르다
내가 알던 다중 파라미터 함수는 function(a, b)
이다. Objective-C는 함수명과 파라미터가 구분이 안되는 것처럼 보인다.
이에 대해 알아보니 다음과 같은 내용을 알게되었다.
Objective-C의 경우 명명된 파라미터가 아니다,
Runtime시스템에서 메소드 명은writeToFile:atomically:
로 인식된다.