공부 중 메모/C,C++-기타 정보

1. C/C++ 소개.

라이피 (Lypi) 2014. 11. 27. 17:42
반응형

C/C++에 대한 간략한 설명

 

C란?

  1972년에 벨 연구소의 데니스 리치(Dennis MacAlistair Ritchie, 1941.9.9~2011.10.12)가 만든 프로그래밍 언어.[각주:1]

 

C++이란?

  1983년에 벨 연구소의 비야네 스트롭스트룹(Bjarne Stroustrup, 1950.12.30 ~ )이 발표하고 이후 계속하여 발전한 C언어를 바탕으로 만든 프로그래밍 언어. C++라고 쓰고 읽을 때는 C plus plus 혹은 시플플이라고 읽는다.[각주:2] (주인장은 씨쁠쁠이라고 읽는다.)

 

C/C++의 역사
 

C의 역사

  C를 만든 데니스 리치는 크기는 작고 속도는 빠르며 하드웨어를 직접 제어할 수 있는 프로그램을 만들 수 있는 언어가 필요했다. 당시에 이를 충족시킬 수 있는 언어는 저급언어로 분류되는 특정 기계에 종속적이며 이식성이 없는 어셈블리어밖에 없었다. 그렇기 때문에 운영체제로서 여러 플랫폼에서 수정없이 사용하는 것이 목적인  UNIX를 만드는 것이 목적이었던 데니스 리치로서는 어셈블리어를 사용할 수 없었다. 그래서 데니스 리치는 과거 언어들의 장점을 취합 정리하여 C언어를 직접 만들었다.

  C언어 이전까지의 프로그래밍 언어들은 독자적으로 특화된 분야를 하나씩 가지고 있었으나 C언어가 모든 분야에서 강점을 가지는 범용 언어로서 등장하여 그 명백을 잃어버렸다. 그렇게 여러분야에서 광범위하게 사용되던 C언어였지만 시간이 흐름에 따라서 비효율적인 면들이 드러났고 애매한 문법들도 있었다. 컴파일러 회사들은 이런 부분을 공략하여 새로운 기능 자체를 추가한 C컴파일러를 경쟁적으로 발표하였고 이런 요소들로 인해 C언어에는 여러 변종들이 생겨나게 되었다. 높은 호환성을 장점으로 갖던 C언어가 이로 인해 그 범용성을 잃어버릴 위기에 처한 것이다.

  이를 해결하기 위해서 표준의 제정이 요구되었고 미 표준 위원회인 ANSI는 83년부터 표준 제정 작업을 시작하여 89년에 표준안을 완성했으며 90년에 ISO에 의해 승인(ISO9899)되었다. 이때 제정된 C표준을 ANSI C (또는 C90)[각주:3]이라고 하며 그 이전의 C를 클래식 C(K&R C)라고 한다. ANSI C는 안정성이 높아졌고 애매한 기능이 정리되었으며 다음과 같은 기능들이 추가되었다.[각주:4]

 표준 라이브러리 함수를 규격화했으며 헤더 파일도 통일했다.

 함수의 원형 선언 기능이 추가되어 컴파일러가 함수 호출부에서 타입 체크를 할 수 있다.

 정수, 실수 상수의 타입을 지정할 수 있는 L, U, F 등의 접미어가 추가되었다.

 enum, void 형과 const, volatile 제한자가 추가되었다.

 인접 문자열 상수를 합쳐 주고 확장열의 기능도 추가되었다.

 함수 내부에서 선언하는 지역 배열이나 구조체를 초기화할 수 있다.

 구조체끼리 대입할 경우 구조체 크기만큼 메모리 복사를 한다

 

이후에도 C표준은 지속적으로 확장되어 95년에 제정된 C95, 99년의 C99, 2011년의 C11까지 나왔지만 큰 의미는 없는 것이 지금도 C를 사용하는 사람들은 C90을 아직도 표준처럼 사용하고 있기 때문이다. ANSI C라는 명칭은 공식적으로는 최근 표준인 C11을 의미하지만, 실질적으로는 아직까지도 C90을 가리키는 의미로 사용되고 있다.

 

C++의 역사

  컴퓨터는 처음 개발된 이후 하드웨어의 발전에 힘입어 점차 그 영역이 확대되어 초창기에는 상상조차 할 수 없었던 영역에서도 쓰일 정도가 되었다. 컴퓨터가 사용되는 영역이 확대됨에 따라서 용도에 맞는 다양한 소프트웨어의 필요성도 대두되었으나 하드웨어의 성능이 향상되고 소프트웨어가 필요로하는 기능도 다양해지고 복잡해짐으로써 소프트웨어를 만드는 일은 초창기보다 더 어려워졌다. 하드웨어는 '무어의 법칙'[각주:5]에 따라 나날이 발전하는데 소프트웨어의 발전은 더디기만 했다. 이처럼 소프트웨어가 하드웨어의 발전을 따라가지 못하는 현상을 '소프트웨어 위기(Software Crisis)'라고 한다.  

소프트웨어 위기가 나타나게 된 원인은 여러가지가 있었겠지만 그 중 가장 대표적인 것은 기존에 사용하던 프로그래밍 방식인 '절차식 프로그래밍 방법'의 낮은 생산성이었다. 절차식 방법은 문제를 해결하는 절차가 중심이라 특수한 문제마다 특수한 해결 방법으로 짜여질 수 밖에 없고, 그러다보니 코드의 일반성이 없어 한번 만든 코드를 재사용할 수도 없었다. 설사 재사용하더라도 기존 코드를 그대로 사용할 수 없고 필요에 따라 조금씩 수정해야만 했다. 하드웨어는 이미 만들어져있는 부품을 조립만 하여 만들수 있었으므로 각 부품의 신뢰성도 높고 완제품의 질도 보장되는데 반해 소프트웨어는 그렇지 못했던 것이다. 

이를 해결하기 위해 여러 대안이 제시되었는데 그중 대표적인 방법으로 선택된 것이 '객체 지향적 프로그래밍(Object Oriented Programming)' 방식이다. 이는 현실에서 물건을 만들때 부품 중심으로 먼저 만들고 이를 조립하여 완제품을 만들어내듯이 '데이터'를 먼저 정의하고, 여기에 '절차'를 결합하여 현실의 사물을 표현하는 '객체'를 만든 뒤, 독립적인 객체를 조립하여 프로그램을 완성해 나가는 방식이다. 이 방식은 기존의 방식보다 생산성이 월등히 높아서 소프트웨어 위기를 극복하는데 큰 역활을 하였다.

C++은 C에 이러한 객체 지향 방법론(OOP)을 추가하여 C의 문법을 그대로 사용하면서 객체 지향 방법론을 사용할 수 있게 만든 언어이다. 이 때 C++의 OOP 문법은 Cimula67이라는 언어의 문법을 참조하여 만들어졌다. C++은 90년부터 본격적으로 활용되기 시작하여 지금은 대부분의 대형 프로젝트에 활용되고 있는 범용언어로서의 C의 명백을 그대로 이어가고 있는 언어이다.

C++에는 C에 없던 '클래스', '상속', '다형성', '템플릿' 등이 추가되었고, 기존 C의 문법도 확장되었다. 아래는 그 대표적인 예이다.[각주:6]

  1. 한줄 주석은 //로 표기할 수 있다.

  2. 새로운 진위형인 bool 타입을 추가했다.

  3. 구조체나 열거형의 태그 이름을 하나의 타입으로 인정한다.

  4. 함수 중간에서 변수를 선언할 수 있다.

 

  C와 C++의 관계에 대해서는 여러 의견이 있는데 대표적인 의견은 두가지로 첫번째는 'C++이 C를 기반으로 하고 있고 C의 기능을 대부분 쓸 수 있으므로 C++이 C의 상위 버전이다'라는 의견이고, 두번째는 'C++이 C를 완전히 포함하지는 못하며 두 언어의 개발 방법이 워낙 판이하게 다르므로 아예 다른 언어라고 봐야한다.'는 의견이다. 참고문헌인 '혼자 연구하는 C/C++'의 김상형은 'C++이 C의 상위 버전이며 그렇게 보는 것이 타당하다'라고 주장하나 주인장은 '두 언어는 요구하는 개발 방법론이 서로 상이하므로 서로 다른 언어로 생각하고 공부하는 것이 더 좋다'라고 생각한다. 물론 C++에서 C의 문법을 대부분 사용 가능하고 현재는 C 전용 컴파일러의 부재로 C++ 환경에서 C를 사용할 수 밖에 없다. 또한 한 프로젝트에서 두 방법론 (절차적, 객체지향적)을 모두 사용할 수도 있다. 하지만 C를 먼저 공부하고 C++를 이어서 공부하는 입장에서 두 언어가 같은 맥락의 언어라고 생각하고 공부할 시 C의 절차지향적 방법론에서 C++이 요구하는 객체지향적 방법론으로 넘어가는 것이 매우 어려워진다. 그래서 현재 대학 강의에서는 컴퓨터 공학과의 경우 C를 배우지 않고 C++과 객체를 먼저 가르치고 C는 하드웨어 관련 학과에서만 가르치는 경우도 많다고 한다. [각주:7]

  C++도 무분별한 기능 추가로 인한 호환성의 문제가 생겨 표준이 제정되었다. 첫번째로 C90과 C95를 기반으로 하여 C++의 객체지향적 기능을 추가하여 작성된 98년 첫번째 표준안인 ISO14882가 발표되었고, 2011년 8월에 C++11이 발표되었고, 2013년 5월에는 C++14의 작업 초안이 공개된 바 있다.

 

C/C++의 특징

  C/C++의 특징을 요약하자면 '성능 지향의 범용 언어'라고 할 수 있다. 풀어서 설명하면 다음과 같다.[각주:8]

① 문법이 간결하다. 예약어가 적고 제공하는 연산자가 다양하기 때문에 짧은 명령으로 많은 일을 할 수 있다.
② 효율성이 좋아 대규모의 고기능 프로그램을 만들 수 있다. 제작된 프로그램의 크기가 작고 속도도 빠르다.
③ 운영체제 개발을 목적으로 만든 언어이므로 저수준 프로그래밍이 가능하며 어셈블리 수준의 하드웨어 제어를 할 수 있다.
④ 모든 분야에 두루 활용할 수 있을 정도로 범용적이다. 사무 처리, 과학 기술, 상업용 등 거의 대부분의 응용 프로그램을 개발할 수 있다.
⑤ 성능을 위해 불필요한 에러 처리를 하지 않는다. 타입의 불일치나 배열 경계 점검 등은 프로그래머가 직접 해야 하므로 개발자는 항상 이 점을 주의해야 한다.
⑥ 이식성이 좋다. 대부분의 플랫폼에서 C/C++ 언어를 사용할 수 있으므로 재컴파일만 하면 타 운영체제에서 실행되는 프로그램을 쉽게 만들 수 있다.

 

  위는 C/C++의 장점으로서의 특징이라면 다음은 단점으로서의 특징이다.

 ① 배우기 어렵다. 이는 진입장벽을 다 넘지 못한 프로그래머들이 많아진다는 것을 의미하며 제대로 된 C/C++ 프로그래머를 찾기 힘들어진다는 뜻도 된다.

 ② 주 실습환경이 칙칙한 도스나 윈도우즈 콘솔이기 때문에 실습의 재미가 떨어진다.

 

  위의 단점 때문에 프로그래밍 입문용 언어로 '비주얼 베이직'이나 '델파이'가 추천되기도 한다. 이 두 언어는 처음부터 '교육용 언어'로 만들어졌기 때문에 매우 쉬우며, 언어의 구조가 간단하고 엄격하기 때문에 문법에 금방 익숙해질 수 있고, 포인터 같은 어려운 기능은 제공하지 않거나 축소하여 부담없이 공부할 수 있다. 또한 그래픽 환경에서 실습이 진행되 작성한 코드의 결과를 눈으로 바로 확인할 수 있어 실습의 진도도 빠른 편이다. 하지만 '비주얼 베이직'은 툴 자체의 근본적 한계로 고기능의 프로그램을 만들기에는 역부족이다. 다만 '델파이'는 배우기도 쉽고 실무에서 사용할 수 있을만큼 강력한 기능을 제공한다. 이 외에도 최신 언어인 '자바'나 'C#'도 입문용 언어로 권장할만 하나 두 언어의 뿌리도 C/C++에 있으므로 이를 먼저 공부하면 쉽게 익숙해 질 수 있다.

  (이외에도 '루비'나 '액션스크립트', '루아', 'PHP' 등이 있다. '루비'의 경우 'RPG 만들기 XP'부터 이 언어를 스크립트로 사용하여 보다 정교한 게임을 만들 수 있고, 스프링노트, 미투데이 등의 사이트가 'Ruby on Rails'를 사용한다. '액션 스크립트'는 '플래시'에서 사용하는 언어이며, '루아'는 태생 자체가 가벼운 스크립트 언어로 C/C++에 접착시키기 매우 쉽다. 오픈 소스 언어에다가 완전 무료다. 이것만 쓰기에는 무리일 수 있으나 워낙 가볍다 보니 여러 곳에서 활용되고 있다. 'PHP'는 웹 프로그래밍 분야를 꽉 붙잡고 있다고 생각하면 된다. C언어와 유사한 문법을 사용하고 소규모 페이지 제작시 손쉽고 빠르기 때문에 사용가능한 사람들이 많다. C와 많은 면에서 유사하기 때문에 C를 할 줄 알면 PHP도 금방 배워서 사용할 수 있다.)[각주:9] 

 

  이런 다양한 언어가 나와있음에도 불구하고 C/C++를 입문용 언어로 배울 때의 장점은 다음의 2가지이다.

  첫째, 아직까지도 가장 널리 사용되는 언어가 C/C++로 대중성이 뛰어나다. 사용자가 많다는 것은 그만큼 자료가 많고 도움을 받을 수 경로도 많다는 뜻이다.

  둘째, C/C++은 실무에서 바로 사용 가능하고 대부분의 개발사들이 기본 개발 언어로 채택하고 있는 언어이다. 다른 언어를 공부했어도 실무에 들어갔을 때 C/C++을 사용하면 이를 또 배워야한다.

 

마무리

  지금까지 C/C++에 대한 간략한 설명과 역사, 특징을 살펴보았다. 주인장은 기회가 된다면 다른 언어들도 공부해보고자 하며 그 기록또한 남기려고 노력하고 있다. 여태까지 대략이나마 살펴본 언어로 C/C++, PHP, Action Script, Ruby 등이 있는데 주인장이 가지고 있는 프로그래밍 언어라는 이미지와 가장 잘 맞았던 것은 C/C++이었다. 배우기 어려운만큼 공부하는 보람도 있으며 시도해볼 수 있는 것도 많다. 이제 컴파일러에 대한 포스팅만 끝내면 본격적인 프로그래밍 언어의 세계로 들어가게 될텐데 시간이 걸리더라도 잘 끝낼 수 있었으면 좋겠다.

 

- 본 문서의 저작권은 블로그 주인장 (Lypi)에게 있으며 다른곳으로 이동과 상업적 이용 및 절 행위를 금지합니다. 본문 링크는 괜찮습니다. -

(무엇보다도 대학 레포트용으로 사용하는 것을 금합니다.)

  1. 출처 : 엔하위키 C(프로그래밍언어) 항목 [본문으로]
  2. 참고 : 엔하위키 C++ 항목 [본문으로]
  3. SoEn 강좌에서는 이를 89년에 제정된 C89라고 표현하고 있는데 위키피디아나 엔하위키 모두 C90으로 표현되어 있어 포스팅에서는 C90으로 사용한다. [본문으로]
  4. 출처 : SoEn (소프트웨어공학연구소)의 C/C++ 강좌. [본문으로]
  5. 무어의 법칙(Moore's law)은 반도체 집적회로의 성능이 2배씩 증가한다는 법칙이다. 무어의 법칙의 3가지 조건. 1. 반도체 메모리칩의 성능 즉, 메모리의 용량이나 CPU의 속도가 18개월에서 24개월마다 2배씩 향상된다는 '기술 개발 속도에 관한 법칙'이다. 2. 컴퓨팅 성능은 18개월마다 2배씩 향상된다. 3. 컴퓨팅 가격은 18개월마다 반으로 떨어진다. [본문으로]
  6. 출처 : 위 사이트의 동일 강좌. [본문으로]
  7. 참고 : 엔하위키 C++ 항목 [본문으로]
  8. 출처 : 위 사이트의 동일 강좌 [본문으로]
  9. 참조 : 엔하위키의 각 언어 페이지들 [본문으로]
반응형