앞에서
DigitalOut led(LED1);
이 코드가 main.cpp실행되면 어떤과정으로 진행되는지를 봤다.
앞 글에선 헤더를 읽어들이는 과정을 봤고, 이번엔 DigitalOut라고 간단하게 적는걸로 어떻게 클래스로 받아들이는지, C++문법의 어디에 해당되는지를 namespace를 통해 보려고 한다.
앞 글에서 살짝 설명 안한게 있는데, DigitalOut.h 헤더의 내부코드를 보면 DigitalOut이라는 클래스가 namespace mbed { } 안에 포함되있는 것을 볼 수 있다.
namespace에 대해 설명하면, namespace는 섹션을 구분해주는 명칭이라 보면 된다.
엄밀히 말해서 저기 있는 DigitalOut은 그냥 DigitalOut이 아니라 "mbed라는 섹션의 DigitalOut"이다.
만약 namespace mbed2 { }안에 똑같이 DigitalOut 클래스가 또 있다면 "mbed섹션의 DigitalOut"과 "mbed2섹션의 DigitalOut"은 완전 다른 클래스가 된다.
이런식으로 namespace는 DigitalOut이라는 이름이 다른파일에 또 있더라도 충돌하지 않게 구분해주는 역할을 한다.
namespace를 선언하는 방법은 위와같이
namespace name { }
이런방식으로 쓰면 되고 name에 이름을 적고 { } 안에 클래스나 함수를 넣을 수 있다.
namespace 안의 클래스나 함수를 호출하는 방법은 두가지가 있는데,
첫번째로는
name::class object;
name::function();
이런 방식으로 개별적으로 호출 할 수 있다.
(name에 namespace 이름, class에 클래스명, object에 객체명, function에 함수명)
두번째로는
using namespace name;
위 문장을 처음에 한번 써줌으로 name의 namespace를 미리 전부 가지고 와서
class object;
function();
앞의 name:: 을 생략하고 쓸 수 있다.
그러면 DigitalOut으로 다시 돌아가서 보면
DigitalOut led(LED1);
이 문장은
using namespace mbed;
이 문장이 어딘가에 미리 적혀 있기 때문에 저렇게 짧게 쓸 수 있다는 것을 알 수 있다.
(왜냐하면 앞에서 봤듯이 namespace mbed { }안에 DigitalOut이 포함돼있는데 "mbed"의 DigitalOut을 쓴다고 반드시 명시해야하지만 mbed::DigitalOut이라고 쓰지 않았기 때문이다.)
예상대로 mbed.h 를 열어보면 DigitalOut.h를 읽어들임과 동시에 맨 아래에 미리 using namespace mbed; 라고 적어준 것을 볼 수 있다.
그렇기 때문에 main.cpp 함수에서 일일히
mbed::DigitalOut
mbed::DigitalIn
이런식으로 mbed::를 붙히지 않고도
사용 할 수 있는 것이다.
저번 글의 내용과 종합적으로 정리하면
DigitalOut led(LED1);
이 문장은 DigitalOut이라는 클래스를 사용하기 위해
(1) mbed.h, DigitalOut.h의 헤더를 차례로 들어가서 내부에 출력을 구현하는 함수를 실행시키고,
(2) using namespace mbed;를 통해 mbed::를 생략하여 DigitalOut으로 짧게 쓸 수 있게 된 것이다.
C++의 기본적인 코드인
using namespace std; 를 적어줌으로써 std::cout이 아닌 cout 만 적는것도 똑같은 원리이다.
'Keil µVision5' 카테고리의 다른 글
keil C++ 정리 - (1) (0) | 2020.08.05 |
---|---|
Keil No target connected 에러 (0) | 2020.08.04 |