Objective-C와 C ++의 차이점은 무엇입니까? [닫은]


171

구문, 기능, 패러다임, 프레임 워크 및 라이브러리 측면에서 Objective-C와 C ++의 주요 차이점은 무엇입니까?

* 중요 : 저의 목표는 두 언어 간의 성능 전쟁을 시작하지 않는 것입니다. 나는 진짜 어려운 사실만을 원합니다. 사실, 내 질문은 성능과 관련이 없습니다! 주관적인 것처럼 보일 수있는 정보를 제공하십시오.


2
이 가이드 는 내가 본 최고의 비교를 제공합니다.
LiraNuna

@Oskar Kjellin : Mac과 LiraNuna의 답변은 모두 훌륭한 답변입니다. 둘 다 서로 대답을 보완하기 때문에 어느 것이 가장 좋은지 객관적으로 결정할 수는 없습니다.
Alerty

@Alerty 잘 알고 있습니다 (자신이 자주 넘어집니다). 아마도 최고를 대답으로 표시하면 결정 할 수 없을 때 내가하는 일입니다. 나는 그들이 :( 때 대답으로 표시되지 않은 질문이있을 때 좋아하지 않는다
오스카 Kjellin

1
첫 번째 및 그 반대의 경우에 두 번째 답변으로 연결하십시오
Lee Taylor

답변:


185

몇 가지 주요 차이점에 대한 간단한 목록 :

  • C ++은 다중 상속을 허용하지만 Objective-C는 허용하지 않습니다.
  • C ++과 달리 Objective-C는 메소드 매개 변수의 이름을 지정할 수 있으며 메소드 서명에는 매개 변수의 이름과 유형 및 리턴 유형 만 포함됩니다 (아래의 범프 및 척의 주석 참조). 이에 비해 C ++ 멤버 함수 시그니처에는 함수 이름과 매개 변수 / 반환 유형 (이름없이)이 포함됩니다.
  • C ++ 사용 bool, truefalse, 오브젝티브 C의 사용 BOOL, YES그리고 NO.
  • C ++은 void*and를 사용 하고 nullptrObjective-C는 idand을 선호합니다 nil.
  • Objective-C는 "선택기"(유형이 있음 SEL)를 함수 포인터와 대략적으로 동일하게 사용합니다.
  • Objective-C는 메소드 / 선택기를 통해 오브젝트에 "메시지"를 보낼 수있는 메시징 패러다임 (la Smalltalk)을 사용합니다.
  • 오브젝티브 nil함수를 호출하려고하면 충돌하는 C ++과 달리 Objective-C는 행복하게 메시지를 보낼 수 있습니다.nullptr
  • Objective-C는 동적 디스패치를 ​​허용하므로 메소드를 호출하는 객체를 컴파일 할 때 C ++과 달리 런타임에 메시지에 응답하는 클래스를 결정할 수 있습니다 (아래의 wilhelmtell의 의견 참조). 이것은 이전 지점과 관련이 있습니다.
  • Objective-C는 "속성"을 사용하여 멤버 변수에 대한 접근 자의 자동 생성을 허용합니다.
  • Objective-C는에 할당 할 self수 있으며 클래스 초 기자 (생성자와 유사)가 원하는 경우 완전히 다른 클래스를 반환 할 수 있습니다. 클래스의 새 인스턴스를 생성하는 경우 (암시 적으로 스택에서 또는 명시 적으로 통해 new) C ++ 와 달리 원래 지정한 유형이어야합니다.
  • 마찬가지로 Objective-C에서 다른 클래스는 메소드 호출을 가로 채기 위해 런타임에 대상 클래스를 동적으로 변경할 수도 있습니다.
  • Objective-C에는 C ++의 네임 스페이스 기능이 없습니다.
  • Objective-C에는 C ++ 참조와 동등한 기능이 없습니다.
  • Objective-C에는 템플릿이 없으므로 대신 컨테이너에 약한 타이핑을 허용하는 것이 좋습니다 (예 :).
  • Objective-C에서는 암시 적 메서드 오버로드를 허용하지 않지만 C ++에서는 허용합니다. 즉, C ++에서, int foo (void)그리고 int foo (int)방법의 내재적 과부하를 정의 foo하지만 오브젝티브 C는 명시적인 과부하를 필요로이를 달성 - (int) foo하고 - (int) foo:(int) intParam. 이는 Objective-C의 명명 된 매개 변수가 기능적으로 C ++의 이름 맹 글링과 동일하기 때문입니다.
  • Objective-C는 일반적으로 적합 할 C ++과 달리 메소드와 변수가 동일한 이름을 공유 할 수있게합니다. 나는 이것이 함수 포인터 대신 선택기를 사용하여 Objective-C와 관련이 있다고 생각하므로 메서드 이름에는 실제로 "값"이 없습니다.
  • Objective-C에서는 스택에 객체를 만들 수 없습니다. 모든 객체를 힙에서 할당해야합니다 ( alloc메시지로 명시 적으로 또는 적절한 팩토리 메소드로 암시 적으로).
  • C ++과 마찬가지로 Objective-C에는 구조체와 클래스가 모두 있습니다. 그러나 C ++에서는 거의 동일하게 취급되는 Objective-C에서는 다르게 다르게 취급 됩니다. 예를 들어 스택에 구조체를 만들 있습니다.

제 생각에는 아마도 가장 큰 차이점은 구문입니다. 어느 언어로든 본질적으로 동일한 것을 달성 할 수는 있지만 C ++ 구문은 더 간단하지만 Objective-C의 일부 기능은 동적 디스패치 덕분에 특정 작업 (예 : GUI 디자인)을 더 쉽게 만듭니다.

아마도 내가 놓친 다른 것들도 많이 생각할 것입니다. 다른 생각으로 업데이트 할 것입니다. 그 외에, LiraNuna가 지적한 가이드를 적극 추천 할 수 있습니다. 또한, 다른 관심 사이트는 this 일 수 있습니다 .

또한 나는 Objective-C를 배우기 시작하고 있으며 위의 많은 내용이 정확하지 않거나 완전하지 않을 수도 있음을 지적해야합니다.

편집 : 다음 의견에서 제기 된 사항을 해결하기 위해 업데이트되었으며 목록에 몇 가지 항목이 추가되었습니다.


8
괜찮은 목록; 하나의 수정. "이름이 지정된 매개 변수"가 아니라 "인터리브 된 매개 변수"입니다. 명명 된 "키워드 인수"는 메소드 이름의 일부 서브 세트가 생략 될 수 있다는 생각을 혼란스럽게합니다. 그럴 순 없어.
bbum

7
가장 중요한 차이점을 파악하는 것을 잊었습니다. Object-C는 동적 디스패치를 ​​사용하고 C ++은 정적 디스패치를 ​​사용합니다. 다시 말해 Objective-C 컴파일러에 의해 컴파일 된 코드는 런타임에 결정된 메시지에 응답하는 클래스를 갖습니다. C ++ 컴파일러가 컴파일 한 코드에는이 정보가 컴파일 타임에 계산되어 컴파일됩니다.
wilhelmtell

9
@wilhelmtell : C ++ 컴파일러는 컴파일 할 때 수퍼 클래스 만 알고 있습니다. 런타임에 실제 클래스는 모든 자손 일 수 있습니다. 이것은 동적 디스패치의 형태이지만 목표 C에서 사용 된 것과 같은 형태는 아닙니다. 기술 용어에주의하십시오!
노먼 램지

5
+1 좋은 목록. 그러나 Objective-C는 객체뿐만 아니라 void*and NULL만 사용 합니다. Obj-C에서 C 스타일 포인터를 사용할 수 있으며 많은 API 호출이 실제로 참조로 값을 전달하거나 반환합니다 NULL. 이 경우 자주 사용됩니다.
Quinn Taylor

3
@wilhelmtell-objective-C에 대해서는 아무것도 모르지만 C ++에서는 동적으로 다른 클래스가 함수 호출에 응답 할 수 있지만 기본 클래스에 대한 포인터 배열과 같은 클래스가 있어야합니다. 그것은 "매달려"있습니다. 모든 클래스에는 하위 클래스가 필요하지만 메서드 호출은 런타임에 클래스에 따라 다른 메서드를 호출합니다.
Kevin Anderson

33

둘 다 C에 뿌리를두고 있지만 완전히 다른 두 언어입니다.

주요 차이점은 Objective-C는 디스패치에 대한 런타임 결정에 초점을 맞추고 상속 및 다형성을 처리하기 위해 런타임 라이브러리에 크게 의존하는 반면 C ++에서는 주로 정적, 컴파일 시간, 결정에 중점을 둡니다.

라이브러리와 관련하여 두 언어 모두에서 일반 C 라이브러리를 사용할 수 있지만 기본 라이브러리는 완전히 다릅니다.

그러나 두 언어를 혼합하여 사용할 수 있다는 점이 흥미 롭습니다 (일부 제한 사항 있음). 결과는 Objective-C ++ 입니다.


업데이트 된 링크 : Objective-C ++
IcyIcicle

6

그들은 완전히 다릅니다. Objective C는 C ++보다 Smalltalk와 더 공통적입니다 (구문을 제외하고는 실제로).


6

내 머리 꼭대기에서 :

  1. 스타일-Obj-C는 동적이며 C ++는 일반적으로 정적입니다
  2. 둘 다 OOP이지만 솔루션이 다를 것이라고 확신합니다.
  3. 다른 객체 모델 (C ++은 컴파일 타임 유형 시스템에 의해 제한됨)

저에게 가장 큰 차이점은 모델 시스템입니다. Obj-C를 사용하면 메시징 및 내부 검사를 수행 할 수 있지만 C ++에는 강력한 템플릿이 있습니다.

각각의 장점이 있습니다.


5

다른 사람들이 말했듯이 Objective-C는 객체와 C ++의 상당히 정적 인 영역을 어떻게 생각하는지에 대해 훨씬 더 역동적입니다.

객체 지향 언어의 스몰 토크 계보에있는 Objective-C에는 Java, Python 및 기타 "표준"비 C ++ 객체 지향 언어와 매우 유사한 객체 개념이 있습니다. 많은 동적 디스패치, 운영자 과부하 없음, 메시지 보내기.

C ++는 그 자체의 이상한 동물입니다. 대부분 가계도의 스몰 토크 부분을 건너 뛰었습니다. 어떤면에서, 그것은 객체 지향 프로그래밍에 사용될 수있는 상속을 지원하는 좋은 모듈 시스템을 가지고 있습니다. 상황이 훨씬 정적 인 것입니다 (예를 들어, 재정의 가능한 메소드는 기본값이 아닙니다).


4

Objective-C는 C의보다 완벽한 수퍼 셋입니다. C 및 Objective-C에서 void*구조체 포인터로의 암시 적 캐스팅 이 허용됩니다.

Foo* bar = malloc(sizeof(Foo));

void포인터가 명시 적으로 캐스트 되지 않으면 C ++은 컴파일되지 않습니다 .

Foo* bar = (Foo*)malloc(sizeof(Foo));

일상적인 프로그래밍과의 관련성은 제로, 재미있는 사소한 사실입니다.


두 번째 예는 C ++ 코드가 아닙니다. C ++ 컴파일러로 컴파일하려고 할 때 오류가 발생한 것은 C 코드입니다. 당신은 원본에 가까운 된 C ++를 원한다면, 당신은 쓸 것 Foo* bar = reinterpret_cast< Foo* >(malloc(sizeof(Foo));어쩌면 인플레 이스 생성자를 사용합니다 ..하지만 오늘의로서의 현대 C + +를 더처럼 auto bar = new Foo(constructorArg);당신이 필요의 malloc을 해달라고하고, 하나 callic, 당신은 사용할 수 사실 std::vector::reserve, 그리고std::vector::emplace_mack
xakepp35

3

Obj-C는 언어 자체에서 훨씬 더 역동적 인 기능을 가지고있는 반면, C ++은 일부 역동적 인 기능을 가진 컴파일 타임 기능에 더 집중되어 있습니다.

C ++ 파라 메트릭 다형성은 컴파일 타임에 확인되는 반면, Obj-C에서는 파라 메트릭 다형성은 동적 디스패치를 ​​통해 이루어지며 컴파일 타임에는 확인되지 않습니다.

Obj-C는 본질적으로 매우 역동적입니다. 런타임 중에 클래스에 메소드를 추가 할 수 있습니다. 또한 런타임에 클래스를 볼 수있는 내성을 가지고 있습니다. C ++에서는 클래스의 정의를 변경할 수 없으며 컴파일시 모든 내부 검사를 수행해야합니다. Obj-C의 동적 특성은 함수 맵 (또는 이와 유사한 것)을 사용하여 C ++에서 달성 할 수 있지만 Obj-C보다 더 장황합니다.

C ++에는 컴파일 타임에 수행 할 수있는 훨씬 더 많은 검사가 있습니다. 예를 들어, 공용체와 같은 변형 유형을 사용하면 컴파일러에서 모든 사례를 쓰거나 처리하도록 할 수 있습니다. 따라서 문제가 발생한 경우를 처리하는 것을 잊지 마십시오. 그러나 이러한 모든 검사는 컴파일 할 때 가격이 책정됩니다. Obj-C는 C ++보다 컴파일 속도가 훨씬 빠릅니다.


3
가격에 대해 이야기하려면 공정하게하십시오! 반대로 Obj-C는 C ++보다 런타임에 동적 메서드 호출을 해결하는 데 훨씬 느립니다. 그리고 컴파일 속도는 런타임 속도에 비해 상대적으로 사소한 것이라고 주장합니다. Obj-C는보다 역동적 인 디스패치로 인해 많은 이점을 제공 할 것이라 확신하지만 거기에는 절충안이 있습니다.
underscore_d

1
사실, 런타임과 컴파일 시간 비용 사이에는 상충 관계가 있습니다. 그러나 컴파일 시간이 항상 사소한 것은 아닙니다. C ++ (예 : Boost.Spirit)에서 무거운 메타 프로그래밍 및 EDSL 라이브러리를 사용하면 런타임에 매우 빠른 코드를 생성하면서 컴파일 시간에 큰 영향을 줄 수 있습니다.
Paul Fultz II

1
물론, 나는 더 간단한 코드베이스의 POV에 비해 지나치게 단순화했다 ... 매우 복잡한 코드베이스로, 작은 변화를 테스트하기 위해 다시 컴파일하면 개발이 매우 지루할 수 있는데, 이는 사소한 일이 아니다. 그러나이 둘을 실제로 비교할 수있는 것입니까? C ++ 컴파일 타임 기능에 의존하는 이러한 라이브러리를 Objective-C에서 어떻게 재구성하고 더 빠르게 컴파일 할 수 있습니까? 즉, "Obj-C가 C ++보다 컴파일 속도가 훨씬 빠릅니다"라는 문구가 복제 가능한 속도 향상을 측정 할 수있는 동등한 코드베이스를 나타 냅니까? 그렇지 않으면 사과와 오렌지를 재배하는 데 걸리는 시간을 비교합니다.
underscore_d
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.