id 타입

id 타입

id 타입은 Objective-C/Pascal에서 특별한 타입이에요. Object Pascal의 포인터 타입과 많이 비슷하지만, 실은 진짜 클래스라는 점이 달라요. 모든 objcclassobjcprotocol 타입의 인스턴스와 양방향으로 대입 호환(assignment-compatible)돼요.

출처: Free Pascal Reference - The id type

본문

대입 호환성은 두 방향으로 성립해요.

  • 어떤 objcclass/objcprotocol 타입의 변수든 id 타입의 변수에 대입할 수 있어요.
  • id 타입의 변수는 어떤 특정 objcclass/objcprotocol 타입의 변수에든 대입할 수 있어요.

이 두 대입 모두 명시적 타입캐스트가 필요 없어요.

추가로, 스코프 안에 선언된 어떤 objcclassobjccategory의 Objective-C 메서드든, id 타입 변수를 사용할 때 호출할 수 있어요.

만약 런타임에, id 타입 변수에 저장된 실제 objcclass 인스턴스가 보내진 메시지에 응답하지 않는다면, 프로그램은 런타임 오류로 종료돼요. MS-Windows에서 variant 디스패치 메커니즘이 동작하는 방식과 매우 비슷하죠.

같은 Pascal 식별자를 가진 메서드가 여러 개 있다면, 컴파일러는 표준 오버로드 해석(overload resolution) 로직으로 가장 적절한 메서드를 골라요. 이 과정에서 스코프 안의 모든 objcclass/objccategory 메서드가 overload 지정자와 함께 전역 프로시저/함수로 선언된 것처럼 동작해요. 마찬가지로, 어떤 오버로드된 메서드를 호출해야 할지 결정하지 못하면 컴파일러는 오류를 출력해요.

그런 경우, 그 호출을 구현하는 데 쓸 수 있는 모든 메서드의 목록이 힌트(hint)로 출력돼요.

이 오류를 해결하려면, 필요한 메서드를 담고 있는 objcclass 타입이 무엇인지 컴파일러에게 알려주는 명시적 타입캐스트를 사용해야 해요.

더 알아보기

  • id 타입의 동적 디스패치는 Objective-C 런타임의 메시지 전달 모델과 연결돼요.
  • 오버로드 해석에 대한 일반 규칙은 함수 호출 섹션에서 더 자세히 볼 수 있어요.