※ 제 마음대로 번역판에서는 pointer를 포인터라고 하지 않고, 안내자로 써서 설명했고, reference를 따옴로 썼습니다. 중국어로는 reference를 '引用'이라고 합니다. 안녕하세요, 여러분. Paul입니다. 이 동영상 강의에서는 C++에서 reference(따옴)와 pointer(안내자)의 차이점을 설명하려고 합니다.
그래서, 그림을 그려가면서 하는 것이 상황을 이해하는데 도움이 된다고 생각하여 그림을 그리면서 설명할께요.
화면 왼쪽은 코딩을 하면서 의미를 설명하려고 합니다.
이 그림은 여기에서 일어나는 일들을 점으로 연결하여 관계를 설명하도록 하겠습니다.
먼저 pointer(안내자)를 선언합니다.
보시면, 여기에 있는 이것이 제가 만든 pointer(안내자)입니다. 그리고, 그에게 ptr이라는 이름을 지어주었습니다. 계속해보겠습니다.
우리가 C++에서 ptr이라는 pointer(안내자)를 선언할 때, 우리는 형태(type)도 선택 합니다. 저는 정수 형태을 선택하고 진행할께요.
int＊는 정수형 pointer(안내자)를 만들었다는 것이고, pointer(안내자)의 이름을 ptr로 정했으며, 그림은 그것을 나타내고 있습니다.
그런 다음 세미콜론(;)을 붙입니다. 그리고, 이 행이 바로 여기에서 하는 것은 "우리는 지금 pointer(안내자)를 만들었습니다"라는 것이며, pointer(안내자)의 이름은 ptr입니다.
안내자 ptr은 어떤 값을 가지고 있는데요, 가지고 있는 값은 안내해야하는 것의 주소입니다.
그런데, 우리는 아직 어떤 것을 안내하도록 지시하지 않았기 때문에 어떤 종류의 무작위 값을 할당 받게 됩니다.
반드시 그렇지는 않지만, 많은 경우에 값으로 0이 할당됩니다.
이제 pointer(안내자)를 할당하는 값을 나타내기 위해 여기에 0을 넣어 보겠습니다.
0x는 이것이 16 진수임을 나타냅니다. 그래서, 우리는 이 pointer(안내자)를 만들었습니다. 현재는 어떤 주소도 안내하지 않습니다.
프로그램을 실행하면, 이 16진수 값으로 0이 할당 될 가능성은 있습니다.
따라서, 안내자에게 안내할 주소를 알려주지 않은 이 시점에서 ptr을 출력한다면 ptr은 값은 대개 0x0 즉 0과 같습니다.
그것이 pointer(안내자)가 생성되었을 때 여기에 놓인 값이라고 가정합니다.
자, 이제 이것을 여기서 만들어 보겠습니다.
다음 줄에서 정수형 변수를 만들고, 이 변수의 이름을 var로 지정하겠습니다.
그리고 나서 우리 프로그램이 실행될 때, var는 어떤 임의 주소를 할당받을 것입니다.
우리는 이 주소가 16 진수 A (0xA)로 표시되는 주소라고 가정합니다.
그리고, 우리는 var를 생성할 때 값을 줄 수 있는데, "int var = 7"이라고 해서 값을 줄 수 있습니다.
그러면, var라는 이름의 변수를 생성 한 다음, var에 값 7을 저장합니다.
그럼 이제 이것을 여기서 만들어 봅시다.
같은 방법으로 우리는 새로운 정수 변수를 선언해보죠. 우리는 그것을 foo라고 하고, 우리는 foo에 21의 값을 가지도록 합니다.
여기로 돌아와서 여기 21를 추가합니다.
좋아요, 우리는 이 변수 foo를 만들었습니다.
다음 프로그램이 실행될 때 foo가 임의 주소 B(0xB)에 배치되었다고 합시다.
변수 var는 값 7을 가지고 있고, 임의 주소 A(0xA)에 있습니다.
변수 foo는 값 21을 가지고 있고, 임의 주소 B(0xB)에 있습니다.
이 때 우리가 var를 출력한다면, 7이라는 값을 얻을 것이고,
우리가 foo를 출력한다면, 우리는 21이라는 값을 얻을 것입니다.
우리가 안내자 ptr을 인쇄한다면, 우리는 이 값을 ptr 안에 넣을 것이고, 이것은 ptr이 안내할 주소 값이 될 것입니다.
그리고 현재는 어떤 주소도 가리키지 않는다고 말하고 있습니다.
따라서 이 시점에서 ptr을 인쇄한다면 값은 주소 0(0x0)이 됩니다.
ptr 앞에 "＊"을 붙이면 "안내자가 알려주는(가리키는) 주소의 내부에 있는 값을 알려주십시오"라고 말하는 것입니다.
그래서 여기에 오는 값은 주소 0x0에 저장된 값이 될 것입니다.
우리는 그것이 무엇인지 모르기 때문에,
이것은 기본적으로 ptr의 참조 된 값을 출력한다면 우리에게 많은 쓰레기 값을 출력할 것입니다.
우리는이 시점에서 ptr의 역따옴값(dereference value)이 우리에게 줄 것이 무엇인 지를 정말로 알지 못합니다.
이제 pointer(안내자)가 변수를 안내하도록 하겠습니다.
다음 줄에서 ptr이 var의 주소와 같다고 말할 것입니다.
그래서 var의 주소는 16 진수 값 A(0xA)이고,
그래서 우리가 이 줄을 여기에 쓸 때, pointer(안내자) 내부에 저장된 값이 안내해야할 주소가 됩니다.
var가 주소 A(0xA)에 있기 때문에이 할당은 주소 A(0xA)를 pointer(안내자)가 안내할 주소 A(0xA)를 가지고 있게 됩니다.
이제 그림을 최신화하여 이를 나타내겠습니다.
그래서 이 줄은 var의 주소를 pointer(안내자) 안에 넣음 으로써 pointer(안내자)가 var를 안내하도록 합니다.
이제 우리가 ptr을 출력한다면, 가리키는 주소인 16 진수 값 A(0xA)를 얻게 될 것입니다.
* ptr을 출력하면, 7을 얻게됩니다.
역참조 된 pointer(안내자)의 값이 "var을 가리키고있는 동안 나에게 당신이 안내하는 주소의 내부에있는 값을 달라"고 말하기 때문입니다.
var 내부에 있는 값은 7입니다.
pointer(안내자)가 다른 것을 안내하도록 할 수 있습니다.
이제 pointer(안내자)가 다른 것을 안내하도록 해봅시다.
음, 우리가 원한다면 pointer(안내자)가 foo를 안내하도록 할 수 있습니다.
pointer(안내자)가 foo의 주소와 같다고 말하면 됩니다.
그래서 이것은 pointer(안내자) 내부에 foo의 주소를 넣을 것입니다.
그래서 foo의 주소는 B(0xB)입니다. 임의의 B(0xB)가 foo가 사는 곳입니다.
그래서 B(0xB)는 여기에 위치하게되어 pointer(안내자)가 B(0xB)를 안내하게 됩니다. 그리고 이 값들도 최신화 될 것입니다.
계속 해보겠습니다.
이것이 새롭게 작성한 코드의 결과입니다.
pointer(안내자)는 foo의 주소와 같습니다. foo의 주소를 pointer(안내자) 안에 넣고,
이제 ptr을 출력한다면 foo가 사는 주소 B(0xB)를 얻습니다.
역참조된 pointer(안내자) 값을 출력한다면,
우리는 pointer(안내자)가 안내하고 있는 주소 안에 저장된 값을 얻을 것이고, 그것은 21이 될 것입니다.
그래서 우리는 우리 pointer(안내자)를 가리키고 자하는 것의 주소를 넣어서 이 pointer(안내자)를 다른 것들에 안내하도록 할 수 있습니다.
이것이 pointer(안내자)가 작동하는 방식입니다. 그렇다면 reference(따옴)란 무엇입니까?
음, reference(따옴)는 foo나 var에 다른 이름을 따와 쓰는 것과 같습니다.
이제 reference(따옴)를 만들어 보겠습니다.
그래서 다음 줄에서 int 앰퍼샌드(&, Ampersand)를 쓰고,
reference(따옴)의 이름을 ref로하고, reference(따옴)를 var와 똑같은 것으로 만들었습니다.
int&로 참조하게 했고, ref로 이름을 지어서 var와 같은 이름으로 만들었습니다.
그래서, 이 주소는 var가 사용하는 장소입니다만,
reference(따옴)가 메모리에서 이 위치를 호출하는 새로운 방법을 제공합니다.
이제 var로 값 7을 출력할 수 있고, ref로도 7을 출력할 수 있습니다.
왜냐하면 var와 ref는 동일한 변수를 사용하는 두 가지 방법이기 때문입니다.
pointer(안내자)와 달리 여기에 있는 reference(따옴) ref는 이동할 수 없습니다.
우리는 이 reference(따옴)를 var와 동일한 것으로 만들었습니다. 따라서, ref로 foo로 안내하도록 할 수 없습니다.
그래서 우리가 원한다면 pointer(안내자) 위치를 바로 이 위치로 되돌릴 수 있습니다.
pointer(안내자)가 var의 주소와 같다고 말하면 되며, pointer(안내자)가 ref의 주소와 같다고도 말할 수 있습니다.
그것들 중 하나를 볼 것이고, 둘 다 가능한 경우입니다.
이것이 나의 주소이고, 이것을 여기에 다시 넣을 것입니다. 이 위치를 여기에 다시 넣으면 pointer(안내자)를 이 위치로 되돌릴 수 있습니다.
기본적으로 참조와 pointer(안내자)의 주요 차이점은 pointer(안내자)가 자유롭게 움직여서 변수를 자유롭게 바꿔가며 안내할 수 있다는 것입니다.
reference(따옴)는 한 번 할당되며, 메모리의 해당 위치에 대한 reference(따옴)한 이름이 됩니다.
즉, 이것이 pointer(안내자)와 reference(따옴)의 큰 차이입니다.
감사합니다. (자료원 : https://www.youtube.com/user/PaulProgramming )
귀하의 의견에 감사드립니다. 이 비디오에 대해 어떻게 생각하는지 알려주세요. (자료원 : https://www.youtube.com/user/PaulProgramming )
자유롭게 다른 제안이나 주제를 제시해주십시오. (자료원 : https://www.youtube.com/user/PaulProgramming )
당신의 소식을 듣기를 고대합니다. (자료원 : https://www.youtube.com/user/PaulProgramming )
시청해 주셔서 감사 드리며 아직 구독하지 않았다면 구독하는 것을 잊지 마십시오. (자료원 : https://www.youtube.com/user/PaulProgramming ) 번역: 박기태 (12000@12000.co) 혹시 마음대로 번역이 불편하시다면, 죄송합니다. 영어를 발음대로 번역하는 것을 너무 싫어합니다.