C++

[day2] C++ 준비운동 (함수, namespace 등)

리하이 2021. 8. 3. 12:33
  • 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;
}