[day2] C++ 준비운동 (함수, namespace 등)
- function
- scope
- namespace
- operand
- predefine (전처리기)
function (함수)
여러번 사용되는 코드를 함수로 정의하고, 지속적으로 사용할 수 있다.
int addTwoNumbers(int a, int b){
int sum = a+b;
return sum;
}
int main(){
cout << addTwoNumbers(1,2) << endl;
cout << addTwoNumbers(3,4) << endl;
cout << addTwoNumbers(5,6) << endl;
return 0;
여기서, 주의할것은 main함수와 addTwoNumbers 함수 순서를 바꾸면 안된다.
컴파일러는 코드 처음부터 순서대로 컴파일을 진행하고, main을 먼저 정의하면, 그 안에서 불러오는 addTwoNumbers가 정의되지 않는 오류가 생긴다.
main을 정의하기 전에 앞에 addTwonNumbers에 관한 기본 정보만 미리 정의해두면 해결이 가능하다.
// error, function not defined
int main(){
cout << addTwoNumbers(1,2) << endl;
cout << addTwoNumbers(3,4) << endl;
cout << addTwoNumbers(5,6) << endl;
return 0;
}
int addTwoNumbers(int a, int b){
int sum = a+b;
return sum;
}
// Solution
int addTwoNumbers(int a, int b);
int main(){
cout << addTwoNumbers(1,2) << endl;
cout << addTwoNumbers(3,4) << endl;
cout << addTwoNumbers(5,6) << endl;
return 0;
}
int addTwoNumbers(int a, int b){
int sum = a+b;
return sum;
}
Scope
C++ 에서는 {} 로 영역이 결정된다.
그러면 {} (중괄호) 안에 {} 중괄호가 있을때는 어떻게 될까??
다음과 같이 x를 할당하면, 다른 메모리에 각각 저장됨을 확인할 수 있다.
int main(){
int x = 0;
cout<<x<<" "<<&x<<endl;//0 0x7ffee27815d8
{
int x = 1;
cout<<x<<" "<<&x<<endl;//1 0x7ffee27815ac
}
return 0;
}
그냥 x를 외부의 것을 사용할 수도 있다.
int main(){
int x = 0;
cout<<x<<" "<<&x<<endl;//0
{
x = 1; //위에서 선언된 x 를 사용함
cout<<x<<" "<<&x<<endl;//1 0x7ffee27815d8
}
return 0;
}
이건 2개의 함수에 대해서도 적용이된다.
사실 2개의 함수는 한 함수 A 안에 B가 있는것으로 해석할 수 있기때문이다.
(1, 2는 같다.)
//1
int B()
{
cout >> "Hello" >> endl;
return 0;
}
int A()
{
B();
return 0;
}
//2
int A()
{
{
cout >> "Hello" >> endl;
}
}
예를 들어보자.
다음과 같이 main 에서 doSth를 부를때, x는 main과 doSth가 서로 다르게 메모리에 할당됨을 확인할 수 있다.
(나아가면, 함수를 부를때는 변수의 값만이 전달되지, 변수의 메모리주소까지 전달되지 않음을 확인할 수 있다.)
void doSth(int x){// 값 자체만 전달이 되었음.
x = 1;
cout<<x<<" "<<&x<<endl; //0 0x7ffee27815d8
}
int main(){
int x = 0;
cout<<x<<" "<<&x<<endl;//1 0x7ffee27815ac
doSth(x);
cout<<x<<" "<<&x<<endl;//0 0x7ffee27815d8
return 0;
}
namespace
여러 함수들을 묶어서 정의하고 싶다. 라는 생각을 해결할 수 있는 기능이다.
my_space 라는 namespace를 정의하고, 그아래 2개의 function을 정의했다.
이를 사용하려면 '::'를 사용해서 네임스페이스이름::함수 형태로 사용할 수 있다.
namespace my_space{
int add(int x, int y){
return x + y;
}
int multiply(int x, int y){
return x * y;
}
}
int main(){
cout << doSth(7, 8) << endl;
cout << my_space::add(7, 8) << endl;
}
또한, namespace안의 함수는 그 안의 함수와만 이름이 겹치지않으면 된다!
(즉 namespace안의 함수이름과 외부 함수 이름이 같아도.. 된다!)
namespace my_space{
int doSth(int x, int y){
return x + y;
}
}
int doSth(int x, int y){
return x * y;
}
int main(){
cout << doSth(7, 8) << endl;
cout << my_space::doSth(7, 8) << endl;
}
뿐만아니라, 여러번 사용하는 namespace라면 using을 사용해서 미리 정의해둘 수도 있다!
std는 우리가 print를 할때 자주사용하는 namespace이다. 그래서 나는 이걸 미리 정의하고, '네임스페이스::' 빼고 사용한다.
#include <iostream>
//origin
int main(){
std::cout << doSth(7, 8) << std::endl;
std::cout << my_space::doSth(7, 8) << std::endl;
}
// upgrade
using namespace std;
int main(){
cout << doSth(7, 8) << endl;
cout << my_space::doSth(7, 8) << endl;
}