using System;
namespace Study2
{
class Program
{
static int Add(int a , int b)
{
return a + b;
}
static void Main(string[] args)
{
Console.WriteLine($"{Add(2,3)}");
}
}
}
C#의 함수 선언 방법은 다른 언어와 유사하다.
반환_자료형 함수명(매개변수){ /*본문*/ }
주의할 점은 Main함수가 static 함수이므로 호출하는 함수 또한 static 이어야 한다. 만약 static 함수를 사용하지 않는다면 다음과 같이 객체를 동적 생성 후에 사용해야 할 것이다.
using System;
namespace Study2
{
class Program
{
int Add(int a , int b)
{
return a + b;
}
static void Main(string[] args)
{
Program p = new Program();
Console.WriteLine($"{p.Add(2,3)}");
}
}
}
C#은 JAVA와 마찬가지로 Garbage Collecter가 존재하여 C++처럼 new 후, delete처리에 신경쓰지않아도 괜찮다.
using System;
namespace Study2
{
class Program
{
static void ChangeValue1(int val)
// 값 복사로 넘어온다.
{
val++;
}
static void ChangeValue2(ref int val)
// 참조로 넘어온다.
{
val++;
}
static void ChangeValue3(int input ,out int val)
// val은 참조로, input은 값 복사로 넘어온다.
{ // val은 out키워드로 인해 반드시 값 할당이 되어야 한다.
val = ++input;
}
static void Main(string[] args)
{
int value = 5;
Console.WriteLine($"now-value : {value}");
// 현재 값 출력
ChangeValue1(value);
Console.WriteLine($"now-value : {value}");
// ChangeValue1 함수에서 값 복사로 넘어간다.
ChangeValue2(ref value);
// 넘겨줄 때도 명시적으로 ref 키워드를 붙여줘야 한다.
Console.WriteLine($"now-value : {value}");
// ChangeValue2 함수에서 레퍼런스(참조)로 넘어간다.
ChangeValue3(value,out value);
// out 변수를 넘겨줄 때도 명시적으로 out 키워드를 붙여줘야 한다.
Console.WriteLine($"now-value : {value}");
// ChangeValue3 함수에서 레퍼런스(참조)로 넘어간다.
}
}
}
기본 자료형(int, short, ...)을 인자로 넘겨주게 될 경우 값을 복사해서 함수의 파라미터에 값이 넘어온다.
C++처럼 reference(&)를 사용하기 위해서는 ref키워드를 사용해야 한다.
함수의 파라미터와 함수 호출 할 때 인자에 ref 키워드를 둘다 붙여줘야 한다.
out 키워드의 경우 ref 키워드와 비슷하다. 하지만 다른점이 있다. 바로 out을 파라미터로 작성한 함수에서는 해당 변수를 반드시 값 대입을 해줘야 한다. 만약 값 대입을 하지 않을 경우에 에러가 발생한다. 즉, 좀 더 함수의 명확한 사용을 위해서 존재하는 키워드라고 볼 수 있다.
using System;
namespace Study3
{
class Program
{
static void strModify(string t)
{
t = "변형";
}
static void strModifyRef(ref string t)
{
t = "변형";
}
static void Main(string[] args)
{
string testSTR = "test";
strModify(testSTR);
// 주의 ! 레퍼런스로 안넘어가고 COPY로 넘어간다.
// 객체가 아닌 기본 자료형 처리로 하고있는 것 같다.
Console.WriteLine($"{testSTR}"); // 출력 : test
strModifyRef(ref testSTR);
Console.WriteLine($"{testSTR}"); // 출력 : 변형
testSTR.Trim();
}
}
}
또 주의할 점으로 C#에서 제공해주는 string 자료형이다.
C#에서 string은 기본 자료형으로서 본다.
후에 다시 설명하겠지만 C#에서는 Class의 객체를 Reference 방식을 통해 넘겨준다. (단, struct의 경우 Value-Copy를 통해서 넘긴다.)
C#에서 string을 기본 자료형으로 보기때문에 Reference로 보면 안된다!