포인터는 익히 알고 있는 개념이다. 포인터는 주소값을 값으로 가지는 변수이다. 주소값을 저장해주어야 하기 때문에 & 연산자를 사용한다. 예를 들어 어떤 변수를 가리킬 때는 다음과 같이 사용한다.
int *p, v;
p = &v;
이렇게 하면 p는 변수 v를 가리키게 된다.
& 연산자를 주소값을 주는 연산자이다.
const Money operator +(const Moneyt& amount1, const Money& amount2);
만약 함수가 포인터의 파라미터를 변경하면 로컬 변수만 바뀌는게 아니라 원래 있던 값까지 바뀌게 된다.
포인터 변수를 참조한다. 하지만 꼭 실제 변수일 필요는 없다. 동적으로 할당된 변수여도 된다는 이야기 이다. 어떻게 하냐고 묻는다면 new를 쓰면 된다!
p1 = new int;
요런식으로 써주게 되면 이름 없는 변수를 만들어서 p1이 가리키게 만든 것이다.
MyClass *myPtr;
mcPtr = new Myclass(32.0, 17);
// similar to
int *n;
n = new int(17);
이런 식으로 클래스에 대해서도 선언이 된다. 얘는 힙에 할당되는 것이다.
Future "new" operations will fail if heap is "full"
메모리 관리를 해야하는 이유는 메모리가 한정되어 있기 때문이다.
그래서 메모리를 제거해주어야 한다.
int *p;
p = new int(5);
delete p;
delete를 해주어도 p가 거기에 남아 있을 수 있다. 그래서 만약 같은 이름의 포인터를 선언하면 프로그램에서 예상치 못한 값을 얻을 수 있다. 때문에 다음과 같은 작업을 해준다고 한다.
delete p;
p = NULL;
지금까지 계속 했던 이야기가 메모리에 관한 이야기였다. 때문에 메모리에 대해 좀 더 깊게 알아보자.
For static/global variables
The space is allocated once, when a program started
– Happens when automatic variables (local variables, parameters) declared
Not dynamic:
• Created when function is called
• Destroyed when function call completes
• Created/Destroyed when a block statement with variable declaration is entered/exited
이런식으로 메모리가 구성되어 있다. 부가적인 내용이니 깊게 알지 않아도 될 것 같다.
그렇다면 이 개념을 array에 적용해보자.
먼저 배열의 이름의 경우 포인터로 간주하기도 한다. C언어를 할 때 익히 배운 내용이니 까먹지 말고 기억하도록 하자.
우선 자동적으로 선언되는 배열 변수는 고정된 사이즈를 가지고 있다. 때문에 동적인 배열을 사용하기도 한다.
Dynamic arrays: Can grow and shrink as needed
typedef double * DoublePtr;
DoublePtr d;
d = new double[10];
이런식으로 하면 동적인 배열이 생성된다. typedef 는 double *를 쓰기 귀찮아서 typedef로 한 것이다.
얘는 deleting을 조금 신기하게 한다.
d = new double[10];
delete [] d;
int [] someFunc(); // 잘못된 반환 값이다.
int* someFunc(); // 올바른 반환 값이다.
작년에 배웠는데 까먹었다. 화살표 연산자를 사용하면 불필요하게 지저분한 코드를 안 써도 된다. 예시 코드를 살펴보자.
MyClass *p;
p = new MyClass;
// equvalent
(*p).grade = "a";
p->grade = "a";
아래 두 줄의 코드는 같은 의미이다.
this를 처음 봤을 때는 이게 뭐지? 했다. 하지만 생각해보니가 파이썬에도 비슷한 것이 있었다. 바로 self이다. 클래스를 만들 때 self를 사용하면 내가 만든 클래스 자신을 가리켰다. 이것도 비슷한 친구이다. 파이썬에서 self.변수이름 과 같이 사용했고 여기서도 this->변수이름과 같이 사용한다.
과제랑 나머지 내용을 내일 해야지~