값 타입(Value Types): 데이터를 직접 저장하며, 빠르고 작은 메모리 영역인 '스택(Stack)'에 저장됩니다. 정수, 실수, 불리언, 문자, 구조체 등이 이에 해당합니다. 🚀
참조 타입(Reference Types): 실제 객체의 메모리 주소(참조)를 저장하며, 크고 유연한 메모리 영역인 '힙(Heap)'에 객체 자체가 저장됩니다. 클래스, 객체, 문자열, 배열, 리스트 등이 이에 해당합니다. 🔗
메모리 스택(Stack): LIFO(Last In, First Out) 원칙으로 작동하며, 메서드 내의 지역 변수(값 타입 및 참조 타입의 참조)가 순서대로 쌓이고 메서드 종료 시 역순으로 제거됩니다. 📚
메모리 힙(Heap): 객체 데이터가 저장되는 영역으로, 참조 타입 변수가 이 힙에 있는 객체를 가리킵니다. 🌳
값 타입의 동작 방식: 변수 할당 시 값이 복사되므로, 한 변수의 값을 변경해도 원본 변수에는 영향을 주지 않습니다. (예: int x = 10; int y = x; y = 20; -> x는 여전히 10) 🔢
참조 타입의 동작 방식: 변수 할당 시 객체 자체가 아닌 '참조'가 복사되므로, 두 변수가 동일한 힙 객체를 가리키게 됩니다. 한 변수를 통해 객체를 변경하면 다른 변수에서도 변경된 내용이 반영됩니다. (예: Person p1 = new Person(); Person p2 = p1; p2.Name = "Bob"; -> p1.Name도 "Bob"이 됨) 👯
가비지 컬렉션(Garbage Collection): C#에서 힙 메모리를 자동으로 관리하는 기능으로, 더 이상 참조되지 않는 힙 객체를 찾아 메모리에서 제거하여 메모리 누수를 방지합니다. ♻️
메모리 누수(Memory Leaks): 참조가 남아있지만 더 이상 사용되지 않는 객체들이 힙에 쌓여 메모리를 불필요하게 점유하는 현상으로, C#에서는 가비지 컬렉션 덕분에 흔치 않지만 비효율적인 코드에서 발생할 수 있습니다. 💧
이론 이해의 중요성: 값 타입과 참조 타입의 차이를 이해하는 것은 코드의 동작 방식을 정확히 예측하고, 특히 객체 할당 및 변경 시 예상치 못한 부작용을 피하는 데 필수적입니다. 💡