Value type
primitive Type(int, float, bool, char 와 같은 기본 데이터 타입)과 구조체가 이에 해당한다.
변수의 선언과 동시에 값을 할당할 수 있으며 스텍에 메모리가 생성된다. 이렇게 단일한 공간에
생선된 데이터는 직접적이며 변수의 대입이나 매개변수로 데이타를 전달할 때 메모리 복사가 일어난다.
Reference type
Class, String, Object (이것들과 더불어 배열은 그 구성요소의 형식과 상관없이 항상 참조 형식이다.)
참조 타입을 사용하기 위해선 new 키워드를 통해 객체를 초기화한 후 힙에 할당된 메모리를 스택공간에서 참조해야 한다.
객체를 지시하는 메모리는 필요로하는 메모리공간(힙)의 주소와 그것을 가리키는 참조 값(스택)으로 분리되어 저장된다.
다시말해 아직 수행되지 않은 데이터를 위해 예약어인 new 키워드를 사용해 객체를 초기화하여 인스턴스를 만들면
그 과정에서 시스템은 힙공간에 필요한 만큼의 메모리 블록을 준비하여 스택에서 그 주소 정보를 참조할 수 있도록 해준다.
여기서 참조 타입의 변수를 다른 곳에 대입하거나 매개변수로 데이터를 전달 할 때도 reference 자체만 복사되고
실제 참조로 가리키는 힙에 저장된 메모리는 동일하다.
참조 변수로 객체 참조하기
참조 변수인 trollPick 과 normalPick 은 객체의 주소값을 의미하고 스택에 저장된다. 그리고 이들이 가리키는 메모리 공간의 실제 대상인 객체가 힙에 저장된다.
여기서 trollPick 참조 변수에 normalPick 참조 변수를 대입한다면
->말로 다시 풀이해보자면 타릭이라는 기존의 normalPick이 trollPick이라는 새로운 별칭을 얻었고
그동안 trollPick의 대명사로 불렸던 마스터 이는 이제 어떤 참조로도 형용할 방법이 없어진 것과 같다.
이렇게 객체 정보를 어떤 변수에서도 참조하지 않게 되면 시스템에서는 그 객체를 가비지 컬렉션(Garbagecollection)의 대상으로 표시하게 되고
더 이상 참조되지 않는 객체는 제거되며 그 객체가 점유하고 있던 메모리 공간을 회수해간다.
그런데 이 Garbage collection은 상당히 비용이 큰 연산이기 때문에 특별한 경우를 제외하고 최대한 이런 작업은 줄이도록 노력해야 한다.
프로그램의 어딘가에서 참조변수가 다른 객체를 참조하도록 예정되어 있다면 다음과 같이 코드를 수정하는 것이 좋다.
'Programming > C++, C#' 카테고리의 다른 글
[C#] 박싱과 언박싱 (0) | 2018.06.06 |
---|---|
[C#] 암시적 변환 vs 명시적 변환 (0) | 2018.06.05 |
클래스(정적멤버) (0) | 2018.06.05 |
클래스(생성자) (0) | 2018.06.04 |
클래스(캡슐화) (0) | 2018.06.04 |