메소드 (Method)
- 일련의 코드를 하나의 이름 아래 묶는 것
- 묶은 코드는 메소드의 이름을 불러주는 것만으로 실행
- C/C++에서는 함수(Function), 파스칼에서는 프로시져(Procedure) 등으로 부름
메소드 선언
- 클래스 내부에 선언
- 메소드 선언 필수 요소
- 반환 형식 (==출력)
- 메소드 이름
- 매개변수 목록 (==입력)
- 결과를 반환할 때 return 문 사용
: 메소드가 선언되기 전 위치로 실행흐름 이동
class 클래스의_이름
{
한정자 반환_형식 메소드의_이름 ( 매개_변수_목록 )
{
// 실행하고자 하는 코드1
// 실행하고자 하는 코드2
// ...
// 실행하고자 하는 코드n
return 메소드의_결과;
}
}
메소드 선언 EX)
class Calculator
{
public static int Plus( int a, int b )
{
Console.WriteLine("Input : {0}, {1}", a, b);
int result = a + b;
return result;
}
}
메소드 호출 EX)
int x = Calculator.Plus(3,4); //x는 7
int y = Calculator.Plus(5,6); //y는 11
int z = Calculator.Plus(7,8); //z는 15
- 3,4 ➡ 메소드의 입장에서는 매개변수 (Parameter)
➡ 메소드를 호출하는 입장에서는 인수 (Argument)
return
- 호출자에게 결과를 반환
- 프로그램의 제어를 즉시 호출자에게 이동시킴
* 메소드 중간에 호출하는 경우 메소드에 실행되지 않은 코드가 생길 수 있음 - 반환형식과 일치하는 데이터를 반환해야 함
- 메소드가 void 형식인 경우 반환값 없이 사용 가능
void PrintProfile(string name, string phone)
{
if(name == "")
{
Console.WriteLine("이름을 입력해주세요.");
return;
}
Console.WriteLine("Name:{0}, Phone:{1}", name, phone);
}
Pass by reference
- 매개변수가 인수를 참조
- ref 키워드를 이용하여 선언 / 호출
- ref 키워드 : 인수의 값이 수정되지 않아도 컴파일러가 에러를 출력하지 않음
Pass by value EX)
public static void Swap(int a, int b)
{
int temp = b;
b = a;
a = temp;
}
static void Main(String[] args)
{
int x = 3;
int y = 4;
Swap(x, y);
}
- 값이 복사되어 전달됨
- x와 y에는 영향이 없음
Pass by reference EX)
public static void Swap( ref int a, ref int b)
{
int temp = b;
b = a;
a = temp;
}
static void Main(String[] args)
{
int x = 3;
int y = 4;
Swap( ref x, ref y);
}
- 호출할 때도 ref 키워드를 이용하여 호출
- a와 b가 x, y를 직접 참조하게 됨
출력 전용 매개변수
- 메소드는 out 키워드로 한정한 매개변수에 결과를 입력해야 함
- out 키워드 : 인수의 값이 수정되지 않으면 컴파일러가 에러를 출력하지 않음
- return 값은 하나의 값만 반환하지만 출력전용 매개변수를 사용하면 복수 개를 반환할 수 있음
void Divide(int a, intb, out int quotient, out int remainder)
{
quotient = a / b;
remainder = a % b;
}
int a=20;
int b=3;
int c;
int d;
Divide(a,b,out c, out d);
Console.WriteLine("Quotient : {0}, Remainder {1}", c, d);
메소드 오버로딩
- 하나의 메소드 이름에 여러 버전의 구현을 올리는 것
- 로직이 동일한데, 데이터의 형식만 다를 때 사용
- Overloading : 과적하다
//[1]
int Plus(int a, int b)
{
return a+b;
}
//[2]
double Plus(double a, double b)
{
return a+b;
}
int result1 = Plus( 1,2 ); //[1] 호출
double result2 = Plus( 3.1, 2.4 ); //[2] 호출
가변길이 인수
- 개수를 유연하게 조절할 수 있는 인수
- params 키워드와 배열을 이용하여 선언
- 데이터 형식이 같다면 가변길이 인수를 통해 오버로딩 대신 사용
// [ 선 언 ]
int Sum(params int[] args)
{
int sum = 0;
for(int i=0; i<args.Length; i++)
{
sum += args[i];
}
return sum;
}
// [ 호 출 ]
int total = 0;
total = Sum(1,2);
total = Sum(1,2,3);
total = Sum(1,2,3,4,5,6,7,8,9,10);
명명된 인수
- Named Argument
- 메소드 호출시 매개 변수의 이름을 명시하여 매개변수에 데이터를 바인드 하는 기능
static void PrintProfile(string name, string phone)
{
Console.WriteLine("Name:{0}, Phone:{1}", name, phone);
}
static void Main(string[] args)
{
PrintProfile(name:"박찬호", phone:"010-123-1234");
}
선택적 인수
- 메소드 선언시 매개 변수에 기본 값을 할당
- 호출자가 인수를 입력하지 않는 경우 메소드는 기본값이 할당된 매개변수 사용
- 호출자는 해당 매개 변수에 대한 인수 입력 여부 선택이 가능해짐
// [ 선 언 ]
void MyMethod(int a=0, int b=0)
{
Console.WriteLine("{0}, {1}", a, b);
}
// [ 호 출 ]
MyMethod(3); //매개변수 b 생략
MyMethod(3,4);