4397
2014-09-01 23:58:34
2
애초에 C++은 멀티패러다임 언어라 심도 있게 배우고, 잘 사용하기가 상당히 어려운 언어입니다.
C++14 버전에서는 제네릭 람다까지 지원하며 함수형 언어에 대해서도 거의 대부분의 패러다임을 지원하게 되었습니다.
(즉, C++OL도 곧 개정판이 곧 다시 나온단 소리...)
리누스 토발즈가 리눅스 커널 코어 개발에 있어서 C++을 배제하고 C만 고집하는 것도 C++과 같이 숙련이 어려운 언어로는 수십만명의 익명의 사용자들이 참여하는 오픈소스에서 코드 퀄리티를 유지 하기 어렵고, 그만큼 유지보수가 더 힘들어진다는 이유가 한 몫했습니다.
많은 패러다임을 흡수한 고급언어이기 때문에 오히려 유지보수성이 떨어진다는 게 아이러니죠.
또한 최근 C++창시자의 인터뷰에서 또한 C++은 장기간의 학습을 걸쳐 숙련된 사용자가 고성능을 필요로 하면서도 다양한 프로그래밍 패러다임을 적용할 필요가 있는 분야에서 활용하는 것을 목표로 하고 있다고 했습니다.
이쯤 되면 C와 C++은 라이브러리 인터페이스와 몇몇 문법만 공유하는 전혀 다른 언어라고 보아도 무방할 수준이 되었습니다.
사실 nanoscond~picosecond 이내에 응답을 보내야 하는 디바이스 드라이버에 대해서는 어차피 어셈블리로 코딩을 해야하는 부분이 생기니 극도의 퍼포먼스가 필요한 분야에서는 어셈블과 섞어쓸 수 있다는게 유일한 장점이고, 생산성 부분에서는 앞서 말했다시키 학습커브가 너무 커서 신규 사용자가 숙련되기 힘들고, 비숙련자가 작성한 코드의 퀄리티가 좋지 못한 점이 문제가 되죠.
사실 요즘은 어플리케이션 서버도 파이썬이나 루비같은 스크립트 언어로 작성하는 경우가 늘어 났고, 이런 언어들의 빠른 생산성을 기반으로 서비스를 빠르게 런칭 한 뒤(즉 적은 인건비로 런칭), 서비스가 성공하여 사용자 처리를 위해 극한의 튜닝이 필요할 경우에나 C++같은 언어를 사용해서 재작성하는 경우가 늘어났기 때문에 C++은 입지가 더 좁아지고 있습니다.
현재 C++의 신규사용처는 대부분 게임 엔진/서버 쪽인데, 게임 서버 또한 coroutine이나 yield등의 문맥양보를 통한 이벤트드리븐 코딩이 가능한 언어로 이동하고 있는 것으로 알고 있습니다.(국내 온라인 게임 개발사들은 C#을 많이 사용한다고 합니다.)
게임 엔진 또한 코어는 C++로 제작되지만 최근에는 대부분 스크립트만으로 게임을 작성할 수 있게 나오는 경우가 많아서, 마찬가지로 극한의 튜닝을 필요한 경우가 아니면 C++을 사용할 일이 적습니다.
결과적으로 C++의 점유율은 아직 높지만, 최근 5년간 추세를 보면 꾸준히 감소하고 있습니다.
사실 개인적으로도 좀더 배우기 쉽고 생산성이 높은 다른 언어들을 통해 다양한 프로그래밍 패러다임을 익히고 코딩 스킬을 충분히 단련한 다음에 C++에 진입하는 것이 좋다고 생각합니다.
마찬가지로 C 또한 운영체제를 만들기 위해 설계된 언어인 만큼 컴퓨터 구조와 시스템프로그래밍에 대한 이해를 어느정도 깔고 있어야만 C언어 자체에 대한 이해를 할 수 있기 때문에 초보자가 배우기에 적합한 언어는 아니라고 생각합니다.
사실 최근엔 어셈블리도 함수와 간단한 반복연산, 분기문 정도는 매크로를 통해 사전 정의되어 있어서 이제와선 몇몇 기능을 제외하면 C와 어셈블의 차이도 많이 좁혀져 버리기도 했구요.
아무튼 대신에 레퍼런스형 변수를 사용하라는 것은 결국 모든 메모리 할당을 Call Stack 내부에서만 사용하고, 해당 블럭이 끝나면 유의미한 데이터만 반환하고 나머지 정보들은 블럭과 함께 자연스럽게 해제되도록 짜야합니다.
Object *objPrt = new Object(); ... ; 보다는 { Object obj(); ...; return obj} 형태로 사용하는 것이 굳이 delete를 신경 쓰는 것보다 훨씬 더 개발이 편하고, 할당과 해제가 같은 블럭에서 되므로 훨씬더 문맥이 자연스러워 집니다.
C언어도 마찬가지로 블럭의 시작 위치가 자유로우므로, 변수가 필요한 시점에서 새로운 블럭을 열고 사용이 끝난 시점에서 블럭을 닫는 편이 포인터를 쓰지 않고도 메모리 할당을 자유롭게 할 수 있습니다.
#include <stdio.h>
int main(int argc, char* argv[])
{
int a = 10;
printf("%dn", a);
{
int b = a + 1;
printf("%dn", b);
{
int c[b];
int i = 0;
for (i = 0; i < b; i++)
{
c[b] = i * i;
}
for (i = 0; i < b; i++)
{
printf("%dn", c[i]);
}
}
}
}