Introduction to C++
- Bjarne Stroustrup이 1980년대 초에 개발한 언어로, C와 마찬가지로 벨 연구소 * 에서 탄생했다.
- 벨 연구소에서 Stroustrup과 동료들이 어셈블러나 C언어,
그 외에 여러가지 High level 언어로 프로그래밍을 해야하는 불편을 해소하기 위해 설계했다.
* 벨 연구소 (Nokia Bell Labs)
- 1925년 미국, 당시 AT&T 사장이던 Walter Gifford가
독립사업으로 케이블 및 통신업 관련 연구소인 벨 연구소를 설립했다.
- 2016년에 노키아가 알카텔-루슨트을 인수하여 현재는 노키아의 자회사가 되었다.
C++ 의 특성
- C언어의 특성 대부분을 계승
- 객체 지향 프로그래밍 기능 (Object-oriented language)
- 일반화 프로그래밍 기능 (Generic Programming)
Data & Algorithm (데이터와 알고리즘)
-일반적으로 컴퓨터 언어는 데이터와 알고리즘, 두 가지 개념을 다룬다:
- 데이터 : 프로그램이 사용하고 처리하는 가공되지 않은 정보
- 알고리즘 : 프로그램이 데이터를 처리하는 방법
- 절차적 언어는 프로그래밍시에 데이터보다 알고리즘에 주안점을 둔다.
- 객체지향적 언어는 프로그래밍시에 알고리즘보다는 데이터 자체에 주안점을 둔다.
C Language (C언어)
- Low level 언어의 효율성과 H/W 접근 능력에 High level 언어의 일반성과 이식성이 결합된 강력한 언어
- 통신 포트나 디스크 드라이브와 같은 H/W까지 직접 제어할 수 있는 기능까지 갖추고 있었고,
크기가 작으면서도 실행 속도가 빠른 프로그램(Embedded Program)까지 작성할 수 있다.
- 구조적 프로그래밍(Structured Programming)을 실현시킨 언어
- 복잡한 프로그램의 구현을 가능하게 하는 방법론이다.
- 1970년대 C언어나 Pascal과 같은 언어로 구현이 가능했다.
- 정형화된 조건을 통해 분기(for 루프, while 루프, if-else 구문 등)를 사용하도록 제한함으로써
분기문이 어지럽게 엉켜있는 "스파게티 프로그램"을 방지했다.
- 규모가 큰 프로그램을 작고 다루기 쉬운 단위 작업들로 분할하여 해결하는
하향식 설계법(Top-Down design)으로 구현했다.
- 라이브러리 제공 (Library)
- 프로그램에서 불러다 쓸 수 있도록 미리 기성품으로 제작되어 있는 프로그래밍 모듈들의 집합이다.
- 라이브러리는 공통적으로 발생하는 많은 문제들에 대한 검증된 해결책을 제공하여 프로그래머의 편의를 증대시켰다.
Object-Oriented Programming (객체 지향 프로그래밍)
- 절차 지향 프로그래밍과 반대로, 데이터를 우선시하는 프로그래밍 방식이다.
- 언어 자체를 해결해야 할 문제에 맞추는 방식이다. (절차지향 프로그래밍과 달리, 문제를 언어에 맞추지 않음)
- 소스코드의 재활용과 포괄 개념의 추상화 기술을 구현할 수 있다. (일반화 프로그래밍과 공통된 장점)
- Data와 Algorithm 중 Data에 주안점을 둔다.
- 큰 프로젝트 개발 작업시에 적합하다.
* C++의 구조
Class(클래스) : 해결해야 할 문제의 특성에 맞게 설계된 데이터형
Object(객체) : 클래스에 의해 만들어지는 특정한 데이터 구조
Class 의 구조
일반적으로 클래스는 데이터 부분(Data member)과
데이터를 대상으로 수행할 수 있는 동작 부분(Member function)으로 정의됨
OOP의 장점
- 재활용 (recycling)
- 재활용이 가능한 소스코드를 작성할 수 있으므로, 개발의 효율이 증가함
- 정보 은닉 기능 (Data Encapsulation & Hiding)
- 비인가된 접근으로부터 데이터를 보호
- 다형 (Polymorphism)
- 같은 이름의 연산자나 함수를 여러 벌 정의하여 프로그램이 상황에 맞게 스스로 선택하게 할 수 있음
- 개발의 편의성을 극대화하는 기능
- 상속 (Inheritance)
- 하나의 클래스로부터 새로운 클래스를 유도할 수 있음, 상향식 설계 * 로 진행하는 데 핵심적인 기능
* 상향식 설계 (Bottom-Up design)
저수준의 클래스를 먼저 설계한 후에 고수준의 프로그램 설계로 진행하는 방법
Generic Programming (일반화 프로그래밍)
- 데이터형에 구속받지 않는 코드를 작성하는 프로그래밍 기법
- 소스코드의 손쉬운 재활용과 포괄 개념의 추상화 기술을 구현할 수 있음 (OOP와 공통된 장점)
- Data와 Algorithm 중 Algorithm에 주안점을 둠
- 데이터 정렬이나 리스트 병합 등의 일반적인 작업에 적합
- C++ 에서는 "Template" 키워드를 통해 구현
Portable (프로그램의 이식성)
- 프로그램이 H/W (Processor 등)와 S/W(OS 등)에 독립적인지에 대한 여부이다.
첫 번째 요인 : 하드웨어
- 특정 하드웨어에 종속적이지 않고 호환성이 높은 프로그램은 이식성을 갖췄다고 이야기할 수 있음
Ex. NVIDIA의 비디오 카드를 직접 제어하는 프로그램은 AMD 그래픽카드가 장착된 시스템에서 제 기능을 수행할 수 없다.
- 이는 하드웨어에 종속적인 파트를 함수 모듈로 작성해 두어서,
이식성 문제가 발생하였을 때 해당 부분만 수정함으로써 대처하기가 수월해짐
두 번째 요인 : 프로그래밍 언어 간의 상이성
- 한 나라 안에서도 각 지방마다 사투리가 있듯이, 프로그래밍 언어도 버전별로 차이가 있을 수 있는데 여기서 이식성 문제가 발생할 가능성이 있고, 이 때문에 프로그래밍 언어에 표준화 작업의 중요성이 대두되었음
- ANSI/ISO : C++ 표준화 개발을 위한 위원회
- ISO C++ 표준은 ANSI C 표준에 기반을 두고 있음
- C++98
- C++은 1998년에 국제 표준이 되었고(ISO/IEC 14882:1998) 이 표준을 C++98이라고 함
- C++98은 C++가 기존에 가지고 있던 특성을 수정했으며 예외처리, RTTI(Runtime Type Identification), 템플릿, STL 등의 새로운 특성을 추가했음
- C++03
- C++98이후, 2003년에 오로지 기술적인 개정을 거친 C++03이 탄생
- C++11
- 2011년 8월에 ISO는 C++11이라는 새로운 표준을 승인(ISO/IEC 14882:2011)
- 많은 언어적 특성이 추가 되었으며, C++을 더 쉽게 배우고 사용하는 데 목적을 둚
* Classic C
ANSI C 표준이 정해지기 전, C 언어 사용자들은 Kernighan 과 Ritchie 의 저서 The C Programming Language 을 표준으로 삼았는데, 이를 K&R C 라고 불렀으며 Classic C 라고 부르기도 했었음