나는 C책을 읽다가(정확히는 '독하게 시작하는 C 프로그래밍') 포인터 부분에서 책을 덮은 적이 있다.
그래서 고랭에서 포인터를 만났을 때 덜덜 떨었었지...
개념적으로 포인터를 이해하는 게 엄청나게 중요하겠지만
나는 그것만큼 포인터를 '쓸 줄 아는 게(덧붙여 잘 쓸 줄 아는 게)' 더 중요하지 않나 생각한다.
그래서 포인터에 대해서는 여기에서 길게 적지 않으려 한다.
왜냐면, 나중에 실제 개발 들어가면 그때 더 기록할 내용이 많을 것 같아서.
포인터는 메모리 상의 주소를 저장하는 '변수'다.
이 주소를 통해 다른 변수의 위치를 참조할 수 있으며, 이를 통해 간접적으로 다른 변수의 값을 읽거나 수정할 수 있다.
고랭에서 포인터는 '*' 기호를 사용해 표현된다.
var ptr *int
같은 식이다.
이는 정수형 변수의 메모리 주소를 저장할 수 있는 포인터 변수 선언문이다.
아주 많은 이유가 있겠지만 내가 조사했기로는 다음과 같다.
- 효율성: 포인터를 사용하면 큰 데이터 구조를 함수에 전달할 때 데이터의 복사본을 만들지 않고도 접근할 수 있다. 이는 메모리 사용량을 줄이고 프로그램의 성능을 향상시킨다.
- 함수 간의 데이터 공유: 함수에 변수의 포인터를 전달함으로써, 여러 함수가 동일한 데이터에 접근하고 수정할 수 있다. 이를 통해 함수 간에 데이터를 쉽게 공유된다.
- 동적 메모리 할당: 포인터는 동적으로 할당된 메모리(힙 메모리)를 가리키는 데 사용된다. 이를 통해 프로그램 실행 중에 메모리의 크기를 유연하게 변경할 수 있다.
인스턴스는 특정 타입(클래스, 구조체 등)의 실제 구현된 객체를 의미합니다. 고랭에서는 구조체 타입을 정의하고, 이 타입의 변수(인스턴스)를 생성하여 사용한다. 각 인스턴스는 메모리 상에 할당되며, 포인터를 통해 이 인스턴스를 참조할 수 있다.
스택 메모리: 함수 호출과 함께 생성되는 지역 변수를 저장하는 데 사용된다. 스택 메모리는 자동으로 관리되며, 함수가 종료되면 해당 함수의 스택 프레임이 제거된다. 스택 메모리는 할당과 해제가 빠르지만, 크기가 제한적이다.
힙 메모리: 동적 메모리 할당에 사용되는 메모리 영역이다. 힙 메모리는 프로그램 실행 중에 필요에 따라 할당되고 해제된다. 힙 메모리의 크기는 상대적으로 크고 유연하지만, 스택 메모리에 비해 할당과 해제가 느리다. 고랭에서는 make나 new 함수를 사용하여 힙 메모리에 데이터를 할당할 수 있으며, 가비지 컬렉터가 자동으로 불필요한 메모리를 해제한다.
+OK, 위의 동적 메모리 할당, 힙 메모리부터 이해가 잘 안 됐지만 이 부분부터 진짜로 이해가 안 된다.
공부 더 해야겠다.
고랭에서 포인터의 사용은 C와 같은 언어에 비해 제한적이다. 예를 들어, 고랭에서는 포인터 연산(예: 포인터 산술)을 허용하지 않는다. 이는 프로그램의 안정성을 높이고, 실수로 인한 버그와 보안 취약점을 줄이기 위한 설계 결정이다. 포인터를 사용함으로써 데이터 구조에 대한 더 세밀한 제어와 효율성을 얻을 수 있지만, 포인터를 사용할 때는 주의가 필요하다. 포인터를 통한 잘못된 메모리 접근은 프로그램의 오류를 일으킬 수 있기 때문이다.
Tucker의 Go 언어 프로그래밍 - 포인터편은
실제 개발 들어가면서 다시 보충하는 걸로!