조회 수 280 추천 수 1 댓글 2
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

데이터 보관

계산을 하기 위해서는 값들을 모두 기억하고 있어야합니다. 종이에 메모를 해놓건 머리로 기억을 하건 '데이터를 보관'해야합니다. 컴퓨터도 마찬가지로 데이터를 임시적이든 영구적이든 보관하지 않으면 계산을 할 수가 없습니다.

변수

 변수는 말그대로 '바뀌는 수'입니다. 앗, 그렇습니다. 수학에서 유래된 겁니다. 그럼 당연히 상수도 있겠죠. 하지만 때가 아닙니다. 상수는 아래에서 설명해드릴게요.

 컴퓨터에서의 변수는 '데이터를 담는 일정한 크기의 메모리 공간'입니다. 별것 아닙니다. 그저 우리는 코드에 변수를 형식과 함께 선언해줌으로써 컴파일러는 그 형식에 필요한 메모리 공간을 '알아서'예약해줍니다.


 변수 선언은 다음과 같이 할 수 있습니다.

// (형식) (식별자(변수의 이름));
int x;

 이렇게 해두면 실행시 메모리에 다음과 같은 꼴이됩니다.

변수강좌1.png

 자, 여기에 데이터를 할당해볼까요?

// (식별자) = (데이터);
x = 100;

 여기에 쓰인 '='은 대입 연산자라고 합니다. 수학하고 되게 비슷하죠?

변수강좌2.png


 하지만 실제로 프로그래밍 할때 둘을 일일히 나눠서 작성하면 비효율적입니다. 그래서 대부분의 언어에서는 다음과 같이 선언과 데이터 할당을 동시에 할 수 있습니다.

// (형식) (식별자) = (데이터);
int x = 100;

 같은 형식의 변수를 여러번 선언할때도 한꺼번에 선언해서 효율적으로 프로그래밍 할 수 있습니다.
(형식) (식별자1), (식별자2), (식별자3)...;
int a, b, c;
int x = 100, y = 200, z = 300;

형식

 물건을 보관할때는 그냥 집어 넣는 경우도 있지만 대부분의 경우에는 종류별로 정리해서 보관하는 경우가 많습니다. 컴퓨터에서도 데이터의 사용방법에 따라 분류합니다. 그것을 돕는 것이 바로 형식입니다.

 C#에서의 형식은 값 형식과 참조 형식으로 나뉘어집니다. 값 형식은 값 자체를 갖는 데이터 형식이고 참조 형식은 메모리상에서 값이 있는 위치를 갖고 있는 데이터 형식입니다. 이 둘을 좀더 정확하게 이해하려면 객체지향 프로그램에서 사용하는 두가지 메모리 영역에 대해서 알고 있어야합니다.

스택

 값 형식의 데이터는 이 스택이라는 영역에 저장됩니다. 스택(stack)은 말 그대로 무더기라는 뜻인데, 책 무더기를 떠올리시면 됩니다. 책보고나서 정리하기 귀찮으면 쌓아 놓잖아요? 아래에 있는 책을 (무더기에서)꺼내려면 일단 위에있는 책을 걷어내야 하죠.

 만약 다음과 같은 코드가 있다고 치죠.

{
    int a = 100;
    int b = 200;
}

 그렇게되면 다음 그림과 같이 순차적으로 스택 메모리에 적재되었다가 블록 끝에서 걷혀져서 제거됩니다.

New canvas.png

 참조 형식의 데이터는 힙에 저장됩니다. 엉덩이를 말하는 것이 아닙니다. heap을 말하는겁니다. 힙 또한 무더기라는 뜻을 갖고있지만 '정리가 좀 안된'무더기를 말합니다. 즉 매우 게으른 사람의 집과도 같은 구조이죠. (난장판이라는 겁니다.) 이 난장판 속에서 필요한 물건을 찾기위해서는 그 물건의 위치를 기억하고 있어야만 합니다.

asdfasdf.png

이 난장판을 청소하기 위해서 C#에서는 가비지 컬렉터라는 청소부를 두었습니다. 만약 필요가 없어진 물건이라면 청소부가 방문했을때 제거됩니다.

asaszx.png


?
  • profile
    gcyong 2016.01.23 03:24

    변수를 설명하시면서 메모리공간과 한 셀에 대응하는 물리적 주소를 같이 표현하셨는데, JAVA나 C#같이 참조(reference)를 꽁꽁 숨겨둔 프로그래밍 언어의 경우에도 유효한 설명인지 잘 모르겠군요..
    C나 C++같이 메모리(물리적 메모리이던, 가상메모리와 같이 물리적 메모리에 한다러 걸쳐 접근하던 메모리던) 접근 방식, 그리고 포인터라는 개념이 실제로 정수로 이루어진 메모리 주소 연산 개념의 언어라면 본문에 인용하신 그림이 상당히 설득력 있겠습니다만, 적어도 C#이나 JAVA와 같이 프레임워크 위에서 구동되어 메모리 관리를 해주는 언어에서는 메모리 역시 추상적인 개념으로만 설명하는 것이 언어적 접근에서 맞다고 판단합니다.
    예전에 우연히 "Head First Java" 라는 책을 읽은 적이 있었는데, 이 책에서도 메모리를 단지 큰 주머니 안에 작은 칸으로만 설명했습니다. 이 책이 초보자들이 이해하기 쉽도록 만든 책이기 때문에 그렇게 표현한 것일 수도 있겠지만, 적어도 JAVA나 C#에서는 더 맞는 설명이라고 생각합니다. JAVA나 C#에서 메모리 핸들링을 구체적으로 어떻게 하는지는 명시되어있지 않은 것으로 알고있습니다.

    다른 분들의 의견은 어떠신가요?

  • profile
    맛난호빵 2016.02.24 19:28
    강좌쓰다가 '역시 강좌를 알기 쉽게 쓰는건 힘든 것이구나!'하고 깨달은후 작성을 중지했습니다...
    맞습니다.
    C#은 메모리구조가 추상적이죠.
    그래서 메모리에 대한 설명은 하지 않아도 되지만 결국 언젠가는 C#에서 메모리 구조가 어떻게 돌아가는지 알아야합니다.
    물론 초보자가 당장 접근할 내용은 아니죠...







[개인정보취급방침] | [이용약관] | [제휴문의] | [후원창구] | [인디사이드연혁]

Copyright © 1999 - 2016 INdiSide.com/(주)씨엘쓰리디 All Rights Reserved.
인디사이드 운영자 : 천무(이지선) | kernys(김원배) | 사신지(김병국)