C#

값형과 참조형 (박싱과 언박싱)

잼잼재미 2023. 11. 13. 18:25

● 값형과 참조형

 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