본문 바로가기
Programming/Basic

메모리 구조

by Blemish 2022. 7. 3.
  • 메모리 구조에 대해서 이해한다.

 

메모리의 구조

  • 메모리 구조는 Code, Data, Stack, Heap 영역으로 나눠져 있다.
    • Code 영역에는 프로그램의 코드가 저장되는 영역으로 텍스트 영역이라고도 한다.
    • Data 영역에는 전역 변수와 정적 변수가 저장되는 영역
    • Stack 영역은 함수의 호출과 함께 지역 변수와 매개 변수, 반환 주소 값이 저장되는 영역(void add(int a, int b) { int num;})
    • Heap 영역은 사용자가 직접적으로 관리할 수 있는 영역

Stack

  • 높은 주소 값에서 낮은 주소 값으로 할당된다.
  • 함수의 호출과 함께 지역변수와 매개 변수, 반환 주소 값이 저장되고 함수가 종료되면 마찬가지로 지역변수와 매개변수는 소멸된다.
  • 더 이상 할당할 수 없을 경우에는 Stack overflow가 발생한다.

Heap

  • 낮은 주소 값에서 높은 주소 값으로 할당된다.
  • 사용자가 동적으로 관리할 수 있는 메모리 영역이다.
  • 새로운 주소 값이 계속 생성되다 보면 Stack 영역을 침범할 수 있는데 이를 heap overflow라고 한다

Stack 영역에서는 함수의 지역변수와 매개변수가 저장 및 소멸이 이루어진다. 그럼 함수의 매개변수에 변수들의 값을 넣으면 값이 변환될까?

 

Call by value/ Call by reference

위의 코드처럼 출력하게 되면 a와 b는 모두 10으로 출력되게 된다. 이는 데이터가 전달되었기 때문이다. 따라서 Stack영역에는 새로운 메모리를 생성하게 된다. Main함수의 값을 변환시키기 위해서는 a와 b의 주소 값을 전달해야 한다. c의 경우에는 & 연산자를 붙여서 &a, &b를 사용하고 c#의 경우에는 ref 키워드를 사용하면 된다.

 

Stack에는 값 타입(int, double, char..)의 데이터가 저장되고 힙 영역의 오브젝트(object) 타입의 데이터 참조값이 저장된다.

Heap에는 참조 타입(String, object)의 데이터가 저장된다.

위의 그림처럼 Main함수에서 int 4를 num에 저장하게 되면 Stack에는 4라는 값이 저장되고 string name은 Stack에는 name이라는 참조값이 저장되고 Heap에는 데이터가 저장하게 된다.

위의 그림처럼 name에 새로운 값이 추가가 되면 힙에는 새롭게 할당해서 데이터를 저장하고 있게 된다. 그러면 이전 데이터는 Stack에서 참조하지 않으므로 Unreachable 객체가 되므로 GC에 의해서 소멸된다.

따라서 문자열을 추가하고 싶은 경우에는 string 보다 stringbuilder를 사용하는 방식이 좋다.

 

값 타입은 참조 타입으로 캐스팅을 할 수 있다.(int -> object) 또한 참조 타입은 값 타입으로 형 변환을 할 수 있다.(object -> int) 값 타입과 참조 타입을 넘나드는 작업을 boxing/unboxing이라고 한다.

boxing과 unboxing을 사용하면 형 변환이 어렵지 않기 때문에 사용하기 쉽다. 하지만 boxing을 하기 위해서는 새로운 개체를 만들어야 하며 할당 작업보다 약 20배의 비용이 더 든다. 또한 unboxing과정도 캐스팅 작업이 할당 작업보다 4배의 비용이 더 든다. 마찬가지로 GC가 발생한다. 단순 변수 같은 경우에는 크게 문제 되지 않지만 자료구조 형태의 경우에는 사용 시 성능에 문제가 될 수 있다.

c#에서는 컬렉션 클래스가 있는데 자료구조를 모아놓은 클래스이다. ArrayList, HashTable과 같은 자료구조가 있으며 마찬가지로 오브젝트 형 타입을 사용하기 때문에 boxing/unboxing 과정을 생긴다.

따라서 제네릭 컬렉션을 사용하는 것이 좋다. 제네릭 컬렉션은 데이터 타입을 일반화(List <T>)하여 사용하기 때문이다. 

'Programming > Basic' 카테고리의 다른 글

가비지 컬렉션(Garbage Collection, GC)  (0) 2022.07.02
[OS] 프로세스, 쓰레  (0) 2022.07.01
SOLID 원칙 (1)  (0) 2021.05.11
객체지향의 원리 - 캡슐화  (0) 2021.05.07
객체지향의 원리 - 추상화  (0) 2021.05.03

댓글