본문 바로가기

교육 노트/C# 강의

[C# 때려잡기] C# 강의 12. 참조형식 자료형

길이가 2인 배열에서 첫번째와 두번째요소를 바꾸는 함수를 짜보자

이때 ref키워드를 쓰지않고 그냥 해보자


using System;

namespace HelloWorld
{
class Program
{

static void ChangeArr(int[] arr)
{
int temp = arr[0];

arr[0] = arr[1];

arr[1] = temp;

}

static void Main(string[] args)
{
int[] arr = { 10, 5 };
ChangeArr(arr);
Console.WriteLine("arr0:{0},arr1:{1}", arr[0], arr[1]);
}
}
}


ref키워드를 사용하지않고 값에의한 전달을 하였는데 배열내부의 값이 변경되었다.



1. 참조 형식

이는 C#에서 배열이 참조형식 자료형 이기때문이다.


C#에서 데이터들은 값형식과 참조 형식이 존재한다.

C# 형식은 참조 형식과 값 형식 두 가지가 있습니다. 참조 형식의 변수에는 데이터(개체)에 대한 참조가 저장되며, 값 형식의 변수에는 해당 데이터가 직접 포함됩니다. 참조 형식에서는 두 가지 변수가 같은 개체를 참조할 수 있으므로 한 변수에 대한 작업이 다른 변수에서 참조하는 개체에 영향을 미칠 수 있습니다. 값 형식에서는 각 변수에 데이터의 자체 사본이 들어 있으며 한 변수의 작업이 다른 변수에 영향을 미칠 수 없습니다 -MSDN

참조형식자료형은 변수 그자체가 어떤 데이터에 대한 참조이고

값형식 자료형은 변수 그자체가 그 데이터값이다.

int는 값형식이다.

arr는 참조형식이다.


따라서 참조 형식인 arr을 넘기면

arr자체를 바꾸는(참조되는 데이터)것은 ref를 사용하지않으면 불가능하지만

이미 참조하고 있는데이터의 내부 값을 변경하는것은 가능하다. 즉

using System;

namespace HelloWorld
{
class Program
{

static void ChangeArr(int[] arr)
{
arr[0] = 0; //이미 arr이 참조하고있는 데이터의 내부를 변경
arr = new int[10]; //arr이 참조하는 데이터를 변경
arr[0] = 100; //위 코드로 인하여 arr이 새롭게 참조는 데이터의 내부를 변경

}

static void Main(string[] args)
{
int[] arr = { 10, 5 };
ChangeArr(arr);
Console.WriteLine("바뀐값은 ? {0}", arr[0]);
}
}
}


ref키워드가 없기때문에 ChangeArr의 첫번째 코드로 인하여

요기서

요렇게 main함수에 있는 arr이 참조하고있던 데이터의 값이 변경되었지만


2번째 코드로인하여

이렇게 되버리면

changeArr에서 아무리 값을 변경해도 main의 arr에 영향을 끼치지 않는다.

728x90