힙 동적 변수
몇 개가 필요할지 실행해 봐야 아는 데이터는 어디에 둘까?
③ 명시적 힙 동적 변수
명령으로 받고, 명령으로 돌려줍니다
명시적 힙 동적 변수(explicit heap-dynamic variable)는 프로그래머가 명령을 적어서 실행 중에 할당하고 해제합니다. C++에서는 new가 힙에서 칸을 받고 delete가 돌려줍니다. 이 칸에는 이름이 없어 포인터로만 접근합니다.
포인터는 값이 든 메모리 칸의 위치를 담는 값입니다. Java의 객체(11강에서 다룹니다)도 모두 이 방식으로 만들어집니다.
왜 쓰나
크기가 변하는 구조를 만듭니다
힙을 쓰면 칸을 필요한 만큼 받고, 다 쓰면 돌려줄 수 있습니다. 그래서 연결 리스트나 트리처럼 실행 중에 크기가 변하는 구조를 만들 수 있습니다.
연결 리스트는 1강에서 본, 값을 화살표로 줄줄이 이은 구조입니다. 트리는 값이 가지를 치며 이어진 구조입니다. 값은 예시입니다.
위험
직접 관리하면 실수가 납니다
편리한 만큼 위험합니다. 해제를 잊으면 쓰지도 못하는 칸이 남는 메모리 누수가 생기고, 이미 해제한 칸을 가리키면 포인터 오류가 납니다. 스택보다 느리기도 합니다.
가비지 컬렉터는 더는 쓰이지 않는 칸을 찾아 대신 돌려주는 장치입니다.
④ 묵시적 힙 동적 변수
대입문이 받아 줍니다
묵시적 힙 동적 변수(implicit heap-dynamic variable)는 대입문이 할당과 해제를 대신 합니다. 값을 넣으면 칸이 힙에 생기고, 앞의 칸은 알아서 해제됩니다. 유연하지만, 모든 속성이 실행 중에 정해져 느리고 오류를 미리 찾기 어렵습니다.
APL의 모든 변수와 Perl, JavaScript, PHP의 문자열·배열이 이 방식입니다.
넷의 수명
시간 위에 놓으면 이렇게 다릅니다
네 종류를 시간 위에 놓았습니다. 막대가 있는 동안이 변수가 칸에 묶여 있는 수명입니다. 정적 변수는 가장 일찍 묶여 빠르고, 힙 동적 변수는 실행 중에 묶여 유연합니다. 3편에서 본 절충 그대로입니다.
막대의 위치와 길이는 예시입니다.
정리
수명으로 나눈 변수 넷
넷을 가르는 것은 칸이 언제 묶이느냐입니다. 실행 전인가, 함수가 불릴 때인가, 프로그래머가 명령할 때인가, 대입할 때인가.
다음 편