● 값형과 참조형
1. 값형
- 변수에 값을 직접 저장
- 변수가 실제 데이터를 보유
- 해당 변수를 다른 변수에 할당하거나 전달할 때는 값이 복사
- 변수의 수정은 해당 변수의 값만 변경하므로 다른 변수에 영향을 주지 않음
- stack에 할당
- ex) int, float, doulbe, bool 등의 기본 데이터 타입
struct MyStruct
{
public int Value;
}
MyStruct struct1 = new MyStruct();
struct1.Value = 10;
MyStruct struct2 = struct1; // struct2는 struct1의 값 복사
struct2.Value = 20;
Console.WriteLine(struct1.Value); // 출력 결과: 10
2. 참조형
- 변수가 데이터에 대한 참조 (메모리 주소)를 저장
- 변수가 실제 데이터를 가리키는 참조를 갖고 있으며, 해당 변수를 다른 변수에 할당하거나 전달 할 때는 참조가 복사
- 참조형 변수의 수정은 동일한 데이터를 가리키고 있는 다른 변수에 영향을 줄 수 있음
- heap에 할당
- ex) 클래스, 배열, 인터페이스 등
class MyClass
{
public int Value;
}
MyClass obj1 = new MyClass();
obj1.Value = 10;
MyClass obj2 = obj1; // obj2는 obj1과 동일한 객체를 참조
obj2.Value = 20;
Console.WriteLine(obj1.Value); // 출력 결과: 20
● 박싱(Boxing) 과 언박싱(UnBoxing)
1. 박싱 : 값형을 참조형으로 변환하는 과정
2. 언박싱 : 박싱된 객체를 다시 값형으로 변환하는 과정
3. 주요 특징 :
- 반복적인 박싱과 언박싱은 성능 저하를 초래
- 박싱된 객체는 힙 영역에 할당되므로 가비지컬렉션의 대상이 될 수 있음, 메모리 관리에 유의
- 박싱된 객체와 원래의 값형은 서로 독립적이므로 값을 수정하더라도 상호간에 영향을 주지 않음
using System;
class Program
{
static void Main()
{
// 값형
int x = 10;
int y = x;
y = 20;
Console.WriteLine("x: " + x); // 출력 결과: 10
Console.WriteLine("y: " + y); // 출력 결과: 20
// 참조형
int[] arr1 = new int[] { 1, 2, 3 };
int[] arr2 = arr1;
arr2[0] = 4;
Console.WriteLine("arr1[0]: " + arr1[0]); // 출력 결과: 4
Console.WriteLine("arr2[0]: " + arr2[0]); // 출력 결과: 4
// 박싱과 언박싱
int num1 = 10;
object obj = num1; // 박싱
int num2 = (int)obj; // 언박싱
Console.WriteLine("num1: " + num1); // 출력 결과: 10
Console.WriteLine("num2: " + num2); // 출력 결과: 10
}
}
* object는 모든 클래스의 상위 클래스 ,모든 클래스는 object에서 상속되며, object는 모든 형식을 참조할 수 있는 포괄적인 타입
※ 리스트 활용 예제
List<object> myList = new List<object>();
// 박싱: 값 형식을 참조 형식으로 변환하여 리스트에 추가
int intValue = 10;
myList.Add(intValue); // int를 object로 박싱하여 추가
float floatValue = 3.14f;
myList.Add(floatValue); // float를 object로 박싱하여 추가
// 언박싱: 참조 형식을 값 형식으로 변환하여 사용
int value1 = (int)myList[0]; // object를 int로 언박싱
float value2 = (float)myList[1]; // object를 float로 언박싱
* 값형과 참조형, 박싱과 언박싱의 개념을 확실히 이해해야 함 , C#에서 개발을 할 때 매우 중요한 개념
'C#' 카테고리의 다른 글
LINQ (0) | 2023.11.14 |
---|---|
델리게이트 (Delegate), 람다(Lambda), Func, Action (0) | 2023.11.14 |
범위 내 입력값 받기 (1) | 2023.11.13 |
콘솔 글자색 변경 (0) | 2023.11.13 |
문자 앞뒤로 특정 문자 입력 (RightPad, LeftPad) (0) | 2023.11.13 |