일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Kotlin
- math
- Mac
- numpy
- GIT
- Excel
- Java
- Google Excel
- PostgreSQL
- PANDAS
- Redshift
- Tkinter
- django
- Apache
- Google Spreadsheet
- SQL
- PySpark
- 파이썬
- Python
- google apps script
- Github
- list
- string
- array
- dataframe
- c#
- matplotlib
- gas
- hive
- Today
- Total
달나라 노트
C# : ref, reference (Global 변수 참조하기, Global 변수 값 변경하기) 본문
아래 코드를 봅시다.
using System;
class Sample2
{
public static void Main()
{
int x = 1;
Console.WriteLine(x);
Functions f = new Functions();
f.change_number(x);
Console.WriteLine(x);
}
}
class Functions
{
public void change_number(int x)
{
x = x + 10;
}
}
-- Result
1
1
int x = 1;
Console.WriteLine(x);
Main 내부에서 x 변수에 1이라는 값을 할당하고 있습니다.
그리고 x 값을 출력합니다.
여기선 당연히 1이 출력될겁니다.
class Functions
{
public void change_number(int x)
{
x = x + 10;
}
}
Functions class를 Sample2 외부에 선언한 후 change_number라는 method를 만들었습니다.
change_number method는 어떤 int인 x를 받아 10을 더한 후 그것을 다시 x에 할당하는 기능을 가집니다.
Functions f = new Functions();
f.change_number(x);
Console.WriteLine(x);
다시 Main으로 와서 Functions class를 f변수에 상속한 후 f의 change_number method를 호출합니다.
change_number method의 인자는 처음에 선언된 int x = 1이 주어졌습니다.
change_number method는 x를 받아 10을 더한 후 그 결과를 x에 다시 할당하는 기능을 가진다고 했으니 change_number method의 결과로 x를 출력하면 11이 될까요?
아닙니다.
결과는 1입니다.
왜일까요?
change_number method는 Sample2의 외부에서 별도의 Functions라는 class에서 선언되었습니다.
반면에 int x 변수는 Sample2의 Main method에서 선언되었죠.
class Functions
{
public void change_number(int x)
{
x = x + 10;
}
}
따라서 change_number method에서 x = x + 10을 수행할 때 왼쪽에 있는 x는 Main에서 선언된 x가 아닙니다.
즉, change_number method에서는 Main에서 선언된 변수들의 값을 변경할 수 없습니다.
그래서 결국 x = x + 10의 과정을 거쳐도 x값은 그대로 1인 것입니다.
그렇다면 Main에서 선언된 x값을 Functions class에서 선언된 change_number method에서 변경하려면 어떻게 해야할까요?
이럴 때 사용할 수 있는 키워드가 바로 ref(reference) 입니다.
위 코드를 살짝 바꿔봅시다.
using System;
class Sample2
{
public static void Main()
{
int x = 1;
Console.WriteLine(x);
Functions f = new Functions();
f.change_number(ref x);
Console.WriteLine(x);
}
}
class Functions
{
public void change_number(ref int x)
{
x = x + 10;
}
}
-- Result
1
11
일단 결과를 보면 1과 11이 출력되었습니다.
이 말은 change_number method에서 참조한 x가 바로 Main에서 선언된 x 변수 자체의 값을 건드렸다는 의미입니다.
수정된 부분이 어떤건지 하나씩 봐봅시다.
class Functions
{
public void change_number(ref int x)
{
x = x + 10;
}
}
일단 change_number method에서 parameter를 보면 int x 가 아니라 ref int x로 적혀있습니다.
ref 키워드가 붙은 parameter는 단순히 어떤 값을 전달하는게 아니라 전달받은 변수 자체를 참조한다는 의미라고 받아들입시다.
Functions f = new Functions();
f.change_number(ref x);
Console.WriteLine(x);
그리고 change_number method 호출 부분에서도 x값을 전달할 때 ref x로 전달하고 있습니다.
변수 x를 참조의 형태로 전달한다는 의미입니다.
이렇게되면 Sample2 외부에서 선언된 change_number method는 Main에서 선언된 x라는 변수 그 자체를 건드릴 수 있게 됩니다.
따라서 change_number 함수 내에서 x = x + 10의 연산을 진행할 때, x + 10의 결과가 할당되는 x는 Main에서 선언된 int x = 1; 이라는 것이죠.
이것이 change_number method가 실행된 후 x를 출력해보면 1 + 10 = 11이 출력되는 이유입니다.
using System;
class Sample2
{
public static void Main()
{
int x = 1;
Console.WriteLine(x);
Functions f = new Functions();
f.change_number(ref x);
Console.WriteLine(x);
}
}
class Functions
{
public void change_number(ref int k)
{
k = k + 10;
}
}
-- Result
1
11
참고로 위처럼 change_number 함수 선언 부분에서 parameter의 이름은 원하는대로 정해도 됩니다.
주의할 점은 ref 키워드를 붙여야한다는 것이며 change_number 함수를 호출할 때 ref x를 전달하면 됩니다.
'C# > C#' 카테고리의 다른 글
C# : Lambda (Event Handler에 Lambda 식 적용) (0) | 2022.05.30 |
---|---|
C# : DrawImage (이미지 표시하기) (0) | 2022.05.30 |
C# : MouseMove (Mouse Event) (0) | 2022.05.30 |
C# : DrawRectangle, Pen (비어있는 사각형) (0) | 2022.05.30 |
C# : FillRectangle (채워진 사각형) (0) | 2022.05.30 |