C#의 모든 자료형은 값 또는 참조 두 가지로 분류된다.
static void Main(string[] args)
{
int a = 10;
}
static void Main(string[] args)
{
Random rand = new Random();
}
a | 10 |
rand | 0x01 |
객체 | rand의 주소 0x01 |
이렇게 int, float 등 기본 자료형은 값, 클래스로 만들어진 인스턴스(객체)는 참조
메서드의 매개변수로 값과 참조 전달 시 큰 차이가 발생한다.
class Program
{
static void Change(int input)
{
input = 20;
}
static void Main(string[] args)
{
int a = 10;
Change(a);
Console.WriteLine(a);
}
}
이렇게 a에 10이 들어있고, Change 함수에 a를 매개변수로 넘기면 10이라는 값이 나온다.
즉 원본 a의 값이 변경되지 않았다.
하지만 클래스를 통한 참조 형식은 다르다.
class Program
{
class Test
{
public int value = 10;
}
static void Change(Test input)
{
input.value = 20;
}
static void Main(string[] args)
{
Test test = new Test();
test.value = 10;
Change(test);
Console.WriteLine(test.value);
}
}
이 코드의 출력 결과는 20이 나온다.
test라는 인스턴스를 생성하여 test 클래스의 필드의 멤버변수를 10이라고 한 후 Change 변수에
test 인스턴스를 참조하여 value가 20이 된다.
즉 Change 함수의 input변수는 메인 함수의 test인스턴스와 같은 공간을 가리킨다.
이렇게 값의 복사와 참조에 따라 원본의 결과가 달라지기도 그래도 되기도 한다.
static void Main(string[] args)
{
Test testA = new Test();
Test testB = testA;
testA.value = 10;
testB.value = 20;
Console.WriteLine(testA.value);
}
이런 식으로 간단하게 값을 참조할 수 있다.
'Unity > c#' 카테고리의 다른 글
7. C# 상속성 (0) | 2023.09.21 |
---|---|
5. C# 캡슐화와 프로퍼티 (0) | 2023.09.01 |
4. C# 생성자(Constructor)와 소멸자(Destructor) (0) | 2023.08.06 |
3. C# 메서드, 접근 제한자 (0) | 2023.08.01 |
2. C# - 많이 쓰는 Math 클래스와 클래스의 인스턴스 (0) | 2023.07.17 |
댓글