안녕하세요. <div>달빛연구자 입니다. <div><br></div> <div>프로그래밍 언어에는 굉장히 많은 종류가 있어요.</div></div> <div><br></div> <div><div style="text-align:left;"><img style="border-top:medium none;border-right:medium none;border-bottom:medium none;border-left:medium none;" alt="순위.jpg" src="http://thimg.todayhumor.co.kr/upfile/201408/1407406407ek6bij2HGaqrJpTVFdjWUAKdjb7kzE.jpg" width="771" height="538"></div></div> <div><br></div> <div>위의 표는 <a target="_blank" href="http://www.tiobe.com/">http://www.tiobe.com/</a> 에서 매월 발표하는 프로그래밍 언어의 사용 순위 입니다.</div> <div>올해는 오브젝티브 C의 순위가 크게 올라서 <strike>아이폰의 위력</strike> C++을 제치고 3위에 올랐네요.</div> <div><br></div> <div>2위인 자바는 불과 몇년전 까지만 해도 부동의 1위였지만, 자바와 거의 완전히 비슷한 포지션을 갖는 C#의 등장할 때 잠깐 주춤하더니 파이썬을 선두로 하는 동적 스크립트 언어들이 치고 올라오면서 점점 점유율이 떨어지는 모습을 보이고 있습니다. (근데 우리나라에서는 압도적인 1위일지도 몰라요)</div> <div><br></div> <div>마지막으로 1위인 C언어 입니다. C언어가 점유율 1위라는 사실이 의외이실 거예요.</div> <div>사실 응용프로그램을 제작할 때 C를 사용해서 제작하는 경우는 거의 없거든요. </div> <div>성능이 덜 중요한 프로젝트에는 자바가 들어가고요. 성능이 상당히 중요한 프로그램의 경우에는 C++이 들어가는 경우가 대부분입니다.</div> <div>이유는 문법적으로 객체지향을 지원하는 위의 프로그램들이 상대적으로 높은 개발 생산성을 갖는다고 알려져 있기 때문이에요. (사실이기도 하고요.)</div> <div><br></div> <div>그래서 C언어를 구시대의 유물이나 곧 사라지게 될 언어로 취급하시는 프로그래머 분들도 상당히 많은 편이에요.</div> <div><br></div> <div>그러면 왜 C언어가 1위인가... 저거 빼고 나머지를 C언어가 싹 쓸어먹어서 그래요 -_-;;</div> <div>OS가 부실하거나 없는 환경에서 동작하는 프로그램은 현재 C언어 보다 좋은 대안이 없거든요..</div> <div>문법이 단순하기 때문에 컴파일러 만들기가 상대적으로 용이해서 상용으로 나오는 대부분의 칩들은 C언어 컴파일러를 제공해요.</div> <div><br></div> <div><br></div> <div>자 이제 소개는 이쯤 하고 본론으로 들어가 볼께요.</div> <div><br></div> <div><b>1. 성능</b></div> <div><b> </b>이론적으로 C언어와 JAVA로 만들어진 <b>프로그램의 성능을 비교하면, C언어 프로그램의 성능이 압도</b>적으로 높아요.</div> <div>그럴 수 밖에 없는것이 C언어는 컴파일 과정에서 높은 수준의 최적화를 거치는데다, 만들어진 파일은 별도의 가공이 필요없이 곧바로 실행을 해요.</div> <div>하지만 자바의 경우 VM에 의한 해독과정이 한단계 더 필요하기 때문에 같은 동작을 수행하더라도 최소한 2배 이상의 연산을 소요해요.</div> <div>(사실은 그 이상의 연산을 소요합니다. )</div> <div><span style="font-size:9pt;line-height:1.5;">이러한 문제점은 자바가 처음 등장했을 때 부터 쭉 제기되어 온 문제였고, 실제 필드에서도 성능에 대한 문제점이 상당히 많이 나왔다고 해요.</span></div> <div>물론 자바의 개발자들도 이러한 문제점을 잘 알고 있었기 때문에, <strike>더 높은 성능의 머신을 사라고</strike> 가상머신의 성능을 개선하기 위해 어마어마한 노력을 기울였고, 현재는 자바도 상당히 빨라져서 대부분의 경우에는 문제없는 성능을 보여준다고 알려져 있습니다.</div> <div>JIT(Just in time) 때문에 자바프로그램이 C보다 더 빠른 성능을 나타낸다는 주장과 벤치마킹도 자주 보게되는데요.(이론적으로는 빠를 수도 있어요...;;;)</div> <div>JIT에 의해 컴파일 언어보다 높은 성능을 낼 수 있는 조건이 상당히 제한적이기 때문에, 잘 인정을 받지 못하는 듯 하네요..(예외일 뿐이죠..)</div> <div><br></div> <div><b>2. 이식성</b></div> <div><b>이식성은 어떤 한 플랫폼에서 작성된 프로그램이 다른 플랫폼에서 잘 동작을 할 수 있는지를 의미</b> 하는데요.</div> <div>C와 JAVA에서 말하는 이식성은 그 의미가 조금 다릅니다.</div> <div>C에서의 이식성은 <b>크로스 컴파일을 하면, 다른 플랫폼에서 동작할 수 있다는 의미</b>이고요.</div> <div>JAVA에서의 이식성은 <b>한번 컴파일을 해 놓으면 VM이 돌아가고 있는 어떤 플랫폼에서도 동작이 가능하다는 의미</b>에요.</div> <div>C언어로 짜여져 소스가 공개되어 있는 리눅스 커널의 경우 현존하는 대부분의 칩이 포팅되어 있고요. 수 많은 종류의 플랫폼에서 현재도 문제없이 돌아가고 있습니다. 또한 문<b>법이 단순하여 컴파일러의 제작이 매우 쉽기 때문에 C언어 컴파일러를 제공하지 않는 칩이 거의 없을 정도</b>에요.</div> <div>이것은 로우레벨 개발자의 입장에서 매우 대단한 의미를 갖습니다.</div> <div><br></div> <div>JAVA로 짜여진 안드로이드 앱은 우리가 안드로이드 마켓에서 컴파일된 프로그램을 다운받으면 곧바로 동작이 가능합니다.</div> <div>마켓에서 다운받은 앱이 실행되는게 이식성과 무슨 관련이 있냐면요.. </div> <div>원래는<span style="font-size:9pt;line-height:1.5;"> <b>컴파일된 프로그램을 다운받으면 곧바로 동작이</b></span><span style="font-size:9pt;line-height:1.5;"><b> 불가능</b>하거든요. PC는 cpu가 모조리 x86으로 통일되어 있기 때문에 문제가 없지만, 다양한 종류의 cpu가 들어가는 모바일에서는 각각의 cpu에 맞게 컴파일된 프로그램만 동작이 가능해요. </span></div> <div><span style="font-size:9pt;line-height:1.5;"><b>프로그램은 기계어로 만들어져 있는데 각 cpu마다 쓰는 기계어가 각각 다르거든요.</b>ㅋ</span></div> <div>안드로이드가 자바 가상머신인 달빅을 가지고 있기 때문에, 다양한 종류의 스마트 폰에서 동작하는 앱을 만들어 배포할 수 있는것이죠.</div> <div>이것은 하이레벨 개발자의 입장에서 매우 대단한 의미를 갖습니다.</div> <div><br></div> <div><b>3. 생산성</b></div> <div> <b>생산성은 같은 기능을 하는 프로그램을 작성하는데에 개발자가 얼마나 적은 노력을 들일 수 있는가</b> 를 의미해요.</div> <div> <b>응용프로그램의 개발을 할 때의 생산성은 JAVA가 C를 압도</b>합니다. 비교조차 되지 않을 정도에요.(응용프로그램에는 앱/웹을 포함합니다.)</div> <div> 다만 C에 매우 숙련된 전문가들이 팀을 이루어 작업을 하는 경우에는 상당히 높은 생산성이 나오는 경우가 있습니다. (이것도 예외적인 경우에요)</div> <div><br></div> <div><b>4. 학습 용이성</b></div> <div>일반적으로 (주로 학생들에게..) JAVA는 배우기 쉽고 C는 배우기 어렵다는 이야기가 정설처럼 받아들여지고 있는데요.</div> <div>이 부분은 조금 생각을 해 볼 필요가 있습니다.</div> <div><span style="font-size:9pt;line-height:1.5;"><br></span></div> <div><span style="font-size:9pt;line-height:1.5;">일단 </span><b style="font-size:9pt;line-height:1.5;">기본</b><span style="font-size:9pt;line-height:1.5;"> </span><b style="font-size:9pt;line-height:1.5;">문법 자체는 C언어가 더 간단</b><span style="font-size:9pt;line-height:1.5;">해요. 변수, 배열, 함수, 반복, 조건, 구조체 까지 배우면 마스터거든요;;;</span></div> <div>자바는 C언어에 있는 문법 + 객체지향 문법(?)이 추가 됩니다. (상속, 포함, 추상클레스, 가상함수, 권한, 생성/소멸자 등등..)</div> <div><br></div> <div>일반적으로 C에 입문한 사람들은 대부분 포인터에서 포기를 합니다. 사실 C가 어렵다는 이야기는 포인터가 어렵다는 이야기랑 같아요.</div> <div>책을 보면 금방 드러나지만, 사실 포인터 자체는 그리 복잡한 문법이 아니에요. </div> <div>그냥 그것을 응용하기 위해 <b>컴퓨터 구조와 운영체제 (특히 메모리)에 대한 전반적인 이해가 필요할 뿐</b>이죠. </div> <div>그냥 인간과는 다른 방식의 사고방식에 익숙해지기가 어려울 뿐 입니다.</div> <div>대신에 문법적으로 설계 방식에 제한을 두지 않기 때문에 신경써서 코드를 짜지 않으면 소스가 엉키기가 쉽습니다.</div> <div>그래서 C에 익숙한 개발자들은 <b>스스로 객체지향적인 규칙을 준수하여 개발</b>을 하는 경우가 많아요. (그리고 이것을 체득하는데에도 오랜 시간이 걸립니다.) </div> <div><br></div> <div>반면에 JAVA의 경우는 저런 하드웨어에 가까운 부분은 덜 신경 써도 되요. 그래서 소스코드도 비교적 인간의 사고방식에 가까운 형태를 갖습니다.</div> <div>그래서 처음 입문하는 사람들이 배우기가 무척 쉬워요. 그런데 뒤로 갈 수록 점점.. 어려워 집니다. -_-;;</div> <div>이유는 바로 <b>JAVA가 객체지향 언어이기 때문</b>이에요. - 객체지향이니까 더 배우기 쉬운거 아니냐고요? 천만에 말씀입니다.</div> <div><br></div> <div>본래 <b>객체지향은 배우기 어렵고 사용하기 까다로운 고급 설계방식</b> 이에요. 왜 그렇냐면 객체지향은 그 이론자체가 상당히 방대하고 이해하기 까다로운 개념들을 상당히 많이 포함하고 있는데다 초기에 노력을 더 투자해서 클래스들을 라이브러리화 해 놓고 라이브러리화 된 클레스들로부터 시너지 효과를 받아 나가는 <span style="font-size:9pt;line-height:1.5;">대기만성형의 설계방식이기 때문이에요. 즉 객체지향 설계방식이 생산성의 이득을 보기 위해서는 본래 </span><span style="font-size:9pt;line-height:1.5;">라이브러리화 된 클래스들을 쌓아나가는 과정이 필요하고, 이 부분이 객체지향에서 가장 어렵고 중요한 부분이라고 할 수 있어요. 이 부분을 망치면 생산성 전체를 망치기 때문이죠.</span></div> <div><span style="font-size:9pt;line-height:1.5;"><br></span></div> <div><span style="font-size:9pt;line-height:1.5;">이런 이유로 </span><span style="font-size:9pt;line-height:1.5;">대부분의</span><span style="font-size:9pt;line-height:1.5;"> 객체지향 언어에서는 매우 풍부한 클래스 라이브러리와 클레스 설계 도구들을 제공해요. (C++만 빼고요 -_-) </span><span style="font-size:9pt;line-height:1.5;">객체지향 방식에 대한 개발자들의 진입장벽을 낮추고 잘못된 설계로 인한 생산성 하락을 막기 위해서요. </span></div> <div>어지간한 <b>기능들은 이미 클래스로 캡슐화된 라이브러리로 제공</b>되기 때문에, 자바에 처음 입문하는 사람들은 마치 제공되는 기능만 잘 찾아써도 원하는 프로그램을 작성할 수 있는 것이고 <b>그래서 JAVA를 더 쉬운 언어로 느끼는 것</b>이죠.</div> <div>그러나 프로그램의 규모가 커지면, 다시 생산성이 설계에 영향을 받기 시작을 합니다. JAVA를 사용했음에도 불구하고 생산성이 뒤로 갈 수록 떨어지는 경우가 있다면 이러한 설계가 잘못된 것으로 볼 수 있어요.</div> <div>거기에다 JAVA는 GC와 VM의 구조와 동작도 숙지해야 합니다. 여기에 엉켜서 프로그램이 이상동작을 일으키는 경우가 생각보다 적지 않으니까요.</div> <div><br></div> <div>결국 두 언어 모두 배워야 할 스코프가 조금 다를 뿐 깊숙히 들어가면, 매우 방대한 양의 지식과 오랜 시간의 연습과 경험을 필요로 합니다.</div> <div>부딧치는 장벽이 학습 초반에 존재하느냐 후반에 존재하느냐 정도의 차이일 뿐 이에요...<span class="Apple-tab-span" style="white-space:pre;"> </span></div> <div><br></div> <div><b>한줄 요약 : 그러니까 언어 가지고 싸우지 좀 맙시다. -_-</b></div>