Part 1. C++ 로의 전환
1장. C 기반의 C++ 1
1-1 printf와 scanf를 대신하는 입출력 방식
1-2 함수 오버로딩
1-3 디폴트 매개 변수
1-4 인라인 함수
1-5 이름공간에 대한 소개
1-6 연습문제 정답 및 해설
1-7 OOP 프로젝트 1단계
1. printf와 scanf를 대신하는 입출력 방식
첫째, C++ 언에서는 iostream.h 라는 이름의 헤더파일을 포함해야 한다. C언어에서는 헤더파일 stdio.h를 포함한다.
[C++]헤더 선언에서 <iostream.h>와 <iostream>의 차이
입출력 헤더 와 C++에서 가장 기본적인 입출력 헤더는 이다. 분명 C를 처음 배웠을 때, 나를 비롯한 대부분의 초심자들에게 가장 익숙한 헤더는 일 것이다. C++을 공부하는 지금, 왜 C++에서는 라고
simplex3510.tistory.com
둘째, 출력을 하기 위해서는 다음과 같은 형태를 취해야 한다.
cout << 출력 대상
C언어의 printf 함수는 출력하고자 하는 대상의 출력 포맷을 정의해줘야 했다.
// 정수 출력
printf("정수: %d\n", integer);
// 문자 출력
printf("문자: %c\n", character);
셋째, 출력 대상을 이어서 표시할 수 있다. 즉 다음과 같이 출력할 대상이 둘 이상이라면 << 연산자를 이용해서 연속적인 출력을 요구할 수 있다.
cout << 1 << 'apple' << 'code'
cout << 1 << 'apple' << 'code' <<endl;
endl은 다음 줄로 넘어가라는 의미를 지닌다. 즉 개행문자를 입력한 것과 같은 효과를 가진다.
endl을 출력할 경우 개행문자를 출력하게 되고, 추가로 출력 버퍼를 비우는 효과도 얻게 된다. 따라서 C언어에서처럼 버퍼를 비우는 작업을 추가로 할 필요가 없다.
넷째, 키보드로부터 데이터를 입력받기 위해서는 다음과 같은 형식을 취한다.
cin >> 입력변수
cin >> val1;
이는 키보드로부터 받은 입력을 변수 val1에 대입하라는 의미이다. int val1; 을 선언할 경우 정수형을, double val1; 을 선언할 경우 실수형을 입력해야 한다.
다섯째, 데이터의 입력과 출력에 과거와 현재의 문법이 변경되었다. 헤더파일에 <iostream.h> 이 아닌 <iostream>을 쓸 경우, cout, cin, endl을 대신해서 std::cout, std::cin, std::endl 등을 사용해야 한다.
2. 함수 오버로딩
호출하고자 하는 함수는 다음 두가지 정보를 가지고 찾아낼 수 있다.
'함수의 이름' + '매개 변수의 정보'
이때, 함수의 이름은 같지만 매개변수의 타입이나 개수가 다른 것 을 함수 오버로딩 이라고 한다.
int function1(int v){
...
}
int function1(int v, int q){
...
}
위의 두 함수는 오버로딩 되었다.
그러나 아래는 함수가 오버로딩 되었다고 착각하기 쉬운 경우의 코드이다.
void function(void){
std::cout<<"function(void) call"<<std::endl;
}
int function(void){
std::cout<<"fundtion(char c) call"<<std::endl;
return 1;
}
int main(void){
function();
return 0;
}
리턴 타입만 달라서는 함수가 오버로딩되지 않는다.
3. 디폴트 매개 변수
int function(int a=0){
return a+1;
}
여기서 매개 변수를 선언하는 부분을 보면 a는 0으로 설정되어 있다. 이것이 디폴트 매개 변수이다. 이것이 의미하는 바는 다음과 같다.
"이 함수를 호출하면서 아무런 인자도 전달하지 않으면 0이 들어온 것으로 간주하겠다." 즉 아래 두 문장은 같은 의미를 지닌다.
"function()" == "function(0)"
4. 인라인 함수
in-line 함수의 의미부터 파악해보자. in은 '내부' 를 의미하고, line은 '프로그램 라인' 을 의미한다.
따라서 인라인 함수는 프로그램 라인 안으로 들어가버린 함수라는 의미를 지닌다.
아래는 C++ 스타일로 in-line 화 된 코드이다.
#include <iostream>
inline int SQUARE(int x){
return x*x;
}
int main(void){
std::cout<<SQUARE(5)<<std::endl;
return 0;
}
C 언어에서는 매크로를 사용하였는데, C++ 에서는 성능 향상을 목적으로 함수를 inline화 하기 위해서 매크로를 사용할 필요가 없다.
inline 이라는 키워드만 붙여주면 되는 것이다.
매크로를 이용한 in-line 화는 전처리기에 의해서 처리되지만, 키워드 inline 을 이용한 함수의 in-line 화는 컴파일러에 의해 처리된다.
5. 이름공간에 대한 소개
충돌이슈를 해결하기 위해 이름공간(namespace) 라는 문법이 C++ 표준에 새롭게 포함되었다.
이름공간이 다르면 같은 이름의 변수나 함수의 선언이 허용된다.
A_COM :: function();
위 코드에서 '::' 연산자를 가리켜 범위 지정 연산자 라고 한다.
즉 "A_COM 이라는 이름공간 안에 선언되어 있는 function 함수를 호출하라" 와 같은 의미를 지닌다.
이제 cout, cin, endl 을 참조할 때마다 "std:: " 을 앞에다 붙여줘야 하는 이유에 대해 알게 되었다.
일반적으로 지역변수는 전역변수의 이름을 가린다.
**보충설명 : 함수 내부에서 전역변수와 같은 이름의 지역변수가 선언되면, 그 함수 내부에서는 지역변수가 전역변수를 덮어쓴다(가린다). 함수 내부에서는 전역변수가 보이지 않게 되고, 대신 지역변수가 사용되는 것이다.
int val = 100;
int main(void){
int val = 100;
::val+=1; // 아래 추가 설명
return 0;
}
::val+=1; 이 줄의 연산에 의해 값이 1 증가되는 변수는 지역변수와 전역변수 중 어느 것이 될까?
범위지정 연산자(::)의 왼편에는 접근하고자 하는 이름공간이 오고, 오른편에는 접근하고자 하는 변수 혹은 함수의 이름이 오게 된다.
그러나 위의 경우 이름공간이 존재하지 않는다.
이는 "전역 변수로 선언되어 있는 변수 val에 접근해라" 라는 의미를 가진다.
이처럼 범위 지정 연산자는 전역 변수에 접근하기 위한 용도로도 사용 가능하다.
'프로그래밍 언어 > C++' 카테고리의 다른 글
[열혈강의 C++] 5장. 복사 생성자 (0) | 2024.05.18 |
---|---|
[열혈강의 C++] 4장. 클래스의 완성 (0) | 2024.05.17 |
[열혈강의 C++] 3장. 클래스의 기본 (0) | 2024.05.17 |
[열혈강의 C++] 2장. C 기반의 C++ 2 (0) | 2024.05.17 |
[총정리] 윤성우 열혈 C++ 정리 (0) | 2024.05.17 |