먼지나는 블로그
ref와 out / 오버로딩 본문
ref와 out은 C#에서 인자를 전달할 때 사용하는 예약어다
메서드간의 참조형식으로 값을 사용하게 해준다.
ref는 자유롭게 사용이 가능하지만 out은 특정한 상황에서만 사용되는데
아래 예시코드를 통해 한번 알아보고자 한다.
1. ref
using System;
namespace CSharp
{
class Program
{
static void Swap(ref int a, ref int b)
{
int temp = a;
a = b;
b = temp;
}
//덧셈함수
static void AddOne(ref int number)
{
number = number + 1;
}
static int AddOne2(int number)
{
return number + 1;
}
static void Main(string[] args)
{
int num1 = 1;
int num2 = 2;
Program.Swap(ref num1, ref num2);
Console.WriteLine(num1);
Console.WriteLine(num2);
//Console.WriteLine("Hello World!");
}
}
}
ref는 변수를 반드시 초기화해야한다는 특징이 있다 또한 메서드 내에서 변형이 가능하다
인자로 넘긴 num1과 num2를 Swap메서드에서 a와 b로 받아 사용한다. 그저 값을 넘겨주는 것이 아닌
참조형식으로 이루어졌기 때문에 a와 b의 값이 바뀔 경우 num1과 num2의 값도 변하게 된다.
2. out
using System;
namespace CSharp
{
class Program
{
static void Divide(int a, int b, out int result1, out int result2)
{
result1 = a / b;
result2 = a % b;
}
static void Main(string[] args)
{
int num1 = 10;
int num2 = 3;
int result1;
int result2;
Divide(10, 3, out result1, out result2); //참조로 작업시 유의
Console.WriteLine(result1);
Console.WriteLine(result2);
}
}
}
반면 out은 따로 초기화가 필요하지 않지만 메서드 내에서 리턴할 때 반드시 값을 지정해줘야 한다.
인자를 받는 메서드에서는 사용하거나 변형할 수 없다.
3. 오버로딩
함수의 이름은 같으나 매개변수를 다르게 해 여러개로 재사용할 수 있게 만드는 것.
보통 다중정의, 중복함수로 불리거나 오버로딩이라고 불림 / 함수 이름의 재사용
using System;
namespace CSharp
{
class Program
{
static int Add(int a, int b)
{
return a + b;
}
static int Add(int a, int b, int c) // 반환형식은 오버로딩에 영향을 끼치지 않음
{
return a + b;
}
static float Add(float a, float b)
{
return a + b;
}
static void Main(string[] args)
{
int res = Program.Add(2, 3);
float res2 = Program.Add(2.0f, 3.0f);
Console.WriteLine(res);
Console.WriteLine(res2);
}
}
}
Stack Overflow?
using System;
namespace CSharp
{
class Program
{
static int Factorial(int n)
{
return n * Factorial(n - 1);
}
static void Main(string[] args)
{
int ret = Factorial(5);
Console.WriteLine(ret);
}
}
}
해당 코드를 돌리게 되면 아래와 같은 결과창이 뜨게 된다.
쉽게 말해 Factorial이라는 함수를 불러오는 과정에서 함수 내용 중 Factorial함수를 다시 불러오는 코드가
적혀있기 때문에 무한대로 호출하게 되는 문제가 발생하게 된다.
디버깅으로 확인해본 결과 factorial(1)을 호출하게 되면 return 1 * factorial(1-1); 즉 factorial(0)을 다시 호출하게 되고
말도 안되는 호출로 인해 n의 값에 쓰레기값만 들어가게 되고 무한대로 도는 모습을 볼 수 있다.
그로 인해 실행가능 호출 스택의 한도를 넘어가게 되면 Stack Overflow가 발생하게 되는 것이다.
using System;
namespace CSharp
{
class Program
{
static int Factorial(int n)
{
if (n <= 1)
return 1;
return n * Factorial(n - 1);
}
static void Main(string[] args)
{
int ret = Factorial(5);
Console.WriteLine(ret);
}
}
}
위와 같은 방법으로 해결할 수 있는데 이때 함수 내에서 자기 자신을 호출하는 함수를 재귀함수(재귀 메소드)라고 한다.