본문 바로가기
C_C++ 프로그래밍/Effective C++

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

by RoJae 2019. 8. 26.


      로재의 개발 일기      

C++은 언어들의 연합체

c++을 잘 사용하기 위해서는 c++을 하나의 언어로 보기보다는

c++을 하나의 연합체로 보는 것이 좋습니다.

즉 c++이 여러 개의 하위 언어를 제공한다는 점을 제기하는 것입니다.

그렇다고 막연한 이야기는 아닙니다. 4개 밖에 없기 때문이죠.


  1. C

 C++은 여전히 C 기반이기 때문에, C만 쏙 빼서 사용이 가능합니다.

 하지만, 이렇게 개발을 하기 된다면 효과적인 프로그래밍을 위한 규칙을 적용할 수 없게 됩니다.

 템플릿도 없고, 예외도 없고, 오버로딩도 없고.... 등등 말입니다..


  2. 객체 지향 개념의 C++

 '클래스를 사용하는 C'에 관한 이야기입니다.

 생성자와 소멸자, 캡슐화, 상속, 다형성, 가상 함수(동적 바인딩)까지 포함합니다.


  3. 템플릿 C++

 요즘 어지간히 괜찮은 C++ 프로그램이라면 템플릿 구문을 하나 쯤 발견할 수 있습니다.

 이 템플릿의 강력함이 너무 크다보니 새로운 프로그래밍 메타가 나왔으니

 이름하여 '템플릿 메타프로그래밍' (TMP)라고 불리우게 됩니다.


  4. STL

 STL은 이름에서 알 수 있듯이 템플릿 라이브러리입니다.

 하지만 대단히 특별하며,  컨테이너 알고리즘 함수 객체 벡터 등등

다양한 규약을 가지며 많은 프로그래머들이 사용하고 잇습니다.



  pass by value vs pass by reference

이 부분은 대부분의 개발자들은 값에 의한 참조가 효율적이라고 생각할 겁니다.



  passbyvalue.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<iostream>
 
// argument x is pass by function addOne
 
void addOne(int x);
 
int main(){
    int value;
    std::cout << "Insert any number" << '\n';
    std::cin >> value;
    addOne(value);
 
    return 0;
}
 
void addOne(int x){
    x++;
    std::cout << x << '\n';
}
 
cs



  passbyreference.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
 
// argument x is pass by reference
 
void addOne(int &x);
 
int main(){
        int value;
        std::cout << "Insert any number" << '\n';
        std::cin >> value;
        addOne(value);
        return 0;
}
 
void addOne(int &x){
        x++;
        std::cout << x << '\n';
}
 
cs


하지만!  C++은 여러 언어의 연합체이기 때문에

어떻게 쓰는 가에 따라서 장단점이 나뉘게 됩니다.


C style, STL => 값에 의한 참조가 유리하게 작동합니다.

객체 지향 C++, 템플릿 C++ => 참조자에 의한 전달이 유리해 집니다.


참조에 의한 전달입니다.

1
2
3
4
5
// v is reference value 
 
void addOne(int& v){
    v = v + 1
}
cs


하지만 const reference value를 사용하면

값을 변경할 수 없게 됩니다. (컴파일 에러)

1
2
3
4
5
// v is const reference value 
 
void addOne(const int& v){
    v = v + 1;         // const는 값을 변경할 수 없다.
}
cs

※ 본 글은 개인 포트폴리오 혹은 공부용으로 사용하기 때문에, 무단 복사 유포는 금지하지만, 개인 공부 용도로는 얼마든지 사용하셔도 좋습니다


댓글