지지나

C# 프로그래밍 데이터 타입과 변수를 배워봐요 1 본문

기획자의 프로그래밍 걸음마/C#

C# 프로그래밍 데이터 타입과 변수를 배워봐요 1

Gygyna 2020. 5. 9. 17:18

안녕하세요~ 5월 한 주 푹 쉬며 프로그래밍 공부를 놓다가 다시 강의를 들었습니다. 

한 것도 없는데 쉬었네요ㅋㅋㅋ

 

저는 컴띵에서 인강으로 독학을 하고 있는데, 정말 쉽지 않습니다ㅠ 30분짜리 강의 하나를 듣는데 필기하고, 직접 해보고 하면 1시간 반이 훌쩍 지나가 있어요. 

 

C#에서는 다양한 데이터 형식을 지원하는데 크게 값 형식(Value Type)과 참조 형식(Reference Type)으로 분류 할 수 있습니다. 

우선 진짜 간단하게 스택의 값 형식을 테스트 해보았어요. 

 

정수형식의(int) 의 i 와 j 라는 그릇에 i는 300, j는 500으로 값을 출력해보았습니다. 

여기서 i와 j는 같은 크기에요. 왜? int 형식이니까요! 저처럼 500이 더 크니까 j가 더 큰거 아냐? 이러면 아니되오ㅜ

그리고 값 형식의 스택에 저장된 변수들은 자신의 영역이 끝나면 저장되었던 메모리에서 제거 됩니다. 

 

아래 사진의 빨간 상자에 static void {} 닫힌 거 보이지요? 그럼 i와 j 변수는 스택에서 제거 됩니다. 

정말로 변수가 메모리에서 해제된 건가? 테스트를 위해서 나름..애써보았는데 저 오류가 맞는지는 모르겠네요 흑ㅠ 

 

암튼 이제 구조체의 값 형식을 보겠어요. 이 역시 값 형식이므로 자신의 영역이 끝나면 사용했던 변수는 메모리에서 제거가 됩니다! 

저는 Chicken 이라는 이름의 구조체를 선언했고, 정수형으로 a,b 두 개의 그릇을 준비했어요. 

저는 직접 해보면서 경고 메세지를 힌트로 참고하고 있는데요, 아직 제가 s1이라는 변수는 만들었지만 값은 넣지 않았다는걸 알 수 있어요. 

 

여기서 chicken s1 = new chicken (); 은 객체를 생성하는 것이 아니라, 오로지 값만 할당 받는 구조체이다!

스택 공간에 chicken 은 a,b가 동시에 들어간 게 메모리에 할당되는 것임

구조체 값 형식에서 이것저것 테스트 해 보았어요. 뒤에 나오는 힙에서는 참조형식과 매우 유사한데 엄청 다르게 출력되기 때문이에요..

*값을 복사할 경우 새로운 메모리 공간이 별도로 생성된다 s2.b=700; 이라 할 시 s1.b 는 여전히 200으로 남아있습니다. 

 

참조형식에서는 값 형식과 달리 변수의 영역이 끝나도 {} 이 값을 계속 가지고 있습니다. 

힙에서는 데이터 내용을 기억하고, 스택에는 해당 데이터가 있는 주소를 기억합니다. 

chicken 클래스 안에는 a,b 두 개의 요소가 있습니다. 

여기서 chicken s1 = new chicken (); 의 s1은 객체가 되고, 객체는 클래스를 참조합니다.

s1 객체가 힙 영역에 할당이 되고, 스택에서는 그 s1의 주소를 참조합니다.

chicken s2=s1; 은 chicken class를 참조하는 변수 s2 객체가 있다는 뜻 입니다. 

s2역시 chicken class의 같은 번지를 똑같이 기억해요. 

s2.a=500; 이라 했더니 s1.a, s2.a 모두 500이 인쇄되고 있습니다! → 메모리가 새로 추가되는 것이 아니라 실제 메모리 영역이 같은 곳을 가리키기 때문입니다 (주소를 기억하므로)

 

Struck 대신 Class 를 쓴 것인데 출력되는 값이 차이가 급니다. 

 

Comments