C++은 C언어를 포함한다. 때문에 C로 작성된 대부분의 프로그램은 C++ 컴파일러로도 컴파일이 가능하다.
그러나 C++은 C언어가 지니지 않는 문법적 특성도 제법 지니고 있다.
1. 헤더파일 선언문 #include <iostream>
C언어와 똑같이 헤더파일의 확장자는 .h이지만 C++에서는 표준 헤더파일의 선언에는 확장자를 생략하기로 약속되어 있다.
2. 입력과 출력
C언어에서는 서식문자를 통해 별도의 출력 및 입력 포맷을 지정해줘야 하지만
C++에서는 데이터의 타입에 따라 적절하게 동작하므로 더 편리하다. ( 문자열의 경우도 똑같다. )
3. C++의 지역변수 선언
C의 경우 무조건 함수의 가장 처음 부분에 정의되어 있어야 하지만, C++의 경우 지역변수 선언은 함수 내 어디든지 가능하다.
4. 함수 오버로딩(Function Overloading)
C언어에서는 동일한 이름의 함수가 정의되는 것을 허용하지 않는다. 하지만 C++에서는 매개변수의 선언형태가 다르다면
동일한 이름의 함수를 정의할 수 있다. 이를 오버로딩(Function Overloading)이라 한다.
int func( int num) { num ++; return num; } int func( int n, int m) { return n + m; } |
그렇다면 왜(why) C는 허용되지 않고, C++만 가능한 것일까?
C++의 경우 호출할 함수를 찾을 때, '이름', '매개변수'의 정보를 동시에 활용하지만,
C의 경우는 단순 '이름'만 활용하기 때문이다.
※ 단순히 반환형만 다른 것은 오버로딩이 아니다. 호출되는 함수를 구분 짓은 것에 반환 타입의 정보를 활용하지 않는다.
int func( int num){} void func( int num){} |
5. 매개변수의 디폴트 값(Default Value)
C++에서는 함수의 매개변수에 '디폴트 값'을 설정할 수 있다.
int func( int num = 7) { return num + 1; } |
이것의 의미는, "함수호출 시 인자를 전달하지 않으면 7이 전달된 것으로 간주하겠다." 이다.
int func( int num1 = 5, int num2 = 2) { return num1 + num2; } int main( void) { func( ); func( 5, 2); return 0; } |
따라서 위 예제의 호출 결과값은 완전히 동일하다.
또한, 디폴트 값이 설정되어 있으면, 함수 호출에 필요한 매개변수의 수보다 적은 수의 인자전달로
해당 함수를 호출할 수 있고, 나머지 부족한 부분은 디폴트 값으로 채워진다.
(1) 디폴트 값은 함수의 선언부에 위치해야 한다. 만약 디폴트 값이 함수 선언부에 위치하지 않는다면,
적은 수의 매개변수로 호출이 가능할 수가 없다.
(2) 디폴트 값은 항상 함수 우측의 매개변수부터 채워야 한다. 함수에 전달되는 인자가 왼쪽에서부터
오른쪽으로 채워지기 때문이다.
int func( int num1 = 5, int num2 = 2); // 가능 int func( int num1, int num2 = 2); // 가능 int func( int num1 = 5, int num2); // 불가능 |
6. 인라인(inline) 함수
C언어 매크로 함수의 단점을 극복하고, 장점만을 얻기 위한 방식이다.
매크로 함수의 장점 : 일반적인 함수에 비해 수행속도가 빠르다.
매크로 함수의 단점 : 복잡한 함수를 매크로의 형태로 정의하는데 한계가 있다.
#define SQUARE(x) ((x)*(x)) // 매크로 함수 inline SQUARE( int x) // 인라인 함수 { return x * x; } |
매크로를 통한 함수의 인라인화는 전처리기에 의해서 처리되지만, 키워드 inline을 이용한 함수는
컴파일러에 의해서 처리가 된다.
※ 매크로 함수만의 장점
- 자료형에 의존적이지 않는다.
7. 이름공간(namespace)
특정 영역에 이름을 붙여주기 위한 문법적 요소이다. 프로젝트 진행 중 동일한 이름의 함수로 인한 충돌 문제를
해결하기 위해 고안되었다.
namespace first { void func( void); } namespace second { void func( void); } int main( void) { first::func(); second::func(); return 0; } |
※ 동일한 이름공간에 정의된 함수를 호출할 때에는 이름공간을 명시할 필요가 없다.
namespace first { void func( void); } namespace first { void newfunc( void); } namespace second { void func( void); } int main( void) { first::func(); return 0; } void first::func( void) { newfunc(); // first의 영역이라 이름 생략 second::func(); // 다른 이름의 영역 함수 호출 } |
(1) 이름 공간의 중첩
논리적의 형태와 맞게 다음과 같이 사용이 가능하다.
namespace first { int num = 1; namespace second { int num = 2; } namespace third { int num = 3; } } int main( void) { std::cout<< first::num << std::endl; std::cout<< first::second::num << std::endl; std::cout<< first::third::num << std::endl; return 0; } |
8. using을 이용한 이름공간의 명시
"이름공간을 지정하지 않고 호출하겠다"라고 명시하는 것이다.
namespace first { namespace second { int num = 2; } } int main( void) { using first::second::num; num = 2; return 0; } |
명시되는 객체(위의 num)는 함수가 될 수도 있고, 변수가 될 수도 있다.
하지만 선언한 명령을 수행한 이후부터 효력이 발생하며, 선언한 함수를 벗어나게 되면 무효하다.
따라서 전역변수로 선언해주면 프로그램 종료 전까지 유효하다.
using std::cout; using std::cin; using std::endl; int main( void) { int n; cout<< "test" << endl; cin>> n; return 0; } |
하지만 이것마저 귀찮다면, std의 이름영역에 선언된 모든 것을 지정의 생략을 할 수 있다.
그러나 그만큼 충돌의 확률이 상대적으로 높아진다.
using namespace std; int main( void) { int n; cout<< "test" << endl; cin>> n; return 0; } |
9. 이름공간(namespace)의 별칭지정
이름공간이 중첩되면서까지 과도하게 사용되는 경우는 극히 드물다. 그러나 상황에 따라 사용되었을 때,
다음과 같이 별칭을 사용하여 간단하게 할 수 있다.
namespace AA { namespace BB { namespace CC { int num = 5; } } } int main( void) { cout<< AA::BB::CC::num; // 별칭 지정 namespace ABC = AA::BB::CC; cout<< ABC::num; return 0; } |
10. 범위지정 연산자(::)(Scope Resolution Operator)의 또 다른 기능
지역변수의 이름이 전역변수의 이름과 같을 경우, 전역변수는 지역변수에 가려진다.
하지만 범위지정 연산자를 통해 다음과 같이 전역 변수에 접근가능하다.
#include <iostream> using std::cout; using std::endl; int val = 100; int main( void) { int val = 20; cout<< val+3 << endl; cout<< ::val+3 << endl; return 0; } |
출처 : 윤성우 열혈 C++ 프로그래밍
'프로그래밍 언어들 > C++' 카테고리의 다른 글
CHAPTER05 - 복사 생성자(Copy Constructor) (0) | 2016.11.14 |
---|---|
CHAPTER04 - 클래스의 완성-2 (0) | 2016.11.14 |
CHAPTER04 - 클래스의 완성-1 (0) | 2016.11.14 |
CHAPTER03 - 클래스의 기본 (0) | 2016.11.12 |
CHAPTER02 - C언어 기반의 C++ (1) | 2016.11.12 |