함수
함수는 특정기능만 하는 조각과 같다. 그래서 한 번 만들어두고 그 기능을 사용하고 싶을 때,
다시 코드를 작성하는대신 함수를 호출해서 기능을 수행하게끔 하는 것이다.
반환형 이름 (매개변수)
{
return;
}
위 처럼 사용한다.
반환형에는 데이터타입을 사용할수도 있고, 반환하지 않으려면 void를 사용한다. 이 때는 return 을 작성하지 않는다.
int Add(int a,int b)
{
return a+b;
}
다음은 더하기 함수를 만든 것이다.
매개변수로 a와 b를 받아서 계산결과를 리턴한다.
main 함수
{
Add(1,2);
}
호출은 다음과 같이 하면된다. 그러면 3이라는 결과가 리턴되는데 이를 어디에 저장해도되고 출력해도 된다.
함수의 매개변수와 관련해서는 값에 의한 호출과 참조에 의한 호출이 있다.
위에서 보여준 것은 값에 의한 호출인데, 함수를 호출할 때 넘겨주는 매개변수로는 정의한 변수를 넘겨줄수도 있다.
그 때, 값에 의한 호출은 넘겨주는 변수의 값을 복사하여 넘겨주게 된다. 즉, 메인함수에서의 원본을 건드리지 않는다.
그러나 참조에 의한 호출은 그 변수의 주소를 넘겨서 호출된 함수쪽에서 그 원본에 직접 접근을 가능하게 한다.
(c,c++ 에서 포인터의 개념과 동일하다. )
참조에 의한 호출은 ref, out 키워드를 사용한다.
int Add(ref int a, ref int b)
{
a = 2; b = 3;
return 1;
}
void main()
{
int a=1,int b=2;
Add(ref a,ref b);
}
매개변수 앞에 ref 키워드를 붙이면 원본을 전달받기 때문에 함수가 실행된 후에 main에서 a와 b에 접근하면 값이 2와 3으로 변경이 돼있는 것을 확인할 수 있다.
ref 는 반드시 초기화된 변수를 넘겨줘야한다.
그렇다면 만약 두 수를 넘겨주고 그 몫과 나머지를 각각 다른 변수에 저장하는 동작을 한번에 하고 싶을때,
굳이 ref를 써서 몫과 나머지를 담을 변수에 초기화를 진행할 필요가 없다. 이 때, out 키워드를 사용한다.
void Add(int a, int b, out int c, out int d)
{
c = a/b;
d = a%b;
}
void main()
{
int a,b;
Add(2, 3,out a,out b);
}
다음 코드가 실행되면 a에는 몫이 b에는 나머지가 담겨있게 된다.
out 도 ref 와 마찬가지로 참조에 의한 호출이기 때문이며, out으로 넘겨주는 변수는 초기화를 할 필요가 없지만,
함수 내에서 반드시 초기화 해야한다. 그렇지 않다면 에러가 발생한다.
다음은 함수 오버로딩이다.
같은 이름을 사용하는 다른버전의 함수를 만드는 것을 의미한다.
예를들면,
int Add(int a,int b){}
float Add2(float a, float b){}
double Add3(double a, double b){}
위와 같이 Add 함수를 데이터타입에 따라 구분해서 사용할 순 있지만 데이터타입이 많아질수록 헷갈릴 뿐더러 너무 복잡해진다. 이를 Add 함수 하나로 사용가능하게 하는 것이 함수오버로딩 개념이다.
함수 오버로딩은 매개변수 타입, 매개변수 개수를 다르게하여 사용한다.
int Add(int a,int b){}
float Add(float a, float b){}
double Add(double a, double b){}
위처럼 사용하면 Add를 호출할 때 넘겨준 매개변수를 보고 컴파일러가 해당버전을 찾아서 호출하게 된다.