해결된 질문
작성
·
176
2
변수가 주소를 가리키고 있다 = 변수가 데이터의 위치를 가리킨다
변수가 참조를 가지고 있다 = 변수가 실제 데이터를 가리킨다
이렇게 두가지로 구분을 하시는 뉘앙스가 느껴져서 그런데
저 두가지 분류 또한 동일한 건가요?
답변 2
1
안녕하세요.
결론적으로 말씀드리면 둘 다 동일하다고 생각하시면 됩니다.
실제적으로 내부구조가 다르지만 원리는 같기 때문에 그런 식으로 구분해서 설명하고 있습니다.
변수가 주소를 가르키고 있다는 이야기는 C언어를 처음 배울때 배우는 포인터가 이렇게 되어 있습니다.
메모리의 주소로 가보았을때 실제 데이타가 그곳에 존재하는 형태로 구현이 되어 있습니다.
참조의 경우 주소로 가보았을때 다시 실제 메모리가 있는 위치에 다시 주소가 있는 것으로 알고 있고 그러한 형태로 구현되는 경우가 많습니다. (언어에 따라 다릅니다)
여기서 말하는 구현이라는 것은 언어를 만드는 사람들이 고려해야할 문제이고요.
그래도 이해를 하기 위해서 그림으로 본다면 주소와 참조를 아래와 같은 그림을 생각해볼 수 있고요.
그림을 보시면 참조의 경우 변수 value 에서 두번을 따라가야 실제 데이터를 찾아들어갈 수 있습니다.
저희는 이 그림에서 value 가 0x2000 으로 가는 것만 신경쓰면 되기 때문에 실제 참조로 가보니 데이터가 있다라는 이야기를 드린 것이고 어딘가를 가르키기에 원리가 같다고 말씀드린 것입니다. 그래서 참조를 가지고 있다 라고 설명한 것입니다.
이걸 소개하지 않고 구분하여 설명하는 것은 완전히 같지는 않지만 원리는 같다는 것을 말하기 위해서 그렇게 이야기하는 것이고요.
나중에 다시 공부하실때 "참조하고 주소하고 같다고 배웠는데?" 라고 이야기가 나오지 않도록 하기 위해서 이렇게 설명한 것입니다.
그리고 이 이야기도 현재 시작하는 상태에서는 별로 관심을 안가지도록 하는 것이 좋을 것 같아서 이렇게 설명을 드렸습니다.
더 많이 배울수록 어렵기만 하거든요.
현재 상태에서 필요한 정보를 얻기위해서 더 자세한 내용을 공부하는 것이 좋다고 생각합니다.
그걸 파해쳐서 모든것을 완벽하게 알기라는 것은 불가능에 가까운 일입니다.
그래서 C# 학습시에 참조에 가봤더니 그대로 데이터가 있다고 생각해도 무리는 없습니다.
내부적으로 주소도 참조도 구현에 관계없이 어딘가를 가르키는 것입니다.
그것이 자신의 데이터인 것이고요.
그리고 저희가 사용하는 유니티 C#에서는 포인터를 사용하지 않습니다.
포인터의 이해가 어려워서 프로그래밍을 접근하지 못하는 사람들이 많기에 많은 정보를 알려드리지 않고 원리만을 설명드렸습니다.
하지만 어딘가를 가르키고 실제 데이터가 거기에 있다는 것에서 출발하지 않으면 클래스나 나중에 나오는 인스턴스를 절대 이해하지 못하기 때문에요. 이렇게 설명드렸습니다.
우선은 조금씩 쌓아나가시면 됩니다.
지금 말씀드린 내용을 정확하게 구현을 이해하려고 생각하지 않으시기를 바라고요.
왜냐하면 질리니까요.
우선 편하게 연습이 필요한 부분에서 연습을 하시면서 학습하셨으면 좋겠습니다.
좋은 질문 감사합니다. 좋은 저녁 되세요.
0
답변 감사드립니다
예전에 C를 배우긴 했는데, 다 배운건 아니고 딱 포인터 배우고 그만뒀거든요
설명해주신 포인터와 이중포인터는 설명 듣고 바로 이해는 했습니다.
그리고 왜 이 질문을 하게 됐는가 생각해보니까
저도 모르게 머리속에서 참조와 주소가 같은 것이다라고 생각을 한 모양입니다
알려주신 내용과 제 기억을 더듬어 결론을 내봤는데 맞는지 확인을 해주실 수 있을까요?
변수가 주소를 들고 있는 경우와 참조(이중포인터)를 들고 있는 경우는 다르다
주소를 들고 있는 변수를 따라가면 해당 주소에 상주하고 있는 값을 만날 수 있다
참조를 들고 있는 변수를 따라가면, 해당 주소에 상주하고 있는 또 다른 주소를 만날 수 있다. 최종적으로 값을 만나려면, 그 또 다른 주소를 따라 가면 된다
이런건가요?
강의 들으면서, 질문에 답을 받았는데 이렇게 감동하긴 처음이네요 정말 감사드려요
첫 강의 들어보고 이건 듣는게 맞는거구나 싶어서 파트4까지 다 구매를 했는데, 이렇게 까지 질문에 답을 해주시는 거 보고, 사길 잘 했다는 생각이 듭니다
강사님 꼭 강의 많이 많이 내주세요
안녕하세요.
우선 제가 말씀드린 설명으로는 말씀하신게 맞습니다.
참조를 따라가면 또다른 주소가 있고요. 그리고 그 주소에서 따라가도 실제 데이터가 있습니다.
하지만 그냥 포인터와 같이 1단이라고 생각하시는게 좋습니다.
왜냐하면 그 또다른 주소라는 것은 저희가 변경할수 없기 때문이고요.
주소로 접근했을때 바로 데이터가 있는 구조는 어셈블리나 C 언어가 그렇게 동작합니다.
그걸 이중으로 있다고 생각하면 저희가 이제부터 배워야 할 클래스나 인스턴스에서 훨신 복잡해집니다.
2단으로 주소 연결이 있다고 생각하기 보다는 한단계로 있다고 논리적으로 보는 것이 좋습니다.
왜냐하면요.
프로그래밍 언어 주체가 여럿이 있는데 프로그래밍 언어 개발 주체 가 있고 그걸 사용하는 유니티 같은 프레임워크를 만드는 주체가 있고 저희같은 일반 개발자가 존재합니다.
언어를 만드는 세부적인 구현에 대해서 프로그래밍 언어 개발 주체(C# 언어 개발을 하는 마이크로소프트 같은 업체) 가 담당하기에 그 세부적인 구현을 우리가 생각하면서 작업을 하는 것이 아닙니다.
구현은 그쪽에 맡기고 저희(프로그래밍 유저, 일반 개발자)는 레퍼런스가 있고 실제 데이터가 있다는 것만 이해하고 작업하는 것입니다.
내부적으로 제가 2중포인터라고 말씀드린것이 이해하기 쉽게 그렇게 말씀드린 내용이고 실제 구현은 언어마다 그리고 C#의 버전마다도 다를 수 있습니다. 그걸 저희가 알기 위해서는 더 복잡한 내용이 필요합니다. 그리고 그걸 따라가면서 프로그래밍을 처음에 시작하지는 않고요.
이걸 저는 프로그래밍 언어의 추상화라고 생각합니다. 레퍼런스가 있고 실제 데이터가 있습니다. 저희는 그것만 알아도 충분합니다. 나머지 구현은 언어 개발자에게 맡깁니다. 그 구현에 따라서 저희가 따라가기를 바라지 않는다는 것입니다.
그래서 언어에서 보면 언어의 철학이 존재하는데요.
저희가 작업할때 C# 내부적으로 메모리나 하드웨어를 건드리지 않기를 바라고 있습니다. 포인터가 어렵기에 레퍼런스라는 것을 만들어서 그걸 논리적으로만 접근하여 사용하는 것입니다.
C언어나 어셈블리어는 실제로 주소를 따라가서 메모리를 값을 수정할수 있습니다. 그래서 나중에 그것도 필요하다면 공부가 필요하고요.
CPP 의 경우도 메모리는 존재하지만 하드웨어를 직접 건드리지 않습니다. CPP 는 객채지향 언어이고요. 거기에서 말하는 참조의 개념도 C#과는 조금 다릅니다.
새 언어를 배울때 다시 새로 배워야 하는 이유고요.
저희가 하드웨어를 건드리지 않고 논리적인 면만을 가지고 작업을 해야 하는게 C# 언어입니다. (구현의 담당은 언어개발자이기 때문입니다)
그리고 하나 더 추가하면요.
C#에서는 주소를 접근할수 있는 포인터를 별로 사용하지 않기를 바라고 있습니다.
unsafe 라는 키워드가 있긴 한데요.
피시용의 프로그램을 제작할때 사용하고 유니티C#에서는 사용하지 않습니다
그래서 참조라는 것이 1단으로 생각해도 충분합니다.