본문 바로가기

내가 꾸는 꿈

포인터#5, 매크로 [노베이스 게임개발 19일차]

반응형

오늘은 포인터의 나머지 내용들과 매크로에 대한 내용을 공부하였다.

 

 

먼저 배열의 초기화의 경우에는 for를 이용한 반복문을 통해 하나씩 0으로 만들어 주는 것도 가능하지만

그림과 같이 myarray[10] = { 0, }를 이용하면 모든 배열이 0으로 초기화가 된다.

 

다음으로 구조체포인터의 초기화는 nullptr을 이용하면 간단하게 할 수 있다.

 

또 구조체포인터의 배열의 초기화는 배열과 비슷하게 { nullptr, }을 이용하면 된다.

 

그다음으로는 포인터의 포인터에 대해 배웠다.

간단하게 주소값의 주소값을 받는다고 생각하면 된다고 하는데 

방금 코드에서 나온 Marine* marine1[40]이 바로 이중 포인터라고 한다.

 

이것을 다른 식으로 표현하면

 

 

이렇게 표현할 수 있겠다.

 

왜냐하면 배열의 이름이 포인터이므로 Marine* marine[40]도 이중포인터고 Marine** 또한 이중포인터이기 때문이다.

그림에서는 이중포인터에 40개의 메모리를 할당한 후 추후 배열을 넣어주기만 하면 이 둘이 같은 역할을 하게 된다.

 

아직은 완벽히 이해하지 못했지만 또 공부하며 다시 익혀보겠다.

 

마지막으로 배울 것은 파라미터에서의 포인터이다.

 

파라미터에서 포인터를 사용하면 변수의 주소값도 받을 수 있지만 배열변수를 받을 수도 있다.

 

보통 파라미터에 배열의 수까지 받으려 하기 때문에 이를 보고 구분할 수 있다.

 

 

그림에서 처럼 foo라는 함수의 파라미터에 포인터와 int타입이 둘 다 있는데 첫 번째는 배열을 받기 위해 두 번째는 배열의 수를 받기 위해 사용한다. 그래야 함수 내에서 배열의 수를 이용해 무언가 할 수 있기 때문이다. 

 

다음과 같이 문자열의 포인터 또한 파라미터에서 사용할 수 있다.

foo함수의 파라미터로 const char*를 이용해서 값을 받은 후 출력을 하게 되는데 이때 hello는 큰따옴표 안에 들어가 하드코딩이 되어 절대 변하지 않는 값을 메모리의 상수 데이터 영역에 남기게 된다.

이후 다시 함수를 호출하게 된다면 새로 메모리에 hello를 남기는 것이 아니라 상수 데이터 영역에 있는 hello의 메모리를 불러오는 것이다.

 

문자열 부분을 공부하다 보니 내가 아직 메모리에 대한 지식이 부족한 것 같아 이 부분을 체크해 놓고 좀 더 공부해야겠다.

 

 

 

다음 배운 것은 매크로다.

매크로는 C, C++에서 나타나는 독특한 특징이다.

전처리기라고도 하며 다양한 역할을 하게 된다.

그동안 코드 앞에 #을 사용하여 사용하던 것이 모두 전저리였다.

 

이전에 공부했었던 swap을 예시로 들어서 설명하자면

 

v1과 v2 그리고 temp를 사용하여 두 수의 값을 변경하고자 하는 게 목표였다.

이때 #define을 사용한 매크로를 통해 swap을 수행할 수 있는데

#define은 어떤 연산을 하는 것이 아닌 소스코드를 통째로 가져오는 역할을 한다.

위에서와 같이 #define SWAP(X, Y, T)를 통해 매크로를 먼저 정했다. 이때 X Y T는 토큰이라고 부르는데 파라미터에서 사용한 것과 비슷하게 이 괄호에 올 변수들을 그냥 그대로 바꿔주는 것이다.

 

아래 그림에서 처럼 X 자리에 v1을 Y 자리에 v2를 T 자리에 temp를 넣어주면

T = X; X = Y; Y = T 가 그냥 소스코드 그대로 temp = v1; v1 = v2; v2 = temp로 교체가 되는 것이다.

그렇게 했을 때 값은 정상적으로 뒤바뀌게 된다.

매크로 맨 끝을 보면 T 뒤에 ;가 없는데 만약 ;를 넣어준다면 main 함수 안에서 ;를 넣지 않아도 정상 작동한다.

소스코드를 그냥 그대로 갖다 붙인다는 말이다.

 

 

 

또 상수를 아예 지정해 버릴 수도 있다.

예를 들어

이것을 이용하면 PI가 3.141592의 값으로 아예 박혀버린다.

int pi = PI 이렇게 했을 시 pi변수에 3.141592라는 값이 들어가게 된다.

 

 

다른 예로 #if를 이용하여 main함수 자체를 바꿔버릴 수도 있다.

먼저 EXECUTE_NUM이라는 값을 1로 만들어 준 후

#if를 이용해 0일 경우와 1일 경우 원하는 main함수를 실행하도록 만들어 줄 수 있다.

이 코드에 경우 world를 출력하는 아래 main함수가 실행될 것이다.

앞의 EXECUTE_NUM의 숫자를 바꿈으로써 원하는 코드를 실행하는 것이다.

 

원하는 플랫폼에 따라 숫자를 바꿔 실행하도록 만들어 줄 수가 있는 것이다.(예를 들면 PC, XBOX, PS에서 각각 원하는 플랫폼의 코드를 선택하여 실행시킬 수 있다.)

실행되지 않는 소스코드들은 아예 없는 것처럼 컴퓨터가 취급하기 때문에 연산 자체도 일어나지 않아 매우 가벼워진다.

 

비슷한 것으로 #ifdef도 있는데 #define이 되어있냐 아니냐에 따라 판단하여 코드를 실행한다. define이 되어있을 시 실행된다.

 

#ifndef은 #define이 되어있지 않을 시 실행되는 매크로이다.

 

 

 

이러한 매크로함수의 장점은 굉장히 빠르다는 것이다. 단순히 소스코드만을 옮기기 때문에 다른 연산을 할 필요가 없기 때문에 매우 빠르다.

단점으로는 매크로파일을 많이 쓴다면 프로그램의 크기가 커진다. 그리고 중단점을 찍을 수 없어 오류를 찾기가 힘들다.

그래서 수행능력은 좋지만 너무 많이 쓴다면 여러 문제가 발생했을 때 고치기가 매우 어렵기 때문에 필요할 때만 사용해야 한다.

 

 

 

후기: 열심히 챗 gpt와 씨름하다 보니 내가 궁금한 것을 그때그때 물어볼 수도 있고 뭔가 빠트리지 않고 모두 공부할 수 있어 너무 좋은 선생님을 만난 기분이다. 이것을 잘 활용하여 내가 원하는 프로그램을 만들 때까지 열심히 노력해야겠다.

다음 시간은 드디어 직접 프로그램을 만드는 시간이다. 나의 프로그래밍 실력이 어느 정도인지 파악할 수 있고 어느 부분에서 실제로 사용되는지 체험해 볼 수 있기 때문에 기대가 된다.

 

 

 

*본 포스팅은 학생의 입장에서 쓴 글로 정확하지 않을 수 있으며 댓글로 피드백해 주시면 감사하겠습니다.

클래스 101 개발자 라라 님의 강의를 통해 학습한 내용을 기반으로 두고 있습니다.

반응형