포인터, 변수의 주소에 대해서 그냥 책으로 그림만 그려가면서 공부하면
지나치게 추상적으로 받아들여지고 실제로 그렇게 작동하는지 의심을 할 수도 있다.
실체를 눈으로 보길 원하는 사람들에게 이건 반드시 그렇게 동작한다고 이야기하거나, 그냥 무작정 이렇게 돌아가니까 그런 줄 알고 활용만 잘하면 된다라고 하기보다는 직접 보여주는 게 좋은데, 비주얼 스튜디오(Visual Studio)의 편리한 디버깅 툴을 이용하면 어렵지 않게 실제 메모리에 어떻게 할당되는지 볼 수 있다.
#include <iostream> #include <string> using namespace std; class Student { public: string name; int sNo; void Print(); static int studentNumber; static Student* CreateStudent(const string& name_arg); private: Student(const string& name_arg, int stdNumber); }; int Student::studentNumber = 0; Student* Student::CreateStudent(const string& name_arg) { Student* p = new Student(name_arg, studentNumber++); return p; } Student::Student(const string& name_arg, int stdNumber) { name = name_arg; sNo = stdNumber; } void Student::Print() { cout << "{Name = " << name << ", Std. Num. = " << sNo << "}\n"; } int main(void) { Student *p1, *p2, *p3; p1 = Student::CreateStudent("1"); p2 = Student::CreateStudent("2"); p3 = Student::CreateStudent("3"); cout << "Hello"; }
위와 같은 소스가 있다고 하자.
C++ 입문자고, C언어에서 포인터가 메모리 주소 값을 가지고 있다는 사실만 알고 있는 사람이라면 Student*이라는 반환형에 대해 의문을 품을 수도 있다.
메모리를 뒤지지 않아도 개념이 잘 잡혀 있는 사람이라면 헷갈리지 않을 코드지만, 그래도 확실하게 보고 싶다면 조사식에 들어가는 값과 실제 메모리 주소 등을 뒤져볼 필요가 있다.
Visual Studio에서 디버깅을 시작(F5)을 하면 다양한 디버그 창을 띄울 수 있다.
주소값을 저렇게 절대 주소를 넣어서 찾을 필요는 없고, 메모리를 보고 싶은 변수를 입력하면 된다.
예를 들어, 동적 할당한 객체 p의 주소를 보고 싶다면 &p를
객체가 생성되고 나서 포인터 변수 p1, p2, p3의 값을 보고 싶다면 p1, p2, p3를 주소에 입력하면 알아서 해당 메모리를 보여준다.
위는 메모리 창, 아래는 변수값을 볼 수 있는 조사식 창으로 조사식 창에서 보는 포인터 변수의 값과 메모리 창에서 보는 값이 뒤집어져 있을 수 있다. 이는 리틀 엔디언 방식이기 때문에 그렇다.
이렇게 메모리를 뒤져가면서 디버깅을 해보는 것은 개인적으로 크게 도음이 됐다.
실제 메모리에 어떻게 동작하는지 알 수 있고, 포인터 변수에는 무엇이 담기는지 볼 수 있다. 그리고 객체가 생성되고 동적할당된 객체 앞 뒤의 값은 어떻게 채워지는지 알아나가면서 메모리와 동적 할당, 포인터에 대해서 한 층 더 깊게 이해할 수 있게 될 것이다.
'Computer Science > Etc' 카테고리의 다른 글
코틀린(Kotlin)에서 중첩 반복문 빠져나오는 방법 (0) | 2018.10.03 |
---|---|
Visual Studio 2017에서 설치 파일 만드는 방법 (4) | 2018.09.21 |
깃허브(GitHub) fatal: HttpRequestException encountered (3) | 2018.02.24 |
알고리즘 공부 사이트 목록 (0) | 2017.11.27 |
ARM 프로세서 동작모드 (0) | 2017.11.02 |