C++ programming (1)

PM/iOS Developer KimKU·2021년 9월 8일
0

c++

오늘부터 C++ 프로그래밍에 대한 설명을 해볼까 한다. 현재 C, Python 에 대한 설명도 하고있지만 C++은 처음 접하는 언어이고 나에겐 가장 낯선 언어이다. 많이 미숙할지도 모른다. 하지만 강의 시간에 배운 내용과 전공 교제를 바탕으로 열심히 설명해보겠다.


1. C++ 의 시작

1.1) 컴퓨터와 프로그래밍

1.1.1) 세상을 먹어치우는 소프트웨어

Software is eating the world.

2011년 8월 20일 마크 앤드리슨이 월스트리트 저널에 실은 위의 예언은 적중하였다. 오늘날 Amazon, eBay, Facebook, Groupon, Skype, Android, Netflix, Google, Apple, Samsung 등 분야를 가리지 않고 모든 분야에서 '소프트웨어 기업이 세상을 지배'하고 있으며, 기존의 하드웨어 기업들도 소프트웨어 기업으로 탈바꿈하고 있다. 이와 더불어 인공지능과 로봇, 빅데이터 등을 핵심 기술로 삼는 4차 산업의 물결은 소프트웨어의 지배력을 산업의 전 분야로 퍼뜨리고 있다.
소
4차 산업 기술의 핵심에는 소프트웨어가 있다. 로봇을 움직이는 두뇌도 소프트웨어이고, 자동차는 소프트웨어에 의해 제어되는 IT 제품으로 바뀌었으며, 구글의 알파고나 IBM의 왓슨은 소프트웨어가 만들어낸 인공지능(AI)이다. 수많은 센서들과 소형장치들을 연결하는 IoT 플랫폼의 효율성은 소프트웨어의 질에 달려 있다. 마크 앤드리슨의 예언처럼 소프트웨어가 세상을 먹어치우고 있다. 이것을 간파한 많은 기업들은 역할에 관계없이 모든 직원이 프로그래밍을 배우도록 강요하고 있으며, 여러 선진국들이 어린 시절부터 코딩을 배우도록 교육하고 있다.

"Over the next 10 years, the battles between incumbents and software-powered insurgents will be epic"

소프트웨어가 이 시대의 IT, 자동차, 금융, 의료 등 세계를 지배할 것이다.

1.1.2) 소프트웨어와 컴퓨터

컴퓨터 하드웨어(hardware)를 작동시켜 쇼핑을 하고 신문을 보고 음악을 듣고 게임을 할 수 있게 하는 것을 소프트웨어(software)라고 하며, 프로그램(program)이라고 부르기도 한다. 소프트웨어는 컴퓨터의 중앙처리장치(CPU)가 이해할 수 있는 일련의 명령들(instructions)과 데이터로 구성되며, CPU느느 이 명령들을 순차적으로 해석하여 실행함으로써 요구된 기능을 수행한다.


1.2) C++ 언어의 역사

1.2.1) 프로그래밍 언어의 진화와 C++ 언어

ㄴ

위의 그림은 C++ 언어를 기준으로 지금까지 개발된 프로그래밍 언어의 진화 과정을 축소하여 보여준다. 1950년대부터 어셈블리어의 한계를 극복한 고급 언어들이 개발되기 시작했다. 1972년에 Ken Tompson과 Dennis Ritchie는 DEC PDP-11 컴퓨터에서 실행되는 유닉스 운영체제(UNIX)를 작성하기 위해 B 언어를 개선한 C 언어를 만들었다. 그 후 C 언어는 가장 강력한 언어로 많은 프로그램 개발자들의 사랑을 받아 왔으며, 많은 소프트웨어 작성에 사용되었고, 지금도 여전히 활발히 사용되고 있다. C 언어는 시스템 소프트웨어뿐만 아니라 모바일, 게임, 그래픽 , 임베디드 등 다양한 응용프로그램의 개발에 이르기까지 광범위하게 사용되고 있다.

한편, 컴퓨터의 속도가 빨라짐에 따라 소프트웨어의 크기도 커지게 되었고, C 언어로 덩치 큰 소프트웨어를 개발할 때 프로그램 코드 관리에 어려움을 겪게 되었다. 이러한 어려움을 개선하기 위해 Bell 연구소의 Bjarne Stroustrup은 1979년부터 C 언어에 객체 지향 특성(object oriented programming) 및 기능을 추가한 새로운 언어를 만들었고, 1983에 C++로 망명하였다. 객체 지향 프로그래밍 기법은 클래스와 상속을 이용하여 소프트웨어의 재사용을 높이고 소프트웨어의 개발과 관리를 쉽게 한다. C++ 언어 는 C 언어의 모든 기능을 가지고 있기 때문에 이미 작성된 C 소스 프로그램을 그대로 혹은 조금만 수정하면 C++ 프로그램으로 재사용할 수 있고, 이미 컴파일된 C 목적 코드로 C++ 프로그램에서 링크하여 사용할 수 있다.

객체 지향 특성의 장점은 다른 언어가 태동하는데 큰 기여를 하였다. 1995년에는 C++의 영향을 받은 또 하나의 객체 지향 언어인 Java가 선마이크로시스템(현재는 오라클에 인수됨)의 제임스 고글링에 의해 만들어졌으며, 2000년에는 마이크로소프트에서 C++와 Java의 개념을 섞은 C # 언어 를 만들었으며, .NET 프레임워크가 설치된 플랫폼 상에서 실행된다. C++, C #, Java 는 모두 C 언어에 바탕을 두기 때문에 서로 매우 유사하며, C 언어를 잘 알면 이들 언어의 습득은 매우 쉽다.

한편, C++ 언어는 위의 그림과 같이 1998년 처음오로 C++98로 표준화되었고, C++03, C++11, c++14, c++17 등 표준은 계속 진화하고 있다.

1.2.2) 표준 C++ 프로그램의 중요성

산업의 모든 분야에서 그렇지만 소프트웨어 개발 분야에서도 표준(standard)은 중요하다. 1988년 미국 국립 표준원인 ANSI에서 C++ 언어에 대한 표준을 정하였다. 그 후 2003년, 2007년, 2011년, 표준을 갱신하면서 C++ 표준은 계속 진화해가고 있다. 현재 대부분의 컴파일러 회사들은 이 표준을 따르는 C++ 컴파일러를 제작 공급하고 있다. 그러므로 표준에 따라 만들어진 C++ 프로그램 소스는 모든 플랫폼, 모든 C++ 컴파일러에 의해 컴파일 가능하고, 모두 동일한 실행 결과를 보장한다. 이것이 바로 표준의 중요성이다.

아래 그림을 보자. 왼쪽의 경우, 표준 C++ 규칙에 따라 작성된 C++ 프로그램은 어떤 컴파일러에 의해서도 컴파일되고 타겟 컴퓨터에서동일하게 실행되지만, 오른쪽 경우 __cdel 이라는 비주얼 C++만의 전용 키워드를 사용하여 비주얼 C++ 컴파일러가 아닌 다른 컴파일러에 의해서는 컴파일되지 않는다.

ㅇ

비주얼 C++ 도구를 이용하되 C++ 언어 표준에 준하여 프로그래밍하면 컴파일러나 플랫폼에 상관없이 컴파일되고 실행 가능하다. C++ 언어로 소프트웨어를 개발하여 세상의 모든 컴퓨터와 플랫폼 사용자에게 판매하고자 한다면, 표준 C++ 언어로 프로그램을 작성하는 것이 바람직하다. 필자는 ANSI / ISO 표준의 C++ 에 대해서만 다룬다.


1.3) C++ 언어의 특징

1.3.1) C++ 언어의 주요한 설계 목표

C++ 언어의 기본적인 설계 목표에 대해 알아보자.

첫째, C 언어로 작성된 프로그램과의 호환성(compatability)을 유지한다. 기존에 작성된 C 프로그램을 그대로 사용할 수 있도록 C 언어의 문법적 체계를 그대로 계승한다. 또한 C++ 언어로 적성되어 컴파일된 목적 파일(object file)이나 라이브러리(library)를 C++ 프로그램에서 링크하여 사용할 수 있도록 한다.

둘째, 소프트웨어의 재사용을 통해 소프트웨어 생산성을 높이고, 복잡하고 큰 규모의 소프트웨어 작성, 관리, 유지 보수를 쉽게 하기 위해 데이터 캡슐화, 상속, 다형성 등 객체 지향 개념을 도입한다.

셋째, 타입 체크엄격히 하여 실행 시간 오류의 가능성을 줄이고 디버깅을 돕는다.

넷째, 실행 시간의 효율성 저하최소화한다. 객체 지향의 개념의 도입으로 멤버 함수의 호출이 잦아지고 이로 인해 실행 시간이 저하되는 비효율성을 막기 위해 멤버 함수에 인라인 함수를 도입하는 등 함수 호출로 인한 시간 저하를 막는다.

1.3.2) C 언어에 추가한 기능

C++ 언어는 C 언어의 문법적 규칙을 그대로 승계하며, 프로그래밍의 편리와 다양성을 위해 다음과 같은 기능을 추가하였다.

  • 함수 중복 (function overloading) - 매개 변수의 개수나 타입이 서로 다른 동일한 이름의 함수들을 선런할 수 있게 한다.
  • 디폴트 매개 변수 (default parameter) - 매개 변수에 값이 전달되지 않는 경우 디폴트 값이 전달되도록 함수를 선언할 수 있게 한다.
  • 참조 (reference) 와 참조 변수 - 변수에 별명을 붙여 변수 공간을 같이 사용할 수 있는 참조의 개념을 도입한다.
  • 참조에 의한 호출 (call-by-reference) - 함수 호출시 참조를 전달할 수 있게 한다.
  • new와 delete 연산자 - 동적 메모리 할당, 해제를 위한 new, delete 연산자를 도입한다.
  • 연산자 재정의(operator overloading) - 기존의 연산자에 새로운 연산을 정의할 수 있게 한다.
  • 제네릭 함수와 클래스 (generics) - 함수나 클래스를 데이터 타입에 의존하지 않고 일반화시킬 수 있게 한다.
profile
With passion and honesty

0개의 댓글