본문 바로가기
Computer Science/Computer Architecture

변수와 메모리 영역

by devOat 2024. 7. 24.

프로그래밍의 모든 것은 메모리를 사용한다. 게임을 만들 때 필요한 요소들 또한 컴퓨터 입장에서는 메모리의 일부분일 뿐이다.

(컴퓨터 입장에서 본 실행중인 나의 프로그램 ㄱㅡ)

이처럼 뭔가를 만들려고 할 때, 우리는 컴퓨터에게 이것을 만들기 위해 필요한 만큼의 메모리가 얼만큼인지 알려줘야하는데, 이를 항상 일일히 지정해주는 것은 너무 번거롭고 어려울 것이다.

너무 기본적이고, 굉장히 많이 사용되기 때문에 이를 언어적 차원에서 제공하는데, 이것을 '자료형' 이라고 한다.

컴퓨터는 자료형을 통해 내가 선언한 변수의 종류가 어떤 타입인지 알 수 있다.

하지만, 자료형만으로는 내가 필요한 메모리가 램의 어디에 위치해있는지 알 수 없기에 사용 또한 불가능하다.

따라서 그 메모리 영역을 대표하는 이름을 붙여줘야 사용할 수 있다. 이름이 없다면, 내가 사용할 메모리의 위치가 어디인지 모르는 것과 마찬가지 이므로 사용할 수 없다.

즉, '자료형'을 통해 내가 얼만큼의 메모리를 사용할 것인지 말하고, '이름'을 통해 이 메모리가 무엇인지 선언해야지 그 메모리를 사용할 수 있는 것이다.

(변수의 선언과 초기화)

이처럼 자료형과 이름을 합쳐, 프로그래밍적으로 메모리를 할당하고 위치를 표현하는 문법을 '변수' 라고 한다.

변수는 항상 위치, 크기 , 형태 , 값을 가지고 있다.

위 사진처럼 변수를 선언함과 동시에 값을 넣어주는 행위를 '초기화' 라고한다. 값이 초기화 되지 않은 변수에는 쓰레기 값이 멋대로 들어가기 때문에, 변수를 할당했다면 꼭 ! 값을 대입해주도록 하자 !!

위의 변수 선언을 풀어서 얘기해보면,

"내 프로그램이 램에 올라가면 그 어딘가에 4byte를 사용하고 그 이름을 a 라고 칭하고 값은 0이다." 라는 의미다. 선언된 시점부터 a는 4byte 정수를 사용하겠다는 뜻이 된다.

내가 변수를 사용했다면, 도대체 언제까지 어디서 사용할 수 있는 변수인지를 명확하게 아는 것이 중요한데, 이를 알기 위해서는 메모리에 대한 더 자세한 이해가 필요하다.

실행되어 램에 올라간 내 프로그램의 메모리 영역을 간단하게 그림으로 표현해보았다.

(램에 있는 프로그램을 확대 해본다면 . . .)

- 내 프로그램에 할당된 메모리 영역은 다음과 같이 코드 , 데이터, 힙 , 스택 총 4가지 영역으로 나뉜다.

- { } 중괄호 내부에 선언한 변수는 스택 영역에 메모리가 할당 된다.

위에 선언한 int a 가 중괄호 내부에 있었다면 , 스택 영역에 메모리를 할당받았을 것이다.

- 변수의 지역에(scope)따라 해당 변수에 접근할 수 있는 위치가 결정되는데, 이처럼 선언된 함수의 범위 안에서만 사용 가능한 변수를 지역 변수 라고 한다.

함수 종료시 지역 변수는 소멸한다.

- 함수 안에 선언되지 않아 어디서나 사용 가능한 변수를 전역 변수 라고 한다. 내가 선언된 것을 알고 있다면 모든 스코프에서 사용할 수 있다.

전역 변수는 데이터 영역에 존재하며, 프로그램의 시작과 동시에 할당되고 프로그램이 종료되어야 메모리가 소멸된다. 코드 영역처럼 수정이 불가능한 영역은 아니다.

- 상수는 코드 영역에 할당 된다.

상수란, 수식에서 변하지 않는 값을 의미한다. 코드 영역은 프로그램이 실행되면 절대로 바꿀 수 없는 메모리이다.

- }는 스택의 종료를 의미한다. {부터 } 까지 사용한 메모리를 전부 해제하겠다는 의미 이다.

다른 함수에서 선언된 지역 변수에 접근할 수 없는 이유를 메모리 관점에서 생각해보자 !

(함수가 실행되고 있는 메모리의 상태)

Func1() 과 Func2() 함수가 실행됐을 때 할당된 메모리는 아예 독립적으로 각자의 영역을 가지고 있다.

때문에 다른 함수에서 선언된 변수에 접근할 수 없는 것이고, (같은 스택 내에 할당 되어 있지만, 메모리 영역이 아예 분리되어 있기 때문이다.) 당연히 함수에 포함된 지역 변수 또한 스코프 내에서만 유효한 것이다.

내가 작성한 코드에 오류가 생긴다면 이는 메모리 구조를 어긴 것이다. 문법은 결국 메모리 구조를 표현하기 위한 방식으로 구성되어 있기 때문이다.