패스트캠퍼스 챌린지 21일차
본문 바로가기
  • 게임 개발자가 되고싶은 구구
게임 개발 공부/패스트 캠퍼스 이벤트

패스트캠퍼스 챌린지 21일차

by gugu99 2021. 11. 21.
반응형

안녕하세요!

오늘도 게임개발자가 되기위해 공부하고 있는 구구입니다.

오늘은 갓생살기 21일차가 되는날입니다.

 

오늘도 어제에 이어 C#의 데이터 응용에 대해 알아보도록 하겠습니다.

 

 

 

 

 

 

 

오늘은 조금 이해하기 힘들 수도 있는 개념에 대해 이야기 해보려합니다.

바로 값형식과 참조형에 관한 이야기입니다.

 

 

C#-값형식-참조형-value-reference-주소-주소값-참조-포인터
필기자료 1

 

 

값형식은 우리가 알고있는 int와 같은 수치데이터, char, bool 과 같은 자료형을 저장할 때 쓰는 방식입니다.

 

 

특징으로는 두개의 변수가 서로 영향을 주지 않는다는 점입니다.

위의 필기자료 1을 보시면 값형식의 경우 데이터가 저장되는 모습을 그림으로 그렸습니다.

값형식은 스택영역에 값이 바로 저장되는 모습을 확인 할 수 있습니다.

 

 

참조형 값이 힙영역에 저장이 되고 그 때 저장된 힙 영역의 주소를 스택영역에 받고 이를 또 str값이 받습니다.

 

 

여기서 스택영역힙 영역이 무슨차이인지 알아보도록 합시다.

 

우선 스택영역은 함수호출과 관계된 지역변수와 매개변수가 저장되는 영역입니다.

따라서 함수가 호출되면 할당되고 함수가 끝나면 소멸합니다.

 

힙 영역은 프로그래머에 의해 동적으로 할당되고 해제되는 영역입니다.

값이 너무 크거나 그 크기를 미리 알 수 없는 경우 힙영역을 이용하게 됩니다.

따라서 가벼운 값은 스택영역을 이용해서 빠르게 처리를 하지만 무거운 값의 경우는 스택영역이 다 커버하기 힘들어서

힙영역에 저장 후 그 주소값을 스택영역에서 쓰는 형식을 사용하고 있습니다.

 

그 외에도 메모리의 구조로 코드영역과 데이터 영역도 존재하는데 가볍게 언급하고 넘어가겠습니다.

 

코드영역은 실행할 프로그램의 코드가 저장되는 영역입니다.

CPU가 해당 영역에 저장된 명령을 가져와서 처리합니다.

이 코드영역은 프로그램이 시작하고 종료될때까지 메모리에 계속 남아있게됩니다.

 

데이터 영역은 전역변수와 정적(static) 변수가 저장되는 영역입니다.

프로그램의 시작할 때 할당되고 끝나면 소멸합니다.

 

static에 관한 내용은 다음에 시간이 나면 언급하도록 하겠습니다.

 

 

 

C#-값형식-참조형-value-reference-주소-주소값-참조-포인터

 

int의 경우 앞서 값형식이라는 사실을 상기하고 위 코드를 확인해봅시다.

num에는 100이 스택영역에 저장될 것이고 refNum에 num이 저장되니 refNum에는 100이 저장될 것이고 또 refNum에 1000을 넣는다고 했으니 결론적으로

num=100, refNum=1000 이고 둘의 주소값은 다를 것입니다. 즉, 가리키는것이 다릅니다.

 

int[]의 경우 배열과 관련되있는데 아직 배우진 않았지만 우선 배열은 참조형을 사용한다는 사실을 알고 넘어가도록 하겠습니다.

배열이 힙 영역에 저장될 것이고 그 주소값이 스택영역에 저장되고 그 값을 arrNum이 받을 것입니다.

그리고 refArrNum은 arrNum의 값을 받습니다. 즉 힙영역에 저장된 배열을 가리키는 주소값을 받습니다.

그렇다면 여기까지보면 refArrNum과 arrNum은 서로 같은 것을 가리킨 다는 것을 알 수 있습니다.

그리고 그 가리키는 값은 배열 {100, 200}일 것입니다.

그리고 refArrNum[0] = 1000(배열 첫번째 수를 1000으로 바꿔라는 뜻)에서 100이 1000으로 바뀔 것입니다.

그렇다면 refArrNum과 arrNum은 서로 같은것을 가리키고 있기에 arrNum의 배열도 {100, 200}이 아닌 {1000, 200}으로 바뀌었을 겁니다.

이해를 돕기위해 아래의 그림을 남기겠습니다.

 

C#-값형식-참조형-value-reference-주소-주소값-참조-포인터

결과를 보면서 이야기를 계속 하도록 하겠습니다.

 

 

C#-값형식-참조형-value-reference-주소-주소값-참조-포인터

 

 

결과값에도 나와있듯이 num값은 refNum이 바뀐것과 상관없이 100이 저장되어있고 그 주소값도 서로 다릅니다.

하지만 refArrNum에 의해 arrNum은 바뀌었기때문에 배열의 첫번째 값은 1000으로 바뀌었고 둘이 가리키는 주소값은 같기에 TRUE가 뜬 것을 확인할 수 있습니다.

 

 

 

 

다음은 boxing과 unboxing에 대해 알아보도록 하겠습니다.

 

 

해당 내용은 코드를 보면서 설명하는게 더 쉽게 때문에 코드를 보면서 설명하겠습니다.

i에 123이 스택영역에 저장됩니다.

그리고 object o에 i가 저장됩니다.

그렇게되면 o는 int형의 123이라는 값이저장되는데 이때 값이 힙 영역에 저장됩니다.

위에서 100 200이 저장되었던 방법처럼

 

힙 영역

int

123

 

과같이 저장이 될 것입니다.

이와같이 힙 영역에 저장하게 되면서 boxing이 발생하게 됩니다.

그리고 이는 힙 영역에 메모리가 생기는 것이기에 무거운 과정(성능이 떨어지는 과정)이고 불필요한 메모리를 차지하게 됩니다.

 

그리고 int j = (int)o; 에서 o를 캐스팅 연산을 통해 o를 int형으로 강제로 바꿉니다.

그렇게되면 힙 영역에 저장된 int 123을 풀게되고 j에 123을 저장하게 됩니다.

이 과정을 unboxing이라고 합니다. 하지만 unboxing도 무거운 과정이기에

boxing과 unboxing 둘다 최소한으로 해주는 것이 좋습니다.

 

 

 

 

 

 

 

 

 

 

 

 

좀더 자세한 분석과 결과확인은 다음에 이어서 하도록 하겠습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

https://bit.ly/3FVdhDa 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다. 

반응형

댓글