[c] Objective-C를 배우기 전에 먼저 C를 배우십시오.

야심 찬 Apple 개발자이기 때문에 Objective-C로 이동하기 전에 먼저 C를 배우고 궁극적으로 Cocoa Framework를 배우는 것이 더 낫다면 커뮤니티의 의견을 듣고 싶습니다.

내 직감은 나에게 좋은 기초를 제공 할 C를 배우라고 말한다.



답변

나는 먼저 C를 배울 것입니다. Obj-C로 이동하기 전에 C를 배웠습니다 (C에서 많은 일을했습니다). 저는 진짜 C 프로그래머가 아니었던 동료들이 많았고, 그들은 Obj-C로 시작하여 필요한만큼의 C 만 배웠습니다.

때때로 나는 그들이 Obj-C에서 문제를 완전히 해결하는 방법을 봅니다. 때로는 매우 서투른 해결책을 가져옵니다. 일반적으로 일부 Obj-C 코드를 순수한 C 코드로 바꿉니다 (원하는만큼 혼합 할 수 있으며 Obj-C 메서드의 내용은 완전히 순수한 C 코드가 될 수 있습니다). Obj-C 프로그래머를 모욕 할 의도가없이 Obj-C에는 매우 우아한 솔루션이 있습니다. 이들은 객체 덕분에 훨씬 더 잘 작동하고 보이는 솔루션입니다.(OOP 프로그래밍은 복잡한 프로그램을 함수형 프로그래밍보다 훨씬 더 사랑스럽게 만들 수 있습니다. 예를 들어 다형성은 훌륭한 기능입니다.) … 그리고 저는 Obj-C를 정말 좋아합니다 (C ++보다 훨씬 더! C ++ 구문이 싫고 일부 언어 기능은 너무 과도합니다. 나쁜 개발 패턴 IMHO로 이어집니다. 그러나 때때로 동료의 Obj-C 코드를 다시 작성할 때 (그리고 이것이 절대적으로 필요하다고 생각하는 경우에만 그렇게합니다) 결과 코드는 일반적으로 50 % 더 작아지고 사용 된 메모리의 25 % 만 필요합니다. 런타임에 약 400 % 더 빠릅니다.

내가 여기서 말하려는 것 : 모든 언어에는 장단점이 있습니다. C에는 장단점이 있으며 Obj-C도 마찬가지입니다. 그러나 Obj-C의 정말 큰 기능은 (그래서 Java보다 더 좋아하는 이유입니다) 마음대로 일반 C로 건너 뛸 수 있다는 것입니다. 이것이 왜 그렇게 훌륭한 기능입니까? Obj-C가 순수 C의 많은 단점을 수정하는 것처럼 순수 C는 Obj-C의 단점 중 일부를 수정할 수 있습니다. 그것들을 함께 섞으면 매우 강력한 팀을 얻게 될 것입니다.

Obj-C 만 배우고 C에 대해 전혀 모르거나 기본 사항 만 알고 있고 일반적인 문제를 얼마나 우아하게 해결할 수 있는지 시도하지 않았다면 실제로 Obj-C의 절반 만 배웠습니다. C는 Obj-C의 기본 부분입니다. 언제 어디서나 C를 사용할 수있는 능력은 C의 기본 기능입니다.

일반적인 예는 base64로 데이터를 인코딩해야하는 일부 코드 였지만이를 위해 외부 라이브러리를 사용할 수 없었습니다 (OpenSSL lib 없음). 우리는 완전히 Cocoa 클래스를 사용하여 작성된 base64 인코더를 사용했습니다. 정상적으로 작동했지만 200MB의 이진 데이터를 인코딩 할 때 영원이 걸렸고 메모리 오버 헤드는 용납 할 수 없었습니다. 나는 완전히 하나의 C 함수로 작성된 작고 초소형 base64 인코더로 대체했습니다 (함수 본문을 메서드 본문에 복사하고 메서드는 NSData를 입력으로 사용하고 NSString을 출력으로 반환했지만 함수 내부에는 모든 것이 C였습니다). C 인코더는 훨씬 더 콤팩트하여 순수한 Cocoa 인코더보다 속도가 8 배나 높았으며 메모리 오버 헤드도 훨씬 적었습니다. 데이터 인코딩 / 디코딩, 비트와 유사한 저수준 작업은 C의 강점 일뿐입니다.

또 다른 예는 많은 그래프를 그린 UI 코드입니다. 그래프를 그리는 데 필요한 데이터를 저장하기 위해 NSArray를 사용했습니다. 그래프가 애니메이션 되었기 때문에 실제로 NSMutableArray입니다. 결과 : 그래프 애니메이션이 매우 느립니다. 우리는 모든 NSArray를 일반 C 배열, 구조체가있는 개체 (모든 그래프 좌표 정보가 개체에 있어야하는 것이 아님), 간단한 for 루프를 사용한 열거 자 액세스로 교체하고 하나의 배열에서 데이터를 가져 오는 대신 memcopy를 사용하여 배열간에 데이터를 이동하기 시작했습니다. 다른 하나는 색인을위한 색인입니다. 그 결과 4 배로 속도가 빨라졌습니다. 그래프는 구형 PPC 시스템에서도 부드럽게 움직입니다.

C의 약점은 모든 복잡한 프로그램이 장기적으로 추악해진다는 것입니다. C 응용 프로그램을 읽기 쉽고 확장 가능하며 관리하기 쉽게 유지하려면 프로그래머의 많은 규율이 필요합니다. 이 분야가 누락되어 많은 프로젝트가 실패합니다. Obj-C를 사용하면 클래스, 상속, 프로토콜 등을 사용하여 애플리케이션을 쉽게 구성 할 수 있습니다. 즉, 필요한 경우가 아니면 메서드의 경계를 넘어 순수한 C 기능을 사용하지 않을 것입니다. 객체의 메서드 내에서 Objective-C 앱의 모든 코드를 유지하는 것을 선호합니다. 다른 모든 것은 OO 응용 프로그램의 목적에 위배됩니다. 그러나 방법 내에서 나는 때때로 순수한 C를 독점적으로 사용합니다.


답변

C와 Objective-C를 동시에 충분히 배울 수 있습니다. Objective-C의 언어 추가를 시작하기 전에 그리고 초보 프로그래머로서 C의 세부 사항 (포인터 산술 등 포함)을 배울 필요가 없습니다. Objective-C를 빠르게 진행하면 “객체에 대한 생각”을 더 빨리 시작할 수 있습니다.

사용 가능한 리소스 측면에서 Apple의 문서는 일반적으로 C에 익숙하다고 가정하므로 The Objective-C 2.0 Programming Language로 시작하는 것은 큰 도움이되지 않습니다. 저는 Stephen Kochan의 Programming in Objective-C 사본에 투자 할 것입니다 (진행 속도에 따라 두 번째 버전을 기다리는 것을 고려할 수 있습니다).

프로그래밍 Objective-C 개발자 라이브러리
프로그래밍 Objective-C 2.0 개발자 라이브러리

사전 경험이 없다고 가정하고 Objective-C와 필요한만큼 C를 가르칩니다.

약간의 야심이 느껴진다면 Scott Stevenson의 “Learn C”Tutorial로 시작할 수 있지만 몇 가지 전제 조건이 있습니다 ( “함수, 변수 및 루프를 포함하여 적어도 하나의 스크립팅 또는 프로그래밍 언어를 이미 알고 있어야합니다. Mac OS X 터미널에 명령을 입력해야합니다. “).

(기록과 맥락을 위해서만 : 1991 년에 동시에 두 가지를 배웠습니다. 그것은 나에게 아무런 해를 끼치 지 않는 것 같았습니다.하지만 저는 BASIC, Pascal, Logo 및 LISP에 대한 배경 지식 을 가지고 있었습니다. )


답변

Objective-C에 대한 책을 쓰기 전에이 문제에 대해 많이 생각했습니다. 첫째, 저는 Objective-C를 배우기 전에 C 언어를 배우는 것이 잘못된 길이라고 정말로 믿습니다. C는 절차 적Objective-C에서 프로그래밍하는 데 필요하지 않은 많은 기능을 포함하는 언어, 특히 초보자 수준. 사실, 이러한 기능 중 일부에 의존하는 것은 좋은 객체 지향 프로그래밍 방법론을 고수하는 수준에 위배됩니다. 객체 지향 언어를 배우기 전에 절차 적 언어의 모든 세부 사항을 가르치는 것도 좋은 생각이 아닙니다 (그리고 함수와 구조화 된 프로그래밍 기술로 문제의 해결책을 공격하는 것). 이것은 프로그래머를 잘못된 방향으로 시작하여 좋은 객체 지향 프로그래밍 원칙을 육성하기 위해 잘못된 방향과 사고 방식을 개발할 수 있습니다. Objective-C가 C 언어의 확장이라고해서 먼저 C를 배워야하는 것은 아닙니다!

Objective-C와 기본 C 언어를 단일 통합 언어로 가르치는 것이 올바른 접근 방식이라고 생각합니다. “for”문이 상위 집합 Objective-C 언어가 아니라 C 언어에서 온다는 것을 배울 이유가 없습니다. 또한 C 배열 및 문자열과 같은 것에 대해 자세히 배우는 이유는 무엇입니까? 전에예를 들어 배열 (NSArray) 및 문자열 객체 (NSString)에 대해 배우고 있습니까? 많은 C 텍스트는 구조에 많은 시간을 할애하고 구조에 대한 포인터는 포인터로 배열을 반복합니다. 그러나 이러한 C 언어 기능에 대해 알지 못해도 Objective-C 프로그램 작성을 시작할 수 있습니다. 초보 프로그래머에게는 큰 문제입니다. 이는 학습 곡선을 단축 할뿐만 아니라 Objective-C 프로그램을 작성하기 위해 학습해야하는 자료의 양 (및 일부는 선택적으로 필터링 됨)을 줄입니다.

나는 당신이 기본 C 기능을 전부는 아니더라도 대부분 배우기를 원할 것이라는 데 동의하지만, 클래스와 메서드를 정의하고, 객체와 메시지 표현을 사용하고, 상속 개념을 이해할 때까지 많은 것을 연기 할 수 있습니다. 다형성은 잘 알려져 있습니다.


답변

저는 Objective C로 바로 뛰어 들었습니다. 이미 몇 가지 언어를 사용하고 있다면 학습 곡선 인 구문이 아니라 Cocoa입니다.


답변

대부분의 경우 C를 배우는 것은 어떤 분야에 있든 상관없이 최소한 사전 패키지 제품을 사용하기 전에 소프트웨어 개발의 내부 작동 방식을 파악하는 데 좋은 생각이라고 생각합니다. 당신은 내면의 작용을 더 잘 이해할 수 있습니다. SO에 대한 많은 토론이 있으며 다소 주관적인 질문이지만 일반적으로 Objective-C 코드 내에서 본질적으로 C를 사용하므로 실제로는 당신에게 달려 있다고 생각합니다. 나는 기초적인 사람이지만 때로는 방해가 될 수 있으며 위에서 아래로 자신의 방식으로 일한 여러 똑똑한 사람들을 알고 있습니다. 중요한 부분은 내부 작동을 이해하는 것입니다. 당신의 능력을 향상시키지 않는 사람들과 당신의 능력을 차별화하십시오.


답변

C의 엄격한 상위 집합 인 Objective-C를 배우기 전에 C를 배우는 것이 좋습니다. 이것은 Objective-C가 모든 일반 C 코드를 지원할 수 있다는 것을 의미하므로 C 프로그램에 공통적 인 코드가 Objective-에서도 나타날 수 있습니다. C 코드.

순전히 언어 관점에서 보는 것 외에도 Mac OS X는 완전한 Unix 운영 체제라는 것을 알게 될 것입니다. 모든 시스템 레벨 라이브러리는 C로 작성됩니다.

두 가지를 동시에 배울 수도 있지만, 먼저 C에 대한 확실한 실무 지식이 있으면 Objective-C를 더 이해하고 이해하게 될 것이라고 생각합니다.


답변

Objective-C를 배우고 필요한만큼 C를 배우겠습니다.

많이 의존하지 않을 C 영역 :

  • 포인터 산술 및 배열. 나는 C 배열을 전혀 사용하지 않았습니다.
  • C 문자열. Objective-C의 문자열은 작업을 더 멋지고 안전하게 수행합니다.
  • Obj-C 2.1에서 GC를 사용하는 경우 수동 메모리 관리. 개발 속도와 성능상의 이유로이 경로를 적극 권장합니다.