구문, 기능, 패러다임, 프레임 워크 및 라이브러리 측면에서 Objective-C와 C ++의 주요 차이점은 무엇입니까?
* 중요 : 저의 목표는 두 언어 간의 성능 전쟁을 시작하지 않는 것입니다. 나는 진짜 어려운 사실만을 원합니다. 사실, 내 질문은 성능과 관련이 없습니다! 주관적인 것처럼 보일 수있는 정보를 제공하십시오.
구문, 기능, 패러다임, 프레임 워크 및 라이브러리 측면에서 Objective-C와 C ++의 주요 차이점은 무엇입니까?
* 중요 : 저의 목표는 두 언어 간의 성능 전쟁을 시작하지 않는 것입니다. 나는 진짜 어려운 사실만을 원합니다. 사실, 내 질문은 성능과 관련이 없습니다! 주관적인 것처럼 보일 수있는 정보를 제공하십시오.
답변:
몇 가지 주요 차이점에 대한 간단한 목록 :
bool
, true
및 false
, 오브젝티브 C의 사용 BOOL
, YES
그리고 NO
.void*
and를 사용 하고 nullptr
Objective-C는 id
and을 선호합니다 nil
.SEL
)를 함수 포인터와 대략적으로 동일하게 사용합니다.nil
함수를 호출하려고하면 충돌하는 C ++과 달리 Objective-C는 행복하게 메시지를 보낼 수 있습니다.nullptr
self
수 있으며 클래스 초 기자 (생성자와 유사)가 원하는 경우 완전히 다른 클래스를 반환 할 수 있습니다. 클래스의 새 인스턴스를 생성하는 경우 (암시 적으로 스택에서 또는 명시 적으로 통해 new
) C ++ 와 달리 원래 지정한 유형이어야합니다.int foo (void)
그리고 int foo (int)
방법의 내재적 과부하를 정의 foo
하지만 오브젝티브 C는 명시적인 과부하를 필요로이를 달성 - (int) foo
하고 - (int) foo:(int) intParam
. 이는 Objective-C의 명명 된 매개 변수가 기능적으로 C ++의 이름 맹 글링과 동일하기 때문입니다.alloc
메시지로 명시 적으로 또는 적절한 팩토리 메소드로 암시 적으로).제 생각에는 아마도 가장 큰 차이점은 구문입니다. 어느 언어로든 본질적으로 동일한 것을 달성 할 수는 있지만 C ++ 구문은 더 간단하지만 Objective-C의 일부 기능은 동적 디스패치 덕분에 특정 작업 (예 : GUI 디자인)을 더 쉽게 만듭니다.
아마도 내가 놓친 다른 것들도 많이 생각할 것입니다. 다른 생각으로 업데이트 할 것입니다. 그 외에, LiraNuna가 지적한 가이드를 적극 추천 할 수 있습니다. 또한, 다른 관심 사이트는 this 일 수 있습니다 .
또한 나는 Objective-C를 배우기 시작하고 있으며 위의 많은 내용이 정확하지 않거나 완전하지 않을 수도 있음을 지적해야합니다.
편집 : 다음 의견에서 제기 된 사항을 해결하기 위해 업데이트되었으며 목록에 몇 가지 항목이 추가되었습니다.
void*
and NULL
만 사용 합니다. Obj-C에서 C 스타일 포인터를 사용할 수 있으며 많은 API 호출이 실제로 참조로 값을 전달하거나 반환합니다 NULL
. 이 경우 자주 사용됩니다.
둘 다 C에 뿌리를두고 있지만 완전히 다른 두 언어입니다.
주요 차이점은 Objective-C는 디스패치에 대한 런타임 결정에 초점을 맞추고 상속 및 다형성을 처리하기 위해 런타임 라이브러리에 크게 의존하는 반면 C ++에서는 주로 정적, 컴파일 시간, 결정에 중점을 둡니다.
라이브러리와 관련하여 두 언어 모두에서 일반 C 라이브러리를 사용할 수 있지만 기본 라이브러리는 완전히 다릅니다.
그러나 두 언어를 혼합하여 사용할 수 있다는 점이 흥미 롭습니다 (일부 제한 사항 있음). 결과는 Objective-C ++ 입니다.
다른 사람들이 말했듯이 Objective-C는 객체와 C ++의 상당히 정적 인 영역을 어떻게 생각하는지에 대해 훨씬 더 역동적입니다.
객체 지향 언어의 스몰 토크 계보에있는 Objective-C에는 Java, Python 및 기타 "표준"비 C ++ 객체 지향 언어와 매우 유사한 객체 개념이 있습니다. 많은 동적 디스패치, 운영자 과부하 없음, 메시지 보내기.
C ++는 그 자체의 이상한 동물입니다. 대부분 가계도의 스몰 토크 부분을 건너 뛰었습니다. 어떤면에서, 그것은 객체 지향 프로그래밍에 사용될 수있는 상속을 지원하는 좋은 모듈 시스템을 가지고 있습니다. 상황이 훨씬 정적 인 것입니다 (예를 들어, 재정의 가능한 메소드는 기본값이 아닙니다).
Objective-C는 C의보다 완벽한 수퍼 셋입니다. C 및 Objective-C에서 void*
구조체 포인터로의 암시 적 캐스팅 이 허용됩니다.
Foo* bar = malloc(sizeof(Foo));
void
포인터가 명시 적으로 캐스트 되지 않으면 C ++은 컴파일되지 않습니다 .
Foo* bar = (Foo*)malloc(sizeof(Foo));
일상적인 프로그래밍과의 관련성은 제로, 재미있는 사소한 사실입니다.
Foo* bar = reinterpret_cast< Foo* >(malloc(sizeof(Foo));
어쩌면 인플레 이스 생성자를 사용합니다 ..하지만 오늘의로서의 현대 C + +를 더처럼 auto bar = new Foo(constructorArg);
당신이 필요의 malloc을 해달라고하고, 하나 callic, 당신은 사용할 수 사실 std::vector::reserve
, 그리고std::vector::emplace_mack
Obj-C는 언어 자체에서 훨씬 더 역동적 인 기능을 가지고있는 반면, C ++은 일부 역동적 인 기능을 가진 컴파일 타임 기능에 더 집중되어 있습니다.
C ++ 파라 메트릭 다형성은 컴파일 타임에 확인되는 반면, Obj-C에서는 파라 메트릭 다형성은 동적 디스패치를 통해 이루어지며 컴파일 타임에는 확인되지 않습니다.
Obj-C는 본질적으로 매우 역동적입니다. 런타임 중에 클래스에 메소드를 추가 할 수 있습니다. 또한 런타임에 클래스를 볼 수있는 내성을 가지고 있습니다. C ++에서는 클래스의 정의를 변경할 수 없으며 컴파일시 모든 내부 검사를 수행해야합니다. Obj-C의 동적 특성은 함수 맵 (또는 이와 유사한 것)을 사용하여 C ++에서 달성 할 수 있지만 Obj-C보다 더 장황합니다.
C ++에는 컴파일 타임에 수행 할 수있는 훨씬 더 많은 검사가 있습니다. 예를 들어, 공용체와 같은 변형 유형을 사용하면 컴파일러에서 모든 사례를 쓰거나 처리하도록 할 수 있습니다. 따라서 문제가 발생한 경우를 처리하는 것을 잊지 마십시오. 그러나 이러한 모든 검사는 컴파일 할 때 가격이 책정됩니다. Obj-C는 C ++보다 컴파일 속도가 훨씬 빠릅니다.