[C#] Lec 04 - 메서드
[C#] Lec 04 - 메서드
메소드
- 일련의 코드를 하나의 이름으로 묶은 것
- 메소드 호출 만으로 복잡한 코드를 단순히 활용할 수 있음.
1
2
3
4
5
6
7
8
9
class 클래스의_이름
{
한정자 반환_형식 메소드의_이름 (매개변수) //메소드에 입력하는 매개변수의 목록
{//한정자 : 메소드의 속성을 수식
실행_코드;
return 메소드의_결과;
//반환 형식과 메소드의 결과 형식이 같아야 함.
}
}
- 클래스 내부에 메소드가 선언되어야 함.
- 메소드의 선언에는 매개변수와 반환 형식이 필요하며, 메소드 호출 시 매개변수를 갑당 결과를 호출자에 반환하는 역할.
예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace Project
{
class Calculator
{
static public int Sum(int i, int j)
{
return i+j;
}
}
class Program
{
static void Main(string[] args)
{
int a=10, b=20;
int c= Calculator.Sum(a, b); //30 출력. Calculator 내부의 Sum 불러와야 하므로
//Calculator.Sum(i,j) 활용
//같은 namespace 내부에 있기 때문에 using 안해도 사용가능.
}
}
}
- Sum(i,j)에서 Sum(a, b)이므로 따로 int i=a, int j=b를 할당하여 복사하는 역할을 함(매개변수가 대입시 암묵적 시행)
- 매개변수는 값에 의한 전달(call by value)만을 시행하므로 전달된 변수와 호출에서 사용된 변수는 서로 별개의 변수로 관계가 없음.
- 매개 변수 부분의 변수 종류를 맞춰주어야 함. 혹은 명시적 변환
- 같은 class 내부의 경우 한정자에 private이 포함되어 있어도 사용가능.
- static 함수 내에서는 static 함수만 불러올 수 있음. (컴파일할 때 메모리 상에 함수가 업로드 되어야 하므로.)
- 매개 변수도 메소드 외부에서 내부로 데이터를 전달하는 매개체 역할을 할 뿐 근본적으로는 변수. 즉 한 변수를 다른 변수에 할당하면 변수가 담고 있는 데이터만 복사가 됨.
Return
- Return 문은 원래 점프문의 한 종류. 프로그램을 호출자에게로 즉시 돌려놓는 역할
- Return문은 method 어디에도 올 수 있으며, 그 즉시 method를 종결시키고 프로그램의 흐름을 호출자에게로 돌려줌
재귀문
1
2
3
4
5
6
7
8
9
10
11
12
13
static int Fibonacci(int a)
{
if (a<=2)
{
return 1;
}
else
return Fibonacci(n-1)+Fibonacci(n-2);
}
static void Main(string[] args)
{
Console.WriteLine(Fibonacci(10));//55 출력
}
Main 문의 매개변수
- Main문의 매개변수는 (string[] args)로 이를 사용하려면 args[0], args[1] 이런식으로 string 배열의 형태로 들어가게 됨.
Method - Call by reference
- 값에 의한 전달의 경우 Swap 같은 부분 전달할 수 없음. → 참조에 의한 전달(call by reference)를 이용하여 ref 키워드 활용필요
예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Calculator
{
public static void swap (ref int a, ref int b)
{ // Ref를 이용하기 때문에 int a = x, int b = y가 아닌
//ref int a = &x, ref int b = &y를 대입함.
int temp = a;
a = b;
b = temp;
}
}
class Program
{
static void Main(string[] args)
{
int x = 3, y = 4;
Calculator.swap(ref x, ref y);
Console.WriteLine($"X={x}, Y={y}");
}
}
- 이 때 메모리에서는 원래 x와 y에 대한 변수의 주소가 01, 02라고 한다면, a에는 &01이, b에는 &02가 지정되며 두 값을 바꾸는 순간 주소를 통해 해당 값을 바꾸게 됨.
예제 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Calculator
{
public static void Divide (int a, int b, ref int quotient, ref int remainder)
{
quotient = a/b;
remainder = a%b;
}
}
class Program
{
static void Main(string[] args)
{
int x = 3, y = 4;
int q = 0, r=0; //사실상 정의만 내려주면 됨, 값은 의미없음.
Calculator.Divide(x, y, ref q, ref r);
Console.WriteLine($"X={q}, Y={r}");
}
}
- 이렇게하면 ref를 통하여 변수를 출력할 수 있게 됨. 그러나 method의 정의에서 ref를 통한 출력값을 할당하지 않을 경우 런타임 오류를 발생시킬 수 있으므로 후술하는 out을 이용.
out 키워드를 활용한 call by reference
예제(앞선 몫, 나머지 method의 변형)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Calculator
{
public static void Divide (int a, int b, out int quotient, out int remainder)
{
quotient = a/b;
remainder = a%b; // if remainder가 method에서 정의되지 않을 경우
//오류를 출력하게됨. 왜냐하면 remainder는 출력전용 ref 변수이므로.
}
}
class Program
{
static void Main(string[] args)
{
int x = 3, y = 4;
int q = 0, r=0; //사실상 정의만 내려주면 됨, 값은 의미없음.
Calculator.Divide(x, y, out q, out r);
Console.WriteLine($"X={q}, Y={r}");
}
}
메소드 오버로딩
- 매개변수를 구분하여 같은 이름으로 여러 개의 메소드를 할당할 수 있음.
- 코드의 일관성 유지, 생산성 높이는 역할
예제
1
2
3
4
5
6
7
8
9
10
11
class Calculator
{
public static int Sum (int a, int b)
{
return a + b;
}
public static double Sum(double a, double b)
{
return a + b;
}
}
선택적 매개변수
- 선택적 매개변수는 매개변수에 default 값을 주는 방법으로 지정 가능. 이 때 항상 선택적 매개변수는 필수 매개변수 뒤에 와야 함.
- 칸을 건너뛰어 선택적 매개변수를 입력하고 싶은 경우 , optionalint : 4) 이런식으로 입력
예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Calculator
{
public static int Sum (int a, int b, int c=0, int d = 0)
{
return a + b + c + d;
}
}
class TestProject
public static void Main(string[] args)
{
int a = Calculator.Sum() //사용 불가능. (필수 매개변수 missing)
int b = CalCulator.Sum(1, 2) //사용가능
int c = Calculator.Sum(1, 2, 3, 4) //사용가능
int d = Calculator.Sum(1, 2, d:5) //사용가능.
}
}
This post is licensed under CC BY 4.0 by the author.