Go의 특징은
높은 수준의 코드로 Low-level Programming을 하도록 해줌
(* Low level로 갈수록 컴퓨터가 이해하기 쉽고 사람이 이해하기 어려움)
오늘은 바로 어떤식으로 높은수준의 코드가 Low-level Programming이 가능하게 해주는 지를 볼것임.
이를 위해 해볼것은
바로
1. 메모리 주소를 보는법과
2. 무엇인가를 메모리 주소에 접근하도록 하는 방법
Java, Javascript를 했다면 충분히 봤을 내용임
Python을 했다면 사용하지 않았을 것
근데 왜
1. 메모리 주소를 보는법과
2. 무엇인가를 메모리 주소에 접근하도록 하는 방법
두가지나 봐야할까?
왜냐면 가끔 복사가 되는것을 원치않을 수도 있음
어떤 경우지?
일단 보시죠
상단 main함수를 보면 b에 a의 값이 복사되고 있다.
복사되고 난 후에는 b에 값의 영향이 없다 "a를 바꾸더라도!"
복사시점의 a의 값은 2였기 때문
고로 위와 같은 결과가 표출됨.
그렇다면 우리가 복사가 되는 것을 원하지 않을때는
어떤 경우가 있을까?
바로 값이 아니라 메모리 주소를 원할때이다.
이게무슨말인고 하면
a의 값이 바뀌는대로 b가 흘러가길 원할수도 있다는 거임.
위의 main 함수에 print값 앞에 &를 붙여주었다.
C언어에서 자주 봤을텐데
결과는 이러하다.
값이 아니라 a와 b의 메모리 주소를 보여준것.
그렇다면 메모리 주소에 접근하고 싶다면 어떻게 해야할까?
이럴땐 a의 메모리 주소를 b에 저장한다. -> b := &a
이렇게 했을 때 &a(a의 주소값)과 b는 같은 값이 출력되는 것을 알 수 있다.
a의 값은 0xc000016088라는 메모리 주소에 저장 되어있고,
b는 a의 메모리를 살펴보고 있는 것.
그러므로, b는 무엇이 되던간에 앞으로 a와 같다.
여기서 하나 배울게 있다.
바로 * (값)
* 은 살펴보거나 훑어본다는 느낌으로 사용됨.
그리하여 a의 주소가 저장된 b에 *을 붙이면 b의 주소값을 통해 a의 값을 살펴서 찾아냄.
메모리의 주소를 살펴볼 수 있다는 의미로 해석하면 됨.
a가 2라는 값을 가졌다가. 후에 값이 10으로 바뀌었더라도
결국 *b는 10을 출력한다.
위와 같이 값의 복사가 아니라
값이 연결되어 메모리에 저장된 object를 똑같이 가지고 싶을 경우가 있을거임
이는 아주 무거운 데이터 구조를 다루고 있다면, 매우 중요한 부분임.
포인터는 이럴 때 사용함.
수치를 바꿔서 a에 5라는 값을 대입해도 b는 a의 메모리 주소에 연결되어 있기 때문에 값을 따라서 흘러간다.
어떤 일생을 보내든 결국엔 고향의 물맛과 냄새를 기억해 고향을 찾아가는 연어와 같다!
흐르는 강물을 거꾸로 거슬러 오르는 연어들의~
도무지 알수 ~
없는~
그들만의 신비한~
포인터
하여튼
다시말하면 b는 a의 주소를 갖고있는 것이다.
그렇다면 b를 통해서도 a의 주소를 바꿀 수 있을까?
대답은 Yes다
해볼까
어 되네
b를 이용해서 a의 값을 변경 시키는게 되네~?!
마치
괴벨스가 언론을 이용해 독일 국민들을 선동시킨것처럼..
포인터는 괴벨스, b는 언론, a는 독일국민 되시겠다.
이 무서운 놈을 선전장관 함수로 분리시켜버렸다.
언론장악 함수로 부를껄 그랬나ㅎㅎ
자, 총정리
1. *는 값
2. &는 주소
3. 주소에 담긴 값 변형가능
Go기초 (7) - Maps(비슷한듯 다름) (1) | 2023.01.29 |
---|---|
Go기초 (6) - Arrays and Slices(뭔 차이인고) (1) | 2023.01.29 |
Go기초 (4) - switch(else-if 남발하실겁니까?) (1) | 2023.01.29 |
Go기초 (3) - [If - Else] 다른언어가 가.지.지.않.은 if-else (1) | 2023.01.29 |
Go기초 (2) - Loop(for 단 하나라고?!) (1) | 2023.01.29 |