본문 바로가기

카테고리 없음

Unreal 기초 C++ (5)(포인터, 클래스)

이번에는 포인터에 대해 배울겁니다.

 

포인터 c++에서 중요한 겁니다.

 

여기서는 또 메모리에 대해 설명해야되는데요

 

메모리는 주로 "힙 메모리" 와 "스택 메모리" 로 나뉩니다.

 

Stack(스택, 정적 메모리)메모리는

간단하게 메모리 할당과 해제가 빠른 메모리입니다.

그런데 용량이 적어요

 

Heap Memory  (힙, 동적 메모리)

메모리 할당과 해제가 스택보다 느립니다.

그런데 용량이 많아요

 

스택은 주로 지역변수, 함수호출 등에 사용됩니다 지역변수는 나중에 전역변수 지역변수에 대해 알려드릴게요

일단 함수호출!! 여기서 사용됩니다.

 

힙은 데이터를 저장할 때 사용합니다.

클래스(객체)를 생성할때도 들어가고

즉 저장하는 용도로 많이 사용된다고 생각하면 편합니다.

 

즉 스택은 주로 실행 , 힙은 주로 저장

 

둘로 나뉜이유 또 효율성 이겠죠

 

대부분 어렵게 한이유는 효율성이라 보면 됩니다.

 

"그러면 스택에다가 저장을 많이하면 어덯게될까요? 지역변수라는거를 많이 만들면 결국 저장 되는거니까
스택 용량이 점점 많아질 거아니에요"

 

그땐 스택 오버플로우가 발생합니다.

간단하게

스택 메모리가  가득 차서 더 이상 사용할 수 없을때 발생하는 오류입니다.,

보통 지역변수가 많거나 혹은 아직 배우지 않은 재귀함수 (그냥 함수를 반복한다 생각하세요)

를 사용할 때 주로 발생할겁니다.

 

그래서 클래스에 변수를 저장해서 사용해야 되는데

 

전에 클래스 배울때

A a;이렇게 만들면 스택 메모리를 사용하게 됩니다.

 

그래서 힙 메모리에 클래스를 저장하려면 포인터를 사용해야합니다.

 

A* a = new A();

이렇게요!

*랑 new 가 생겼죠?

클래스 뒤에 *오면 포인터 클래스입니다.

 

new A(); 는 새로운 클래스 즉 A클래스를 새로 만든다는거에요

"어라 그러면 클래스는 여러개 가능한건가요?"

넵 가능합니다.

 

A* a =new A();

A* b = new A();

같은 클래스이지만 다른 곳에 저장되어있어요

즉 같은 차를 타지만 저 차는 다른 사람 소유의 차입니다.

 

포인터는  함수 실행법도 달라요

a->함수();

이렇게 .이아니라 ->를 사용해서 함수를 불러옵니다.

 

포인터는 클래스만 가능한가요?

아니요 int 등 다른변수도 가능합니다

 

int a = 1;

int* b = &a;

 

어라 &a; 는 뭐죠?

 

네 포인터에 대해 더 자세히 알아야합니다

포인터는 데이터를 담는게 아니에요

정확히는 주소를 담고 있습니다.

 

a 가 있는 데이터(공간) 주소는 0x0001이라고 합시다.

b는 이 주소값 0x0001을 가지고 있는거에요

즉 int* b = a; 로했다면 a의 주소가 아니라 a의 값 1 , 그러니 주소 1을 가지고 있는거에요

 

포인터는 그럼 주소를 가지고 뭘 할까요?

 

포인터는 a의 값을 변경 시켜줄 수 있습니다.

즉 포인터 b를 통해서 a를 변경시켜줄수있어요

 

일단 포인터 b를 통해서 a를 건들여봅시다

 

*b = 2;

//b = 2; 이러면 어떻게 될가요?

*b 포인터변수는 *가 앞에 있다면 주소로 찾아가서 값을변경 해줄수 있습니다. 즉 *b 는 a에요 

*b = 2로 하면 a는 2가 된겁니다.

그러면 b =2 로 하면 어떻게될가요 네 a의 주소를 버리고 모르는 주소 2로 가는거에요 a 집주소를 잃어버린겁니다.

 

그러면 이제 &a이거에 대해 알려드려야겠죠?

포인터에 주소를 넣어주는 방법입니다

즉 &변수 , 변수앞에 & 이게 오면 변수의 주소값이에요

 

아까 뭐라했죠? 포인터 는 주소값을 저장한다 그러니 주소값을 준거뿐입니다.

 

int a = 1;

int* b = &a;

int d = 2;

 

b = &d;

이렇게 하면 주소값 변경도 가능해요 즉 우리는 포인터를 통해서 다른 변수를 건들 수 있게 된겁니다.

 

그런데 또 이런게 있어요

int& f = a;

뭐죠 ? 왜 *이아니라 & 이게 있죠? 이건 참조 연산자 라고 한답니다

기능은 뭔가요?

 

f = 5;

를 하면 a가 5가 됩니다.

 

포인터 쓰는거같죠?

 

 

자 오늘의 포인터 요약입니다.

 

int a = 1;

 

int* ptra = &a 

포인터 변수는 뒤에 *이 붙는다.

포인터는 주소값을 저장한다.

 

*ptra = 2; // a == 2;

변수명 앞에 * 가 붙는다면 주소값안 에있는 변수 혹은 객체를 건들 수있다

즉 이상태는 a나 다름없다. 이게 변경되면 a가 변경된다.

 

int& refb = a;

참조 연산자 a의 역할을 대신 한다.

refb가 바뀌면 a도 바뀐다.

 

&a ;

변수명 앞에 &가 있다면?

a의 주소값 이다 

 

 

포인터는 많이 어려운 거 같습니다.

부족한게 많아서 공부중입니다.