본문 바로가기

내가 꾸는 꿈

포인터#3 [노베이스 게임개발 17일차]

반응형

오늘은 포인터에 대해 더 자세히 배웠다.

 

전에 배열에 대해 공부했었는데 사실 이 배열은 포인터를 나타내는 것이었다.

배열변수 Array를 100개 선언해 주고 Array[0], [1]을 100, 200으로 할당해 주고 출력하면 당연히 100과 200이 나올 것이다.

그런데 포인터타입인 pArray을 만들어 준 다음 원래였다면 &를 붙여서 Array를 사용해야 하지만 &없이 사용해도 같은 결과가 나온다.

배열변수는 사실 포인터였다는 것이다.

 

 

그리고 문자열 또한 포인터로 사용할 수 있는데 이때 앞에 const를 붙여주어야 한다.

const는 상수라는 뜻인데 프로그램 안에 상수처럼 박혀있듯이 존재한다는 뜻이다.

그래서 프로그램이 시작함과 동시에 값이 정해져서 바뀌지 않는다.

그래서 strcpy로 문자열을 변경하려고 해도 빨간 줄이 그이면서 실행이 되지 않는다.

 

 

메모리 동적할당 : 배열이나 데이터를 컴퓨터의 메모리 중 힙(Heap) 영역에 자리시키는 것.

 

Heap 영역은 함수의 실행주기와 무관하게 프로그램 종료 시까지 살아남는 메모리 공간이다.

 

모든 컴퓨터는 메모리의 동적할당을 하고 있다.

그럼 왜 메모리의 동적할당을 해야 하는가?

 

구조체를 사용할 때에서 예를 들어 설명해 보겠다.

 

먼저 완전히 이해하지 못한 것 같아 설명이 틀릴 수도 있다는 점을 알리고 시작해 보겠다.

하나하나 설명하면 3번에서 마린이라는 변수로 구조체를 만들었다.

각각 체력, 마나, 이름에 대한 멤버변수를 집어넣었다.

 

그 후 마린의 포인터를 불러올 수 있게끔 하는 foo() 함수를 만들었다.

이 함수는 마린구조체에 m을 이용하여 각각 멤버변수를 할당해 준 후 m의 주소값을 리턴하는 함수이다.

 

마지막으로 메인함수에서 마린의 구조체 포인터 변수에 foo() 함수를 이용하여 주소값을 불러오게 만든 후 이름을 출력하도록 만들었다.

 

하지만 이 프로그램은 실행되지 않는다.

왜냐하면 10번의 변수는 함수가 끝나게 되면서 같이 파괴가 되기 때문이다.

 

이를 해결하기 위해서 메모리에 동적할당을 이용한다

 

함수가 실행되면 변수는 모두 파괴되지만 동적할당을 하게 되면 heap영역에 남게 되는데, 힙 영역에 할당하기 위해서는 malloc() 함수를 이용하여야 한다.

이 함수는 cstdlib 헤더파일에 선언되어 있다.

Type v = (Type*)malloc(sizeof(Type));

 

이때 멤버변수의 주소값을 사용할 때 불편함을 없애기 위해 (*m). 대신 m->을 사용할 수 있다.

이렇게 되면 변수의 주소값은 파괴가 되지만 메모리에 동적할당된 실값은 파괴되지 않기 때문에 불변의 변숫값을 만들어 낼 수 있게 되는 것이다.

 

그렇게 되면 출력이 실행될 수 있다.

 

이때 동적할당을 프로그래머가 해제해주지 않는다면 이 메모리에 계속 남게 돼서 메모리를 점유하고 있게 된다.

이를 해제해 줘야 프로그램이 무거워지지 않기 때문에 해제하는 함수 또한 알아야 한다.

 

free() : cstdlib함수에 포함되어 있고 동적할당된 변수를 해제해 준다.

 

 

그리고 동적할당을 통해서 가변길이의 배열을 만들 수 있는데 

사용자로부터 입력받은 만큼의 배열을 만드는 함수를 만들었을 때 입력한 값에 따라 크기를 할당해 주기 위해 다음 구문을 사용했다.

myArray = (int*)malloc(sizeof(int) * input);

int의 크기에 사용자가 입력하게 될 input의 수만큼 곱하여 가변적인 길이를 만들어 줄 수 있게 된다.

 

100의 사용자 값을 입력하게 되면 가변적으로 크기가 할당되어 100개의 배열이 형성된 모습이다.

 

후기: 개강을 하면서 시간이 부족해졌지만 다시 시간을 내어 시작해 보려고 한다. 너무 어려운 내용이기 때문에 계속해서 복습하며 정진해 나가야겠다.

 

 

 

 

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

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

반응형