source

Java 인터페이스와 Objective-C 프로토콜의 차이점

factcode 2022. 9. 27. 23:47
반응형

Java 인터페이스와 Objective-C 프로토콜의 차이점

나는 자바어를 알고 있고, 지금은 Objective-C를 배우고 있다.Java 인터페이스와 Objective-C 프로토콜의 차이점은 무엇입니까?

먼저 자바 창시자 중 한 명이 이 주제에 대한 역사적 관점을 제시하겠습니다.다음으로, 위키피디아에는 Objective-C 프로토콜에 대한 중간 정도의 도움이 되는 섹션이 있습니다.특히 Objective-C는 두 정식 프로토콜 모두를 지원한다는 것을 이해한다.@protocol키워드, Java 인터페이스와 동등한) 및 비공식 프로토콜(반사를 통해 발견될 수 있는 클래스에 의해 구현된 하나 이상의 메서드)입니다.

정식 프로토콜('인터페이스 구현'을 위한 Objective-C 용어)을 채택하면 컴파일러는 구현되지 않은 메서드에 대해 Java에서 기대하는 것과 같은 경고를 보냅니다.Java(skaffman이 언급했듯이)와는 달리 Objective-C 클래스가 정식 프로토콜에 포함된 메서드를 구현하면 인터페이스가 명시적으로 채택하지 않더라도 해당 프로토콜에 "적합"한다고 합니다.다음과 같이 코드(-conformsToProtocol: 사용)에서 프로토콜 적합성을 테스트할 수 있습니다.

if ([myObject conformsToProtocol:@protocol(MyProtocol)]) {
    ...
}

메모: Apple 문서에는 다음과 같이 기재되어 있습니다.

"이 방법은 위에서 설명한 것과 같이 헤더 파일 내의 공식 선언만을 기반으로 적합성을 판단합니다.프로토콜에 선언된 메서드가 실제로 구현되었는지 확인하는 것은 아닙니다. 이는 프로그래머의 책임입니다."

Objective-C 2.0(OS X 10.5 "Leopard" 및 iOS)에서 정식 프로토콜은 이제 선택적 메서드를 정의할 수 있으며 클래스는 모든 필수 메서드를 구현하는 한 프로토콜을 준수합니다.를 사용할 수 있습니다.@required(디폴트) 및@optional다음 메서드 선언이 프로토콜에 부합하도록 구현되어야 하는지 또는 구현될 수 있는지 여부를 전환하기 위한 키워드입니다.(옵션 프로토콜 방법을 설명하는 Apple의 Objective-C 2.0 Programming Language 가이드 섹션을 참조하십시오.)

옵션 프로토콜 메서드는 개발자에게 많은 유연성을 열어줍니다. 특히 위임자와 청취자를 구현하기 위해 더욱 그렇습니다.MouseInputAdapter와 같은 것을 확장하거나(Java도 단일 상속이기 때문에 귀찮을 수 있음) 많은 무의미하고 빈 메서드를 구현하는 대신 프로토콜을 채택하여 원하는 옵션 메서드만 구현할 수 있습니다.이 패턴에서는, 발신자는, 다음과 같이 메서드가 실장되어 있는지를 체크하고 나서(-respons To Selector 를 사용합니다).

if ([myObject respondsToSelector:@selector(fillArray:withObject:)]) {
    [myObject fillArray:anArray withObject:foo];
    ...
}

반사의 오버헤드가 문제가 되면 언제든지 부울 결과를 캐시하여 재사용할 수 있지만 너무 빨리 최적화하려는 충동을 억제할 수 있습니다. :-)

그들은 거의 같다.그러나 한 가지 눈에 띄는 점은 대상 C 프로토콜이 NSObject도 구현한다고 명시적으로 선언하지 않는 한 해당 프로토콜에 대한 참조는 NSObject가 선언하는 메서드에 액세스할 수 없다는 것입니다(컴파일러 경고 없이).java를 사용하면 인터페이스에 대한 참조를 얻을 수 있으며, 그 인터페이스 상의 toString() 등을 호출할 수 있습니다.

목표 C:

@protocol MyProtocol
// Protocol definition
@end

id <MyProtocol> myProtocol;

 [myProtocol retain] // Compiler warning

자바:

public interface MyInterface {
// interface definition
}

MyInterface myInterface;

myInterface.toString();  // Works fine.

목표 C(고정):

@protocol MyProtocol <NSObject>
// Protocol definition
@end

id <MyProtocol> myProtocol;

[myProtocol retain] // No Warning

언급URL : https://stackoverflow.com/questions/990360/differences-between-java-interfaces-and-objective-c-protocols

반응형