공부일지

메모리 특강 내용 정리 본문

코딩/C#

메모리 특강 내용 정리

이하택 2023. 10. 6. 00:02

Q. 데이터 10을 저장하고 싶을 때 데이터 10이 어디에 저장되느냐? 맨앞? 맨끝?

  • 정답은 Random이다.

이렇게 메모리의 주소를 지목하여 데이터를 대입하는 과정을

우리는 변수에 데이터를 대입하며 익혀왔다.


int x = 10;
int y = x;

x = 20;

Console.WriteLine(y);
//result : 10

person yeom = new person("염예찬", 32);
person chad = yeom;

yeom.age = 33;

Console.WriteLine(chad.age);
//result : 33

정수형 변수의 경우

  • 각 데이터에게 서로 상호 무관한 자기의 방이 있음.

  • 복사가 진행될 때 해당 방에서 내용물을 복사 시켜줌.
    • Call by Value

클래스의 경우

  • 정확한 설명은 아니나, 간략히 설명하자면 실질적인 인스턴스의 값이 heap의 어딘가에 저장되어 있으며 stack에 이 heap의 주소가 저장되어 있는 꼴이다.

  • 따라서 데이터를 받을 때 heap에 있는 실제 데이터가 아닌, stack에 저장된 heap의 주소를 전달 받는다.
    • Call by Reference

  • 우리가 널리 알고있는 자료형들(int, string, char…)등은 stack에 저장되며,
    • new 키워드로 선언되는 모든 친구들은 (class 포함) heap에 저장.


So, 어쩔?

  • ‘Destroy() 하면 되겠네’
    • heap에 저장된 값은 기본적으로 유저 맘대로 삭제해 주지 않는다.
    • Destory되고, Scene 전환되고, 함수 종료 되고 등등등 하고 나서 GC(Garbage Collector)가 수거함.
    • 언제 난입해서 수거할 지 모르기에, 우리의 폐기될 인스턴스가 언제 사라질지도 모름.
    • 결국 GC는 heap에서 데이터들을 한번에 수거하게 되며, 과도한 양의 수거는 GC를 불안하게 해요.

이것은 Coroutine에도 해당하는 이슈.

  • 가령 코루틴을 통해 3초 지연시키는 코드를 작성한다고 해보자.
IEnumerator WaitSec()
{
	yield return new WaitForSeconds(3.0f);
}
  • 여기도 결국 new 연산자를 통해 지연 부분을 구현하고 있다.
  • 이때 만약 해당 코루틴 함수가 Update문 안에서 호출된다면 어땠을까?
IEnumerator WaitSec()
{
	yield return new WaitForSeconds(3.0f);
}
void Update()
{
	WaitSec();
}
  • Update에 의해 프레임 단위로 호출되며 지속적으로 WaitForSecondes를 생성하겠고, 결국 위와 같은 구조로 GC에게 부담을 주게 되겠다.

💡
따라서 앞으로는 아래와 같이 미리 선언된 new WaitForSeconds()를 호출하여 사용하자.
WaitForSeconds waiter = new WaitForSeconds(3.0f);
IEnumerator WaitSec()
{
	yield return waiter;
}
void Update()
{
	WaitSec();
}


예외

  • 이쯤되면 new Vector3, new Color, new Quarternion 등등 우리가 빈번히 유니티에서 써온 모든 것들에 회의감이 들어온다.

  • 하지만 걱정 마시라, 위의 것들은 Stack형이 아니니.
    • 위의 코드들은 복합 데이터 형식 중에서도 heap에 속하지 않는 구조체 형식이다.
    • 자세한 내용은 생략하고 결론적으로 stack에 저장되며, 유저의 필요가 없어지면 바로 사라지고, 결론적으로 GC에 부하를 일으키지 않는다.

  • ‘개꿀 앞으로 구조체만 써야지’

  • 절대 안된다.
  • 구조체는 메모리 크기를 많이 먹기 때문에 여차하면 StackOverflow

  • 결론은 ‘구조체를 써라!’ 가 아니다.
    • 개념적으로 ‘구조체를 쓰면 위험도가 낮아지긴 한다.’ 이것이 중점이다.


마무리 지으며…

본인이 면접을 본다고 상상해보자.

면접관이 값 형식과 참조 형식을 묻는다면 어떻게 대답할 것인가?

물론 위의 대답들은 개념적으로 출중할 수는 있으나, 이것이 면접관이 듣고싶어하는 대답일까?

공부하면서 단순히 개념만을 딸딸딸 외는 행위는 이렇게 위험하다.

우리는 단순 암기가 아닌 “어떻게 동작하는가” 를 “우리의 언어와 스타일로 이해하고 그것을 풀어 설명하는 연습이 필요하다.”

이것에 대하여 파인만테크닉이라는 기법으로 공부하는 것을 추천하며 마무리 짓겠다.

💡
파이만 테크닉
  1. 특정 주제에 관해 알고 있는 모든 내용을 목록으로 정리하고 검토하라.
  1. 그 개념을 전혀 모르는 사람에게 어린 아이도 이해할 수 있는 언어로 설명하라.
  1. 설명에 빈 틈이 있는지 파악하고 그것을 메꾸려 노력하라.
  1. 간략하게 정리해 포괄적으로 이야기하라.



Reference

내일배움캠프
국비지원 코딩, 내일배움캠프는 개발자 취업까지 자신 있습니다. 기간 제한 없는 취업 컨설팅을 받으며 비전공자 IT취업 준비, 확실히 끝내세요.
https://nbcamp.spartacodingclub.kr/game
복합 데이터 형식 - Visual Basic
자세한 정보: 복합 데이터 형식(Visual Basic)
https://learn.microsoft.com/ko-kr/dotnet/visual-basic/programming-guide/language-features/data-types/composite-data-types
디지털 시대에도 효과적인 파인만 학습법
복잡한 내용을 기억하기 쉽게 설명하는 사람은 그만큼 이해하고 정리하는 데 많은 노력을 기울였다고 보면 좋습니다. 12살 짜리 아이도 이해할 수 있도록 쉽게 설명해야 한다고 역설한 노벨상 수상자 리처드 파인만 교수의 학습법을 소개합니다.
https://news.sap.com/korea/2022/08/%EB%94%94%EC%A7%80%ED%84%B8-%EC%8B%9C%EB%8C%80%EC%97%90%EB%8F%84-%ED%9A%A8%EA%B3%BC%EC%A0%81%EC%9D%B8-%ED%8C%8C%EC%9D%B8%EB%A7%8C-%ED%95%99%EC%8A%B5%EB%B2%95/

Uploaded by N2T

'코딩 > C#' 카테고리의 다른 글

연산자  (0) 2023.10.25
제어문  (0) 2023.10.25
데이터 보관  (0) 2023.10.24
기본 자료형  (0) 2023.10.24
Stack을 C#으로 - 특강 정리(작성중)  (0) 2023.10.18