인자를 가지는 메소드
- 입력인자(Argument, parameter)매개변수
- 메소드 호출시 전달할 값이 있을 경우 인자를 통해 전달
return문
- 메소드의 연산결과를 반환하기 위해 사용
- 객체 or 변수변환가능
- 값 변환시 제어도 같이 이동(즉, return문 이후 코드는 접근 불가 코드)
- 리턴형이 void가 아닌경우를 제외하곤 반드시 return문을 가져야 한다.
- 리턴값은 단일값만 가능
- 반드시 데이터 타입이 같거나 암시적으로 형변환이 가능한 데이터 반환
인자사용
- 값으로 전달(Call by Balue) : 입력 전용인자
- 참조로 전달(Call by Reference) : 입출력 겸용 인자
- 출력 파라미터(Output parameter): 출력 전용인자
- 가변 인자 리스트
값으로 전달
- 메소드 호출시 변수의 값을 복사해서 메소드로 전달
- 메소드 내에서 인자값이 변경될수 있다.(Side Effect)가 없다.
- 메소드 안의 값은 밖에서 확인 불가능
- 인자값은 호환가능(암시적 형변환 가능)
참조에 의한 전달
- 값을 전달하는 것이 아니라 변수의 메모리 주소를 전달
- ref키워드 사용
- 인자의 데이터형이 일치해야 한다(암시적으로 형변환 불가능)
- 참조 전달시 반드시 변수값 초기화
public static void callrefTest()
{
int i = 3;
refTest(ref i);
Console.WriteLine("Main출력 : " + i);
}
public static void refTest(ref int i)
{
Console.WriteLine("Test출력"+i);
i =100;
Console.WriteLine(i);
}
출력파라미터
- 메소드 호출시 값을 넘겨줄 필요가 없을 경우
- 메커니즘은 ref와 유사
- ref처럼 변수를 초기화 시키지 않아도 된다.
- out키워드 사용
public static void callTest()
{
int i = 3;
int j = 10;
Console.WriteLine("{0}, {1}",i, j);
Test(out i, out j);
Console.WriteLine("{0}, {1}",i, j);
}
public static void Test(out int i, out int j)
{
//out으로 참조한 변수에는 값이 할당되지 않은상태이다.
//때문에 변수값이 한번이상 변경 되지 않는 상태에서 사용하려 하면 오류발생
i =100;
j =200;
Console.WriteLine("{0}, {1}",i, j);
}
인자사용 가이드 라인
- value > out > ref
- 값으로 인자를 전달하는 경우가 일반적
- 함수가 반환할 값이 하나일 경우 value
- 함수가 반환할 값이 둘 이상일 경우 ref, out
- 인자가 함수에 대한 입력과 출력 두가지 목적으로 사용될때 ref
가변길이 파라미터
- 여러 개의 파라미터를 전달 할 경우
- Call by Value 형식이다.
- 메소드명(params int[] x)
- 인자 앞에 params키워드를 붙여 주면 가변인자됨. 배열 처럼 사용.
- 가변인자와 일반인자를 같이 사용할 경우 : 예) 메소드명(string str, params int[] x)
-> 반드시 가변인자를 마지막에 명시
using System;
class Class1
{
public static int Method1(params int[] x)
{
int z=0;
for(int i = 0; i < x.Length; i++)
{
z += x[i];
}
return z;
}
public static void Main()
{
int y = Method1(10,15,20,35);
Console.WriteLine("y의 값은 {0}입니다.",y);
}
}
재귀메소드(Recursive Method)
- 자기자신을 호출하는 메소드
- 무한 루프 주의
public static void callMethod()
{
long factNumber = 0;
long number = 4;
factNumber = Factorial(number);
Console.WriteLine("{0}의 팩토리얼 값은 {1}입니다.", number, factNumber);
}
public static long Factorial(long number)
{
if(number>1)
return number*Factorial(number-1);
else
return 1;
}
메소드 오버로딩(Method Overloading)
- 한 클래스 내에서 같은 이름을 가지지만 다른 동작을 하는 메소드들
- Meshod Signature
- 다양한 종류의 파라미터를 갖는 동일한 이름의 메소드 선언 방식
- 파라미터 형식을 기반으로 내부적으로 별개의 메소드로 인식
- 실제 호출이 되는 메소드는 인자리스트에 의해서 결정(메소드 서명)
- 메소드 서명이 될수 있는 요소 : 메소드명, 인자의 타입, 인자의 갯수, out, ref, params키워드
- 메소드 서명이 될 수 없는 요소 : 인자의 이름, 리턴 타입
1. public static void WriteLine();
2. public static void WriteLine(int i);
3. public static void WriteLine(int j); // 2번과 동일한 메소드로 본다.
4. public static void WriteLine(int i, int j);
5. public static int WriteLine(int i); // 2번과 동일하게 본다.
6. public static void WriteLine(ref int i);
7. public static void WriteLine(out int i); //인자수가 같은경우 ref나 out는 둘중에 하나만 사용가능
8. public static void WriteLine(string i);
9. public static void WriteLine(out int i, int j); //ref나 out 둘다 사용시 인자수가 다르다면 가능
메소드 오버로딩 가이드 라인
- 서로 다른 인자 리스트를 가지는 비슷한 메소드를 정의할 경우(이름이 같다 -> 하는일이 비슷)
- 기존의 코드에 새로운 기능을 추가하는 경우
- 메소드 오버로딩의 되도록 자재 -> 디버깅, 유지보수 문제.
[출처] [펌] [20040428] 메소드|작성자 눈꽃천사