C++ 언어의 주요한 설계 목표
1. C언어로 작성된 프로그램과의 호환성
=> 기존에 작성된 C 프로그램을 그대로 사용할 수 있도록 C언어의 문법적 체계를 그대로 계승
2. 객체 지향 개념을 도입
- 소프트웨어 재사용 = 생산성 up
- 데이터 캡슐화 = 복잡하고 큰 규모의 소프트웨어의 작성, 관리, 유지 보수를 쉽게 하기 위함
- 상속
- 다형성
3. 타입 체크 엄격
=> 실행 시간 오류의 가능성을 줄이고 디버깅을 돕는다
4. 효율성 저하 최소화
=> 멤버 함수의 호출이 잦아지고 이로 인해 실행 시간이 저하되는 비효율성을 막기 위해 멤버 함수에 인라인 함수를 도입하는 등 함수 호출로 인한 시간 저하를 막는다
C언어에 추가한 기능
*C++ 언어는 C 언어의 문법적 규칙을 그대로 승계하며, 프로그래밍의 편리와 다양성을 위해 다음과 같은 기능을 추가함
- 함수 중복 (function overloading)
매개 변수의 개수나 타입이 서로 다른 동일한 이름의 함수들을 선언할 수 있게 한다
- 디폴트 매개 변수 (default parameter)
매개 변수에 값이 전달되지 않는 경우 디폴트 값이 전달되도록 함수를 선언할 수 있게 한다
- 참조 (reference)
변수에 별명을 붙여 변수 공간을 같이 사용할 수 있는 참조의 개념을 도입한다
- 참조에 의한 호출 (call-by-reference)
함수 호출시 참조를 전달할 수 있게 한다
- new와 delete 연산자
동적 메모리 할당, 해제를 위한 new, delete 연산자를 도입한다
- 연산자 재정의 (operator overloading)
기존의 연산자에 새로운 연산을 정의할 수 있게 한다
- 재네릭 함수와 클래스 (generics)
함수나 클래스를 데이터 타입에 의존하지 않고 일반화시킬 수 있게 한다
C++의 객체 지향 특성
- 객체와 캡슐화 (Encapsulation)
캡슐화
=> 데이터를 캡슐로 싸서 외부의 접근으로부터 데이터를 보호
클래스
=> C++에서 캡슐의 역할을 함, class 키워드를 이용하여 작성
객체 (instance)
- 클래스라는 틀에서 생김
- C++ 클래스는 멤버 변수들과 멤버 함수로 이루어짐
- 멤버들은 캡슐 외부에 공개(public), 보이지 않게(private) 선언할 수 있다
- 공개(public)된 멤버들만 외부 객체들이 접근 가능
C++로 추상화한 Circle 클래스
==> private에 있는 변수는 외부에서 접근 불가
- 상속성 (Inheritance)
=> C++에서 상속은 객체를 정의하는 클래스사이에 상속 관계를 두어, 자식 클래스의 객체가 생성될 때 자식 클래스에 선언된 멤버뿐만 아니라 부모 클래스에 선언된 멤버들도 함께 가지고 탄생
상속
구현된 코드의 재사용성을 높여서 소프트웨어 생산성을 높인다
=> 휴대 전화기 클래스는 전화기 클래스의 기능을 물려받고, 음악 기능 전화기 클래스는 휴대 전화기 클래스의 기능을 물려받음
- 다형성 (Polymorphism)
=> 하나의 기능이 경우에 따라 서로 다르게 보이거나 다르게 작동하는 현상
연산자 중복 (operator overloading)
+ 연산자는 정보 덧셈이나 문자열 연결 (concentration), 객체 더하기 등 피연산자에 따라 서로 다른 연산이 이루어질 수 있다
함수 중복 (function overloading)
같은 이름의 함수가 매개 변수의 개수나 타입이 다르면 서로 다른 함수로 인식
void add(int a, int b) {...}
void add(int a, int b, int c) {...}
void add(int a, double d) {...}
함수 재정의 또는 함수 오버라이딩 (function overriding)
==> 강아지, 고양이, 닭은 모두 동물 클래스의 속성으 상속받고, '소리내기' 함수를 강아지, 고양이, 닭에서 서로 다르게 구현
C++ 언어에서 객체 지향 개념을 도입한 목적
- 소프트웨어의 생산성 향상
이미 만들어진 C++ 클래스를 상속받거나 C++ 객체를 가져다 재사용하거나, 부분 수정을 통해, 소프트웨어를 작성하는 부담을 대폭 줄일 수 있다
- 실세계에 대한 쉬운 모델링
객체 지향 언어는 게임에 등장하는 각 요소를 객체로 정의하고, 객체의 속성과 행위를 묘사하고 객체 사이의 상호 작용을 표현하는 방법으로 효관적인 프로그래밍을 할 수 있음
절차 지향 프로그래밍과 객체 지향 프로그래밍
- 절차 지향 프로그래밍
- C 언어 등을 이용하여 실행하고자 하는 절차대로 일련의 명령어를 나열하여 프로그래밍
- 흐름도를 설계하고 흐름도상의 동작들을 함수로 작성하여 흐름도에 따라 이련의 동작들이 순서에 맞추어 실행되도록 작성
- 객체 지향 프로그래밍
- 실제 세상에 가깝게 모델링하여 실제 세상의 물체를 객체로 표현
- 객체를 추출하고 객체들의 관계를 결정하고 이들의 상호 작용을 멤버 함수와 멤버 변수로 구현
C++ 언어와 제네릭 프로그래밍
- 제네릭 프로그래밍
동일한 프로그램 코드에 다양한 데이터 타입을 적용할 수 있도록 함수와 클래스를 일반화시킨 제네릭 함수와 제네릭 클래스를 만들고, 개발자가 원하는 데이터 타입을 적용시켜 프로그램 코드를 틀에서 찍어내는 듯이 생산하는 기법
- STL (Standard Template Library)
입출력 라이브러리를 탬플릿 (template)으로 선언하여 제네릭화하고, 응용 프로그램 개발에 필요한 대부분의 자료 구조를 제네릭 함수와 제네릭 클래스로 구현
C++ 언어의 아킬레스
C++ 언어는 C 코드와의 호환성이라는 중요한 목표로 설계되어 기존의 C 코드를 재사용 가능하지만, C 코드를 수용하다보니 객체 지향의 핵심 개념인 캡슐화의 원칙이 다소 무너짐
'C++ > [책 정리] 명품 C++ 프로그래밍' 카테고리의 다른 글
6. Visual Studio를 이용한 C++ 프로그램 개발 (0) | 2023.03.10 |
---|---|
5. C++ 표준 라이브러리 (0) | 2023.03.10 |
4. C++ 프로그램 개발 과정 (0) | 2023.03.10 |
2. C++ 언어의 역사 (0) | 2023.03.10 |
1. 컴퓨터와 프로그래밍 (0) | 2023.03.10 |