참조 타입

상태
완료
담당자
날짜
숫자
0
여러분. 저번에 값 타입에 대해 학습하신 것을 기억하시나요? 이번에는 참조 타입에 대해 알아볼 텐데요. 참조 타입은 C#에서 데이터가 저장되는 방식과 메모리 관리에서 중요한 역할을 하는 개념입니다. 이 개념을 이해하시면 객체지향 프로그래밍 및 메모리 관리를 효과적으로 하는 데 도움이 될 것입니다.

참조 타입의 정의

참조 타입은 객체의 실제 데이터가 메모리의 힙 영역에 저장되는 타입입니다. 참조 타입은 객체를 참조하는 변수와 실제 데이터가 분리되어 있으며, 변수는 데이터가 저장된 메모리 주소를 참조합니다.

참조 타입의 주요 특성

1. 힙 메모리 사용

참조 타입의 객체는 힙 메모리에 저장됩니다. 힙 메모리는 동적으로 할당되며, 프로그램이 실행되는 동안 객체의 수명과 관련된 데이터를 저장합니다. 힙 메모리에 저장된 데이터는 객체의 생성과 소멸에 따라 가비지 컬렉션에 의해 자동으로 관리됩니다.

2. 참조를 통한 접근

참조 타입의 변수는 실제 데이터가 저장된 위치(주소)를 참조합니다. 변수에는 객체의 주소가 저장되며, 이를 통해 객체의 데이터를 읽거나 수정할 수 있습니다. 여러 변수가 동일한 객체를 참조할 수 있습니다.

3. 복사와 공유

참조 타입의 변수를 다른 변수에 할당하면, 실제 객체의 복사가 아니라 객체의 주소가 복사됩니다. 따라서 두 변수는 동일한 객체를 참조하며, 하나의 변수에서 객체의 데이터를 수정하면 다른 변수에서도 변경 사항이 반영됩니다.
2,3번의 특성을 이해하기 어려울 것 같아 코드를 예시로 들어 설명을 하겠습니다.
1.
객체 생성
public class Person { public string Name { get; set; } public int Age { get; set; } public Person(string name, int age) { Name = name; Age = age; } } // 객체 생성 Person person1 = new Person("Alice", 30);
C#
복사
이 코드에서 Person 클래스는 참조 타입입니다. person1 변수는 Person 객체의 메모리 주소를 참조하고 있습니다. 객체는 힙 메모리(동적 메모리 영역)에 저장됩니다.
2.
참조 공유
// 다른 변수에 동일한 객체를 참조하게 합니다. Person person2 = person1;
C#
복사
person2 변수를 person1변수에 할당했습니다. 이렇게 되면 실제 객체를 복사하는 게 아니라, 객체의 주소가 복사된다고 했죠? person2person1이 참조하는 동일한 Person 객체를 참조하게 됩니다. 따라서 person2를 통해 객체의 데이터를 변경하면, person1을 통해서도 그 변경 사항이 반영될 것입니다.
// person2를 통해 객체의 데이터 변경 person2.Name = "Bob"; // person1을 통해 변경된 데이터 확인 Console.WriteLine(person1.Name); // 출력: Bob
C#
복사
위 예제에서 person2.Name = "Bob";을 실행한 후 person1.Name을 출력하면 "Bob"이 됩니다. 이는 person1person2가 같은 객체를 참조하기 때문에 발생하는 결과입니다.

4. 가비지 컬렉션

참조 타입의 객체는 가비지 컬렉션에 의해 자동으로 메모리에서 해제됩니다. 객체가 더 이상 참조되지 않으면, 가비지 컬렉터가 이를 식별하고 메모리를 회수하여 프로그램의 메모리 사용을 최적화합니다.

참조 타입의 종류

1.
클래스
클래스는 참조 타입의 대표적인 예로, 복잡한 데이터 구조와 행동을 정의할 수 있습니다.
public class Person { public string Name { get; set; } public int Age { get; set; } public Person(string name, int age) { Name = name; Age = age; } }
C#
복사
2.
배열
배열은 동일한 데이터 타입의 여러 요소를 저장할 수 있는 참조 타입입니다.
int[] numbers = { 1, 2, 3, 4, 5 };
C#
복사
3.
문자열
문자열은 참조 타입으로, 문자 데이터를 저장하고 조작하는 데 사용됩니다.
string greeting = "Hello, World!";
C#
복사
4.
델리게이트
델리게이트는 메서드를 참조할 수 있는 참조 타입입니다.
public delegate void PrintMessage(string message); public class MessagePrinter { public void Print(string message) { Console.WriteLine(message); } }
C#
복사

참조 타입과 값 타입의 차이

값 타입 (Value Type): 데이터가 직접 변수에 저장됩니다. 스택(Stack) 메모리에 저장되며, 복사 시 실제 데이터가 복사됩니다.
참조 타입 (Reference Type): 데이터가 힙 메모리에 저장되며, 변수는 데이터의 주소를 참조합니다. 복사 시 주소만 복사됩니다.

결론

참조 타입은 메모리 관리와 객체 구조를 효율적으로 다루는 데 중요한 역할을 합니다. 객체의 주소를 참조하고, 동적 메모리 할당을 지원하며, 다양한 데이터 구조를 처리하는 데 유용합니다. 결국 클래스, 배열, 문자열, 델리게이트는 모두 참조 타입입니다. 그러므로 이들이 어떤 방식으로 동작하는지 이해하기 위해서는 참조 타입을 잘 이해하는 게 중요하다고 생각합니다.