About C++ – “멤버 함수 선언하기, namespace, using의 뜻”
About C++ – “멤버 함수 선언하기, namespace, using의 뜻”
멤버 함수의 선언과 정의
클래스 내에 나타난 함수의 프로토타입은 함수를 선언하는 것을 의미합니다. 실제 함수를 사용하기 위해서는, 멤버 함수에 대한 정의부터가 필요합니다.
멤버함수를 정의하는 방법에서는 클래스 안에서 정의하는 방법, 클래스 밖에서 정의하는 방법이 있습니다. 하지만, 클래스 안에서 정의하는 경우는 클래스의 몸체가 너무 커질 수 있으므로 잘 사용하지 않는 방식이라고 합니다.
class Dog
{
private:
int age;
public:
int getAge()
{
return age;
}
void setAge(int a)
{
age=a;
}
};
위의 코드는 멤버 함수를 클래스 안에서 정의하는 경우입니다. age값을 출력하기 위해 필요한 getAge, 입력받기 위해 필요한 setAge 함수가 정의되어 있는 것을 볼 수 있습니다.
class Dog{
private
:
int age
;
public
:
int getAge()
; // 멤버함수 getAge선언
void setAge
(int age)
; // 멤버함수 setAge선언
}
;
// 리턴형 클래스명::멤버함수명(매개변수 리스트) 로 클래스 외부에서 정의합니다.
위의 코드에서 Dog
클래스를 선언하고, 그 밖에다가 멤버 함수인 getAge
와 setAge
를 정의했습니다.
리턴형 클래스명::멤버함수명
으로 선언할 수 있습니다. 그런데, ::
는 무엇일까요?
범위 지정 연산자 ::
멤버함수가 어느 클래스에 포함되어 있는지를 나타낼 때 사용하는 연산자입니다.
#include <iostream>
using std::cout;
int a=3;
int main()
{
int a=10;
a=a+10; cout<<a<<",";
::a=::a+3;cout<<::a;
return 0;
}
잠시 위의 코드를 살펴보겠습니다. 예전에 전역 변수와 지역 변수에 대하여 포스팅한 적이 있었는데(About C – “지역 변수, 전역 변수, 기억 클래스” – GdsanaDEV_ 참고) 이를 참고해 보시면 이해가 더 잘 될 것입니다. 3줄의 a는 전역 변수이고 6줄의 a는 지역 변수임을 확인할 수 있을 것입니다.
7줄에서 a에 10을 더했으므로 지역 변수의 a는 20이 될 것입니다.
그 아래의 8줄 코드를 봅시다. 범위 지정 연산자인 ::를 사용하여 전역 변수에 접근했습니다. 그러므로, 그 다음의 a는 3+3인 6이 출력되는 것입니다.
namespace란?
#include <iostream>
int add(int x, int y)
{
return x + y;
}
int add(int x, int y)
{
return x + y;
}
int main()
{
std::cout << add(1, 2);
return 0;
}
위의 코드를 살펴보겠습니다. 위의 코드를 실행하면 오류가 날 것입니다. 그 이유는 똑같은 이름의 add
라는 함수가 충돌하기 때문입니다. 이러한 상황을 방지하기 위해서 도입된 것이 namespace
입니다. 모든 식별자가 유일하도록 보장하는 코드 영역을 정의하는 것입니다.
#include <iostream>
namespace FIRST {
int add(int x, int y)
{
return x + y;
}
}
namespace SECOND {
int add(int x, int y)
{
return x + y;
}
}
int main()
{
std::cout << FIRST::add(1, 2);
return 0;
}
각각의 함수에 FIRST, SECOND
라는 namespace
를 정의하고 main
함수에서 add
함수를 사용할 때 그것이 어느 부분의 add
함수인지 범위지정 연산자를 이용해 지정해주었습니다. 전의 코드와 다르게 위의 코드가 오류가 나지 않는 이유입니다.
위의 사실을 알게 된다면 코드의 std::
가 무엇을 의미하는지도 알 수 있게 됩니다. std namespace
는 C++ 표준 라이브러리의 네임스페이스입니다. std::cout
는 표준객체의 namespace
의 cout
를 사용하겠다는 의미가 되는 것입니다.
#include <iostream>
using namespace std;
int cout()
{
return 1;
}
int main()
{
cout << "Hello World!n";
}
위는 using 지시문을 사용하여 std 네임스페이스의 모든 것을 사용하고 싶다는 것을 나타낸 예제입니다. 이 과정에서, 컴파일러는 인식하지 못하는 이름을 찾거나 네임스페이스를 알 수 없는 것을 만나면, std 네임스페이스를 검사합니다.