메서드? |
C# 에서 메서드란 C 또는 C++에서 함수(Function)의 역할을 하는 것. |
메서드의 기본형태는
static void 메서드이름(매개변수) //매개변수의 또다른 이름은 파라미터
{
코드
}
입니다.
이러한 기본형태는 사실 우리가 흔히 쓰고있었 습니다.
바로 코드를 작성할 때 우리가 가장 기본적으로 사용하고 있는 main에서 인데요
static void Main(string[] args)
// └매개변수
{
}
이 메인 메서드는 컴퓨터가 프로그램을 실행하면 가장 먼저 찾아서 실행해주는 영역입니다.
그래서 메서드를 선언할 때 이 메인 메서드 영역 밖에서 메서드를 작성하고
그 메서드를 메인에 불러오는 형식으로 작성해주면 되는데요.
예를 들면
//예시 1
namespace ConsoleApp1
{
class Program
{
static void plus(int a, int b)
{
Console.WriteLine(a+b);
}
static void Main(string[] args)
{
int a = 10;
int b = 20;
plus(a, b);
}
}
}
의 형식인 것입니다. 코드를 보면 class 영역 내부 main영역 외부에 작성된 메서드를 보실 수 있는데요.
- 프로그램 시작
- main메서드 실행
- 변수 a , b 선언
- plus 메서드에 변수 a,b를 매개변수로 넣고 호출
- plus메서드 영역으로 이동
- 출력문 출력
- plus메서드 종료
- 메인 메서드 종료
이러한 순서로 진행되고 있는 것입니다.
메서드를 배우면서 저는 궁금증이 들었는데요 static? void? 이것은 무엇인가? 하는 것이었습니다.
이중 static 의 경우는
이중 void는 '리턴 타입'인데요
이는 메소드를 실행하고 난 이후의 값의 타입이 무엇인가에 따라서 다르게 작성해주어야 합니다.
void : 리턴값의 타입이 없음
int : 리턴값의 타입이 정수형
double : 리턴값의 타입이 실수형
String : 리턴값의 타입이 문자열
char : 리턴값의 타입이 문자
boolean : 리턴값의 타입이 bool
만일 리턴타입이 존재하게 작성을 한다면 우리는 반드시
내부에 return을 작성하여 그에 맞는 타입을 return해주어야합니다.(자동 형태변환)
//예시2
namespace ConsoleApp1
{
class Program
{
static int plus(int a, int b)
{
return a+b;
}
static void Main(string[] args)
{
int a = 10;
int b = 20;
int c = plus(a, b);
Console.WriteLine(c);
}
}
}
위 코드를 보면 예시1에서 사용했던 void가 아닌 int로 작성되어있는 것을 볼 수 있습니다.
위에 설명했던 것 처럼 int 타입으로 값을 리턴한다는 이야기 입니다.
이렇게 리턴타입이 있을경우 메인 함수에서는 그 리턴된 값을 받아줄 변수가 하나 필요하며
이 변수에 리턴된 값을 담아 출력된 것을 볼 수 있습니다.
위 예시1은 리턴값이 없어 메서드 기능에서 출력시킨 것
1-1. call by value (간접 참조) 1-2. call by reference (직접 참조) |
이 두개를 한번에 정리하는 이유는 하나는 직접 참조이고 하나는 간접 참조이므로 둘이 비교하며 보여드리면
조금 더 이해가 쉬울 것 이기 때문입니다.
namespace ConsoleApp1
{
class Program
{
static void Swap(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}// 두 변수의 값을 맞바꿔주는 swap 메서드
static void Main(string[] args)
{
int a = 10;
int b = 20;
Console.WriteLine($"Swap메서드 실행 전: a={a}, b={b}");
Swap(a, b);
Console.WriteLine($"Swap메서드 실행 후: a={a}, b={b}");
}
}
}
위 코드를 보시면 a는 10 , b는 20의 값을 담고 있습니다.
이를 출력문으로 확인해주고 swap메서드를 이용하여 두 변수에 담긴 값을 맞바꿔줍니다.
이 값이 잘 바뀌었는지 확인해보면
값이 바뀌지 않은 것을 볼 수 있습니다.
이는 call by value 즉 간접참조 형식을 사용했음을 할 수 있는데요.
이는 메서드에서 매개변수 값을 복사하여 내부적으로 처리한 것 입니다.
위 코드는 리턴값이 없는 void Swap(int a, int b) 메서드 인 것을 확인 할 수 있습니다.
매개변수를 받으면서 int a와 int b라는 공간을 만들고 내부 코드를 돌립니다. 하지만
메인 메서드 내부에서 값을 받아주지 않았으니까 Swap()메서드 영역이 종료되면서
복사된 a와 b의 공간이 같이 사라진 것 입니다.
그래서 메인으로 돌아왔을 때 a와 b값은 그대로인 것이죠.
이를 해결하고 싶을 때 우리는 call by reference(직접참조) 형식을 사용하면됩니다.
예시를 들어보겠습니다.
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
int a = 10;
int b = 20;
Console.WriteLine($"Swap메서드 실행 전: a={a}, b={b}");
Swap(ref a,ref b); //변경점 : ref
Console.WriteLine($"Swap메서드 실행 후: a={a}, b={b}");
}
static void Swap(ref int a,ref int b) //변경점 : ref
{
int temp;
temp = a;
a = b;
b = temp;
}
}
}
이렇게 ref(erence) 를 메서드 호출과 메서드 생성시 매개변수에 넣어주면서
메모리 주소값에 직접적으로 관여해 값을 바꾸는 형식으로 해결할 수 있습니다.
2. 메서드 오버로딩 (overloading) |
메서드 오버로딩은 메서드의 이름이 같을 때 매개변수의 타입과 갯수에 따라서 실행을 다르게 하는 시스템입니다.
method A(int a, int b)
{
return a+b;
}
method A(int a, int b, int c)
{
return a+b+c;
}
예시와 같이 같은 이름을 가진 두개의 메서드 A가 있습니다.
우리가 메인메서드에서 A메서드를 호출해줄 때 메서드 이름만 가지고 컴퓨터가 메서드영역을 불러온다면 [Ex) A(1,2)]
첫 A 메서드는 실행이 되어도 두번째 A메서드에서는 매개변수 부족으로 인한 오류가 나기 때문에
프로그램은 망가지게 됩니다.
이를 방지해 주는 것이 메서드 오버로딩입니다.
매개변수의 갯수 또는 타입을 구분하여 메인 메서드에서 A(1,2) 로 호출시 첫 A메서드만 호출 되는 것 입니다.
예시로 보자면
namespace ConsoleApp1
{
class Program
{
static int Plus(int a, int b)// 정수형 매개변수 두개
{
Console.Write("int 끼리 더합니다.");
return a + b;
}
static int Plus(int a, int b, int c)// 정수형 매개변수 세개
{
Console.Write("int 끼리 더합니다.");
return a + b + c;
}
static double Plus(double a, double b)// 실수형 매개변수 두개
{
Console.Write("double 끼리 더합니다.");
return a + b;
}
static void Main(string[] args)
{
Console.WriteLine(Plus(10, 20));//출력문(함수호출)
Console.WriteLine();
Console.WriteLine(Plus(10.5, 20.5));
Console.WriteLine();
Console.WriteLine(Plus(10, 20, 30));
Console.WriteLine();
}
}
}
셋 다 같은 Plus 라는 이름을 가진 메서드이지만 그 결과를 보면
이렇게 각 메서드가 잘 호출되어 나타난 것을 알 수 있습니다.
'C#' 카테고리의 다른 글
[C#_10_(1)] Class (0) | 2021.10.08 |
---|---|
[C#_9] 배열 (Array) (0) | 2021.10.07 |
[C#_7] 반복문 제어 (Break, Continue, goto) (0) | 2021.09.29 |
[C#_6] 반복문(for,foreach,while,do while) (0) | 2021.09.24 |
[C#_5] 조건문 (if, else, switch) (0) | 2021.09.23 |