여러분. 저번에 값 타입에 대해 학습하신 것을 기억하시나요?
이번에는 참조 타입에 대해 알아볼 텐데요.
참조 타입은 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변수에 할당했습니다.
이렇게 되면 실제 객체를 복사하는 게 아니라, 객체의 주소가 복사된다고 했죠?
person2는 person1이 참조하는 동일한 Person 객체를 참조하게 됩니다.
따라서 person2를 통해 객체의 데이터를 변경하면, person1을 통해서도 그 변경 사항이 반영될 것입니다.
// person2를 통해 객체의 데이터 변경
person2.Name = "Bob";
// person1을 통해 변경된 데이터 확인
Console.WriteLine(person1.Name); // 출력: Bob
C#
복사
위 예제에서 person2.Name = "Bob";을 실행한 후 person1.Name을 출력하면 "Bob"이 됩니다.
이는 person1과 person2가 같은 객체를 참조하기 때문에 발생하는 결과입니다.
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): 데이터가 힙 메모리에 저장되며, 변수는 데이터의 주소를 참조합니다. 복사 시 주소만 복사됩니다.
결론
참조 타입은 메모리 관리와 객체 구조를 효율적으로 다루는 데 중요한 역할을 합니다.
객체의 주소를 참조하고, 동적 메모리 할당을 지원하며, 다양한 데이터 구조를 처리하는 데 유용합니다.
결국 클래스, 배열, 문자열, 델리게이트는 모두 참조 타입입니다.
그러므로 이들이 어떤 방식으로 동작하는지 이해하기 위해서는 참조 타입을 잘 이해하는 게 중요하다고 생각합니다.