답변:
나는 먼저 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 기능을 전부는 아니더라도 대부분 배우기를 원할 것이라는 데 동의하지만, 클래스와 메서드를 정의하고, 객체와 메시지 표현을 사용하고, 상속 개념을 이해할 때까지 많은 것을 연기 할 수 있습니다. 다형성은 잘 알려져 있습니다.
대부분의 경우 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 영역 :
Objective-C와 Cocoa를 배우면서 C의 비트를 배우는 것을 피할 수 없습니다. 예를 들어 직사각형은 C 구조체 인 CGRect로 일반적으로 표현됩니다.
시간이 있으면 꼭 C를 배우십시오. 다른 사람들이 여기에서 말했듯이 Kochan의 책 (두 번째 및 초판)은 뛰어 들기 좋은 책입니다.
Objective-C에 익숙하지 않기 때문에 더 잘 모르겠습니다.
그러나 C의 기초는 배우기가 그렇게 어렵지 않고 매우 복잡한 언어도 아닙니다 (통화 측면에서 마스터 링 측면이 아닙니다!). 그러니 시간을 낭비하지 않을 것입니다.
개인적으로 저는 항상 C를 배우는 것이 좋은 생각이라고 생각합니다. 그것은 컴퓨터가 어떻게 작동하는지에 대한 좋은 통찰력을줍니다. 결국 대부분의 언어와 시스템은 여전히 C로 작성되어 있습니다. :-)
추신 : "이동"이란 "그만두는 것"이 아니라 "더 배우고, 다른 것을 배우는 것"을 의미했습니다. C를 알게되면 절대로 버리지 않을 수 있습니다. Java는 JNI를 사용하여 저수준 항목에 대한 C 루틴을 호출하고 Python, Lua 등은 종종 C 코드로 확장됩니다 (Lua 참조는 일부 함수에 대해 C 지식이 있다고 가정합니다. 뒤에 C 함수에 대한 얇은 래퍼) 등이 있습니다.
하드 코어 개발자가되고 싶습니까? 그런 다음 먼저 c를 배웁니다.
c를 완전히 마스터하는 데 필요한 책은 기술 분야에서 최고의 저술 중 일부입니다. 필요한 것은 다음과 같습니다.
목표 C는 C를 먼저 학습 할 가치가 없다는 점에서 C와 충분히 다릅니다.
구문 / 언어 계열 관점에서 보면 SmallTalk를 공부하는 것이 거의 낫습니다 (목표 C가 기반으로 함)
실용적인 관점에서 한 번에 하나의 언어를 배우는 데 노력을 집중하십시오.
나중에 다른 언어를 배우고 싶다면 C ++, Java 및 Python은 1) 한 무리로 배우기 쉽습니다. 2) 인기 있고 따라서 시장성이 있습니다. 3) 강력합니다.
Objective_C를 시작하기 전에 C에 대한 기본 지식이 있어야하지만 C의 모든 세부 사항을 마스터 할 필요는 없습니다.
다른 사람에게 도움이 될 수 있도록 "Objective-C 프로그래밍"을 읽은 후 노트를 게시했습니다.
이미 알고있는 많은 언어에 따라 Objective-C 학습을 시작하는 것이 더 나은 생각 일 수 있습니다. 대부분의 언어의 기초는 기본적으로 동일하며 구문이 다릅니다. C를 먼저 배우는 것은 Objective-C를 배우는 데있어 큰 차이를 만들지 않습니다.
Objective-C를 곧바로 배웠고 이제 약 1 년 동안 잘 작동했습니다. 어떻게 작동하는지 확인하기 위해 프로젝트를 다운로드 할 때 C 코드를 읽는 데 약간의 어려움이 있었지만 이제는 C를 배울 필요가 있다고 느낍니다. C가없는 ObjC이지만 조만간 C가 필요합니다.
IMHO는 먼저 적어도 C, 특히 포인터에 대해 배워야합니다. 포인터가없는 언어에서 온다면 훨씬 더 중요합니다. 많은 사람들이 다음과 같은 코드에 대해 묻습니다.
NSString *string = [[NSString alloc] init];
string = @"something";
그들은 포인터와 그것이 가리키는 객체 사이의 구별에 대해 알지 못하기 때문입니다.
물론 Objective-C로 시작하기 전에 C를 모두 배울 필요는 없지만 몇 가지 기본 사항이 절대적으로 필요합니다.
젠장, 목표 C로 바로 가십시오!
저는 ActionScript 3에서 Objective C로 옮겼고 이미 회사에 인턴이 있습니다!
원하는 것을하십시오.
이전에 다른 언어를 배우면 올바른 구문을 작성하는 데 항상 혼란 스러울 것입니다. 목적은 모르지만 Object C는 객체 메서드를 호출하는 데 이상한 (일반적이지 않은) 구문을 사용합니다. 메시지를 보내는 것으로 이름을 지정합니다. 예, 그에 따라 순수한 객체 지향 개념이 사실이지만 대부분의 객체 지향 언어는이를 호출 메서드로 명명하고 메서드를 호출하는 더 전통적인 구문을 사용합니다. 가비지 수집도 매우 이상합니다. Object C는 구식 참조 횟수를 기반으로합니다. 따라서 다른 언어에서 전환하면 받아들이 기 어려울 것입니다. 저는 C / C ++ 프로그래머를위한 책 Object C 빠른 마이그레이션 가이드를 작성하고 있습니다.