hubring

[EC++] 항목1 C++를 언어들의 연합체로 바라보는 안목은 필수 본문

C++/Effective C++

[EC++] 항목1 C++를 언어들의 연합체로 바라보는 안목은 필수

Hubring 2021. 6. 11. 23:48

C++ 프로그래밍 개념


오늘날의 C++은 다중패러다임 프로그래밍 언어(multipradigm programming language)라고 불린다.
절차적(procedural), 객체 지향(object-oriented), 함수식(functional), 일반화(generic), 메타(meta) 프로그래밍의 개념까지 지원한다.
각 지원하는 프로그래밍 마다 적절한 사용 규칙이 존재한다.
C++ 을 제대로 따라잡기 위해 여러 개의 하위 언어(4가지)에 대해 알아보고 각각의 프로그래밍 개념에 맞는 규칙을 적용할 수 있도록 하자.

1. C

C++ 은 여전히 C를 기본으로 하고 있다.
따라서 C 언어 기능만 쏙 뽑아서 사용이 가능하다.

2. 객체 지향 개념

클래스(생성자와 소멸자), 캡슐화, 상속, 다향성, 가상 함수(동적 바인딩) 등의 개념을 포함한다.
객체 지향 설계의 규칙들 대부분이 그대로 드러맞는 부분이다.

3. 템플릿 C++

C++의 일반화 프로그래밍의 부분
템플릿의 영향력이 커지면서 완전히 새로운 프로그래밍 패러다임이 파생되었다.
이 패러다임은 템플릿 메타 프로그래밍(template metaprograming : TMP)이라 부른다.
=> 이부분은 항목48에서 전반적으로 다룰예정

4. STL

템플릿 라이브러리로 컨테이너, 반복자, 알고리즘, 함수 객체로 이루어졌다.
STL 나름의 독특한 사용 규약을 가지고 있으므로 프로그래밍 시 그 규약을 따라 한다.

이 4가지 하위 언어들이 C++을 이루고 있다는 점을 새기며 효과적인 프로그램 개발을 위해 각 하위 언어 사용에 따라 전략을 바꾸며 사용하도록 한다.

하위언어 사용에 따른 전략 변경 예로
C 스타일로 사용하는 경우, 값 전달이 참조 전달 보다 대개 효율이 더 좋다 라는 규칙이 통하지만.
객체 지향으로 사용하는 경우, 생성자/소멸자의 개념으로 상수 객체 참조자에 의한 전달(pass-by-reference-to-const) 방식이 더 좋은 효율을 보인다.
=> 해당 부분이 더 효율적이라 하는 이유는 객체를 매개변수와 같이 전달할 때 값 전달(복사 생성자 호출)로 받게되면 메모리가 추가로 차지하게 되기 때문인 것으로 보임. (항목 20 참고)

이 현상은 템플릿 C++를 쓰게 될 때 특히 두드러지는데 그 이유는 템플릿에서는 객체의 타입조차 알 수 없기 때문이다.
하지만 STL에서는 반복자와 함수 객체가 C의 포인터를 이용하여 만들었기에 다시 값 전달에 대한 규칙이 더 힘이 있다.


이것만은 잊지 말자!

* C++를 사용한 효과적인 프로그래밍 규칙은 C++의 어떤 부분(사용하는 프로그래밍 개념, 하위 언어)를 사용하냐에 따라 달라진다.