C# 메모리 관리 – 참조 생성하기 Creating a Reference
C# 메모리 관리 – 참조 생성하기 Creating a Reference
참조 생성하기 Creating a Reference
앞에서 값 타입 value type의 참조를 생성하는 것이 가능하다는 것을 살펴봤습니다. 함수 내에서 인티저 integer 변수를 하나 생성한다고 가정해 보겠습니다. 그런데 함수 안에서 생성된 변수를 나중에 사용하기 위해서 유지하려고 합니다. 함수 안에서 변수를 생성하면 자동 변수가 생성되어 함수가 종료되면 해당 변수는 사라집니다.
이 경우, 동적으로 할당되는 변수를 생성해서 힙에 그 참조 값을 저장하도록 할 수 있습니다.
using UnityEngine; using System.Collections; public class Test:MonoBehaviour { int number; void Update () { if(Input.GetKeyDown (KeyCode.C)) CreateVariable(); if(Input.GetKeyDown (KeyCode.Space)) PrintVariable(number); } void CreateVariable() { //int number = new int(); number = new int(); number = 10; Debug.Log ("In function "+number); } void PrintVariable(int n) { Debug.Log (n); n+=10; } }
첫 부분에 int 타입의 변수 number를 전역 변수로 선언했습니다. 이 변수를 CreateVariable 안에서 사용하고 new int()를 이용해서 integer 변수의 참조 값을 할당했습니다.
new 키워드는 해당 변수를 참조하는 참조 값을 반환하고 그 변수는 힙heap에 성생됩니다. 참조 값은 number 변수 안에 저장되고 이 값은 새로 생성된 변수의 주소 값입니다. number 변수를 사용하면 이 변수를 간접적으로 사용하게 되는 것입니다. 새로 생성된 변수는 함수 외부에서도 유지됩니다.
주석 처리된 부분에 적힌 방법을 사용하면 함수가 끝났을 때 새로 생성된 변수에 대한 참조를 잃어버리게 됩니다. 가비지 컬렉터가 메모리를 회수하려는 시점에, 아무도 참조하지 않는 데이터가 있는 것을 발견하고 메모리에서 제거하기 때문입니다. 또한 int number;와 같이 이 방법으로 지역 변수를 선언하면 전역 변수 int number를 가리게 됩니다.
참조 변수에 int와 같은 기본 타입의 변수를 저장하는 경우 컴파일러는 박싱boxing 이라고 불리는 기능을 수행하는데, 이는 클래스 내부의 기본 타입의 변수를 감싸는 동작을 합니다. 이런식으로 선언된 변수는 힙에 할당되고 이 변수가 해제될 때 가비지 컬렉션을 발생시킵니다. 또한 이런 변수들은 일반적으로 생성된 기본 타입의 변수들 보다 메모리를 더 차지하게 됩니다.
기본적인 박싱boxing 상황을 살펴보겠습니다. Debug.Log(object); 함수를 사용할 때, 파라미터가 object라는 것은 어떤 타입의 변수도 함수에 전달이 가능하다는 것을 의미합니다. 하지만 integer를 전달하면, 컴파일러는 전달된 integer를 object로 박싱 처리합니다. 이 경우, 아래 스크립트처럼, 상황을 미리 예상해서 박싱을 최적화할 수 있습니다:
void PrintingManyTimes(int n) { object obj = n; for(int i = 0;i < 500;i++) Debug.Log(obj); }
위의 예제에서 컴파일러는 Debug.Log를 호출할 때 마다 박싱을 수행할 필요가 없습니다. 박싱은 한번 수행되고 나머지 500번의 호출 시에는 박싱이 발생하지 않습니다.
내용 끝까지 읽어주셔서 감사합니다.
배너 클릭은 저에게 많은 힘이 됩니다.
감사합니다 🙂