C 언어
같은 반에 자라(Zara)라는 이름을 가진 두 사람이 있다고 가정해 보세요. 이들을 구별하려면 이름 외에 추가 정보가 필요합니다. 예를 들어 사는 지역이 다르다면 지역을, 아니면 부모님 이름을 사용하겠죠.
같은 상황이 C++ 애플리케이션에서도 발생할 수 있습니다. 예를 들어 xyz()라는 함수가 있는 코드를 작성 중인데, 사용 가능한 다른 라이브러리에도 같은 함수 xyz()가 있습니다. 이제 컴파일러는 코드 내에서 어느 버전의 xyz() 함수를 참조하는지 알 수 없습니다.
네임스페이스(namespace)는 이 어려움을 극복하기 위해 설계되었으며, 다른 라이브러리에 있는 같은 이름의 유사한 함수, 클래스, 변수 등을 구별하기 위한 추가 정보로 사용됩니다. 네임스페이스를 사용하면 이름이 정의되는 컨텍스트를 정의할 수 있습니다. 본질적으로 네임스페이스는 범위(scope)를 정의합니다.
네임스페이스 정의는 키워드 namespace로 시작해 네임스페이스 이름이 뒤따릅니다.
namespace namespace_name {
// 코드 선언
}
네임스페이스가 활성화된 함수나 변수 버전을 호출하려면 네임스페이스 이름을 ::로 앞에 붙입니다.
name::code; // code는 변수 또는 함수
네임스페이스가 변수와 함수를 포함한 엔티티들을 어떻게 범위화하는지 봅시다.
Live Demo#include <iostream>
using namespace std;
// 첫 번째 네임스페이스
namespace first_space {
void func() {
cout << "Inside first_space" << endl;
}
}
// 두 번째 네임스페이스
namespace second_space {
void func() {
cout << "Inside second_space" << endl;
}
}
int main() {
// 첫 번째 네임스페이스 함수 호출
first_space::func();
// 두 번째 네임스페이스 함수 호출
second_space::func();
return 0;
}
위 코드를 컴파일하고 실행하면:
Inside first_space Inside second_space
네임스페이스 이름 앞에 붙이는 것을 피하려면 using namespace 지시자를 사용할 수 있습니다. 이 지시자는 컴파일러에게 이후 코드가 지정된 네임스페이스의 이름들을 사용함을 알립니다. 네임스페이스는 이후 코드에 암시됩니다.
Live Demo#include <iostream>
using namespace std;
// 첫 번째 네임스페이스
namespace first_space {
void func() {
cout << "Inside first_space" << endl;
}
}
// 두 번째 네임스페이스
namespace second_space {
void func() {
cout << "Inside second_space" << endl;
}
}
using namespace first_space;
int main() {
// 첫 번째 네임스페이스 함수 호출
func();
return 0;
}
위 코드를 컴파일하고 실행하면:
Inside first_space
using 지시자는 네임스페이스 내 특정 항목을 참조하는 데도 사용할 수 있습니다. 예를 들어 std 네임스페이스에서 cout만 사용하려 한다면:
using std::cout;
이후 코드는 네임스페이스 앞붙임 없이 cout을 참조할 수 있지만, std 네임스페이스의 다른 항목들은 여전히 명시적이어야 합니다.
#include <iostream>
using std::cout;
int main() {
cout << "std::endl is used with std!" << std::endl;
return 0;
}
위 코드를 컴파일하고 실행하면:
std::endl is used with std!
using 지시자로 도입된 이름은 일반 범위 규칙을 따릅니다. 이름은 using 지시자 지점부터 지시자가 발견된 범위의 끝까지 보입니다. 외부 범위에서 같은 이름으로 정의된 엔티티들은 숨겨집니다.
네임스페이스는 여러 부분으로 정의될 수 있으며, 따라서 네임스페이스는 개별적으로 정의된 부분들의 합으로 구성됩니다. 네임스페이스의 개별 부분들은 여러 파일에 걸쳐 분산될 수 있습니다.
따라서 네임스페이스의 한 부분이 다른 파일에 정의된 이름을 필요로 한다면, 그 이름은 여전히 선언되어야 합니다. 다음 네임스페이스 정의 작성은 새 네임스페이스를 정의하거나 기존 네임스페이스에 새 요소를 추가합니다.
namespace namespace_name {
// 코드 선언
}
네임스페이스는 다른 네임스페이스 안에 정의될 수 있습니다.
namespace namespace_name1 {
// 코드 선언
namespace namespace_name2 {
// 코드 선언
}
}
중첩 네임스페이스 멤버에 접근하려면 결정 연산자를 사용합니다.
// namespace_name2 멤버 접근 using namespace namespace_name1::namespace_name2; // namespace_name1 멤버 접근 using namespace namespace_name1;
위 문장에서 namespace_name1을 사용하면 namespace_name2 요소들이 범위에서 사용 가능해집니다.
#include <iostream>
using namespace std;
// 첫 번째 네임스페이스
namespace first_space {
void func() {
cout << "Inside first_space" << endl;
}
// 두 번째 네임스페이스
namespace second_space {
void func() {
cout << "Inside second_space" << endl;
}
}
}
using namespace first_space::second_space;
int main() {
// 두 번째 네임스페이스 함수 호출
func();
return 0;
}
위 코드를 컴파일하고 실행하면:
Inside second_space
C 언어
C++ 연산자 오버로딩 이 튜토리얼에서는 예제와 함께 연산자 오버로딩을 학습합니다. C++에서는 객체와 구조체 같은 사용자 정의 타입에 대해 연산자 작동 방식을 변경할 수 있습니다. 이를 연산자 오버로딩(operator overloading)이라 합니다. 예를 들어, Complex 클래스로 표현되는 복소수 객체 c1, c2, result 세 개를 만들었다고 가정합시다. 연산자 오버로딩으로 + 연산자 작동 방식을 재정의하면, 다음과 같이 c1과 c2의 복소수를 더할 수 있습니다: result = c1 + c2; 다음과 같은 방식 대
C++ 상속 이 튜토리얼에서는 예제를 통해 C++의 상속에 대해 학습합니다. 소개 상속은 C++에서 객체 지향 프로그래밍의 핵심 기능 중 하나입니다. 기존 클래스(기반 클래스)로부터 새로운 클래스(파생 클래스)를 생성할 수 있게 해줍니다. 파생 클래스는 기반 클래스의 기능을 상속받으며 자체적인 추가 기능을 가질 수 있습니다. 예를 들어: class Animal { // eat() 함수 // sleep() 함수 }; class Dog : public Animal { // bark() 함수 }; 여기서 Dog 클래