Laboratory of alumina

alumina.egloos.com

포토로그 마이가든




03. value type, reference type by 알루미나


일단 변수 선언부터 설명하기로 하자.

//value-type variable definition

int u;

//value-type variable definition with initialization

int v = 100;



//reference-type variable definition

object obj;

//reference-type variable definition with initialize as new object

object obj2 = new 
object();

//reference-type variable definition with initialize as null

object obj3 = null;



뭐 문법을 보니깐 변수 선언은 별 차이가 없는것 같다.

근데 미묘하게 다르긴 다르다. 참조 타입은 new로 선언한걸 보니깐 뭔가 있는것 같긴 한데 말이다.



value 타입과 reference 타입이 어떻게 다른가? 간단하다.

항상 value 타입은 메모리가 stack에 할당되는 반면에 reference는 heap에 할당된다.

그리고 value 타입은 그 자체가 값인데 비해 reference는 어떤곳의 참조(주소값)이 들어있다.

이게 뭔 차이가 있냐고? 아주 큰 차이가 있다.



다음을 보자.

void Work()

{

    int u = 100;

    object obj = new object();

    //do something

       
}

위에서 변수 u에서 저장된 값은 Work() 종료후 스택과 함께 사라진다.

반면 여기서 obj가 '가리키고 있는' 객체는 Work()가 종료되도 여전히 살아남아있다.


Work() 호출

Work() 리턴후 스택 파괴


또 하나 중대한 차이점이 있는데 reference 타입은 null을 값으로 가질 수 있다.

하지만 value는 항상 값이 존재하므로 null을 값으로 가질 수 없다.



자 그럼 여기서 한가지 의문이 생긴다. 왜 value와 reference를 나눈거지?

답은 간단하다. 성능상의 문제 때문이다.

stack에 메모리를 할당하는게 heap보다 훨씬 빠르지만 앞에서 보았듯이

변수의 scope 제약을 피할 수 없기 때문이다.

고로 두개를 상황에 따라 적당히 쓰기 위해 타입의 분리가 필요하다.



그리고 한가지 빼먹을 뻔했는데 사실 new 연산자는 참조타입이라서 쓰는게 아니다.

value 타입이나 reference타입이나 둘 다 쓸 수 있다.



가령 예를들면 int u = new int(); 이런식으로 말이다.

하지만 문법이 같다고 해서 동작까지 같진 않다. 실제로 value 타입은 new 연산자로 할당해도 스택에 할당되기 때문이다.



마지막으로 다른 value 타입인 enum, struct타입에 대한 자세한 설명은 다음으로 미루기로 하겠다.


트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://alumina.egloos.com/tb/720801 [도움말]

덧글

댓글 입력 영역