상세 컨텐츠

본문 제목

[C#] 메서드

.NET/C#

by 클리엘 클리엘 2021. 1. 22. 11:50

본문

728x90

1. 기본형식

 

C/C++에서 말하는 함수와 비슷한 개념입니다. 클래스 안에 소속되며 객체지향에서 객체의 동작(행동)을 처리하는 부분에 속합니다.

class HelloWorld
{
	static void Main(string[] args)
	{
		int i = 10;
		int j = 20;

		int s = Plus(i, j);

		Console.WriteLine($"Result : {s}");
	}

	static int Plus(int i, int j)
	{
		int s = i + j;

		return s;
	}
}

예제에서 새롭게 작성된 Plus메서드는 2개의 int형 매개변수를 받아 덧셈을 수행한 뒤 그 결과를 int형으로 반환하도록 합니다.

 

메서드가 int형을 반환한다는 것은 'int Plus'에서 int라고 명시했기 때문이며 끝에서 return을 통해 처리 후의 실제 데이터를 반환하고 있습니다. 이 부분이 string Plus가 되면 string형식을 반환하는 것이고 double Plus가 되면 double형식의 데이터를 반환한다는 것을 의미합니다. 만약 메서드가 아무런 값도 반환하지 않으면 Main메서드처럼 void를 사용하면 됩니다.

static void Main(string[] args)
{
	int i = 10;
	int j = 20;

	Plus(i, j);
}

static void Plus(int i, int j)
{
	int s = i + j;

	Console.WriteLine($"Result : {s}");
}

메서드가 void라도 return을 사용할 수 있습니다. 다만 이때는 어떤 값을 반환하는것이 아니라 처리를 중단하는 역할을 수행하기 때문에 아래 에제는 'Result : End'를 출력할 수 없습니다.

static void Plus(int i, int j)
{
	int s = i + j;

	Console.WriteLine($"Result : {s}");

	return;

	Console.WriteLine("Result : End");
}

메서드는 필요하지 않다면 매개변수를 생략할 수 있으며

static int Plus()
{
	int s = 10 + 20;

	return s;
}

필요하다면 원하는 만큼의 매개변수를 만들 수 있습니다.


2. 참조형식의 매개변수 / 참조 형식의 값 반환

 

매개변수는 일반적으로 메서드를 호출하는 쪽에서 값을 전달하면 해당 값을 매개변수에 복사하여 처리하게 됩니다. 그러나 만약 메서드를 호출하는 쪽과 호출되는 메서드에서 같은 값을 공유해 사용하는 경우라면 ref를 사용하여 참조에 의한 전달을 수행할 수 있습니다.

static void Main(string[] args)
{
	int i = 10;
	int j = 20;

	int s = Plus(i, ref j);

	Console.WriteLine($"Main : {j}");
}

static int Plus(int i, ref int j)
{
	j = 10;

	int s = i + j;

	Console.WriteLine($"Plus : {j}");

	return s;
}

Plus메서드에서 j매개변수에 ref를 적용하였고 Main에서 Plus를 호출할 때 j 쪽에 ref를 사용해 메서드를 호출하였습니다. 이렇게 되면 값의 전달이 아닌 해당 값을 저장하고 있는 메모리 주소를 전달하기 때문에 Plus에서 변수의 값을 변경하면 호출하는 쪽의 변수값도 같이 바뀌게 됩니다. 2개의 변수가 하나의 메모리주소를 '참조'하고 있기 때문입니다.

 

매개변수를 참조 형식으로 전달하는 것뿐만이 아니라 필요한 경우 메서드에서 반환하는 값을 참조로 받을 수도 있습니다.

class HelloWorld
{
	static void Main(string[] args)
	{
		int i = 10;
		int j = 20;

		Calc c = new Calc();
		c.Sum(i, j);

		ref int s = ref c.GetResult();

		Console.WriteLine($"Main : {s}");

		s = 100;

		Console.WriteLine($"Main : {s}");
		Console.WriteLine($"Calc : {c.GetResult()}");
	}
}

class Calc
{
	private int s = 0;

	public ref int GetResult()
	{
		return ref s;
	}

	public void Sum(int i, int j)
	{
		s = i + j;
	}
}

우선 Calc클래스에서는 Sum메서드를 통해 덧셈을 수행하고 그 결과를 내부 필드 변수인 s에 담도록 하고 있습니다. 그리고 GetResult() 메서드에서 return에 ref를 붙이고 반환되는 데이터 형식에도 ref를 붙여 변수의 값을 참조로 반환하도록 하고 있습니다.

 

Main에서는 Calc클래스의 인스턴스를 생성하고 Sum메서드를 호출해 덧셈을 수행합니다. 그런 뒤 GetResult() 메서드를 호출해 현재 Calc에서의 s결과 변숫값을 가져오도록 하고 있습니다.

 

이때, Main에서 결과를 받은 s변수와 호출할 메서드에 ref를 붙여 이 값을 참조 형식으로 가져오도록 하고 있는데 이때 Main에서의 s와 Calc에서의 s는 값을 저장하고 있는 같은 메모리 주소 값을 가지고 있으므로 Main안에서 s변수를 수정하게 되면 Calc의 s변수도 같이 값이 바뀌게 됩니다.

 


3. out 매개변수

 

어떤 경우 매개변수는 단순히 값을 전달하는 목적이 아니라 특정 값을 받기 위한 목적으로도 사용될 수 있습니다. 그리고 이러한 목적으로 메서드를 호출한다면 매개변수에 out키워드를 사용해야 합니다.

static void Main(string[] args)
{
	int i = 20;
	int j = 10;

	int m;

	int s = Sum(i, j, out m);

	Console.WriteLine($"s : {s}");
	Console.WriteLine($"m : {m}");
}

static int Sum(int i, int j, out int m)
{
	m = i - j;

	return (i + j);
}

예제에서 사용된 Sum메서드는 2개의 수를 합해 그 결과를 반환하는 메서드입니다. 좀 억지스럽지만 이 메서드에서 i와 j 2개의 매개변수의 감산 결과를 얻기위해 m이름의 out매개변수를 추가했고 Sum메서드안에서 m변수에 감산결과를 저장하고 있습니다.

 

이렇게 하면 Main에서는 이 메서드를 호출한 뒤 메서드 수행 결과를 받아옴과 동시에 처음 메서드를 호출할 때 지정했던 m변수를 통해 또 다른 게산 결과를 확인할 수 있게 됩니다.

 

Main에서는 Sum메서드의 m변수 활용을 위해 지역변수 m을 따로 선언한 뒤 메서드 호출에 사용했는데 지역변수를 따로 선언하지 않고 메서드 호출 시 곧바로 변수를 선언하는 것도 가능합니다.

static void Main(string[] args)
{
	int i = 20;
	int j = 10;

	int s = Sum(i, j, out int m);

	Console.WriteLine($"s : {s}");
	Console.WriteLine($"m : {m}");
}

4. params 매개변수

 

메서드에서 전달받을 매개변수의 개수를 특정할 수 없는 경우 매개변수 자체를 배열로 선언해 놓고 params을 붙이면 메서드를 호출할 때 유동적으로 매개변수를 지정할 수 있습니다.

static void Main(string[] args)
{
	int i = 20;
	int j = 10;

	int s = Sum(i, j);

	Console.WriteLine($"Result : {s}");
}

static int Sum(params int[] args)
{
	return args.Sum();
}

예제에서 Sum메서드를 호출할 때 매개변수의 값을 지정하여 Sum에서 선언된 args매개변수의 int형 배열에 들어가도록 하였고, Sum메서드 안에서는 해당 배열의 합게를 반환하도록 하고 있습니다. (배열에 Sum() 메서드를 사용하려면 System.Linq 네임스페이스가 선언되어야 합니다.)

 

params를 제거해도 Sum메서드 내부는 동일하게 처리할 수 있으나 메서드를 호출하는 입장에서는 Sum(i, j, 10, 20...) 등과 같이 매개변수를 지정할 수 없고 매개변수 자체를 배열로 전달해야 한다는 차이가 있습니다.


5. 명명된 매개변수

 

메서드의 매개변수를 호출할때 매개변수의 순서와는 상관없이 매개변수명을 통해서 값을 직접 할당할 수 있습니다.

static void Main(string[] args)
{
	int i = 20;
	int j = 10;

	int s = Sum(j : i, i : j);

	Console.WriteLine($"Result : {s}");
}

static int Sum(int i, int j)
{
	return (i + j);
}

 

할당방법은 '매개변수명 : 값'형식이며 명명된 매개변수를 사용하게 되면 전체 모든 매개변수를 대상으로 해야 하며 아래에서 설명할 '선택적 매개변수'를 제외하고 일부 매개변수를 생략하는 것은 불가능합니다.

 

6. 선택적 매개변수

 

메서드는 특정 매개변수에 대해서 기본값을 설정할 수 있습니다.

static void Main(string[] args)
{
	//int i = 20;
	int j = 10;

	int s = Sum(i : j);

	Console.WriteLine($"Result : {s}");
}

static int Sum(int i, int j = 100)
{
	return (i + j);
}

기본값이 설정된 매개변수는 메서드 호출 시 해당 매개변수를 생략할 수 있으며 생략되면 기본값으로 지정된 값이 사용됩니다. 또한 선택적 매개변수로 사용되는 매개변수는 항상 기본값을 가지지 않는 매개변수 뒤에 와야 합니다.


7. 오버 로딩

 

여러 메서드를 하나의 이름으로 묶어 마치 하나의 메서드가 존재하는 것처럼 사용하는 방식을 말합니다.

static void Main(string[] args)
{
	int i = 20;
	int j = 10;

	int s = Sum(i, j);

	Console.WriteLine($"Result : {s}");
}

static int Sum(int i, int j)
{
	return (i + j);
}

static int Sum(float i, float j)
{
	return (int)(i + j);
}

static int Sum(int i, int j, int x)
{
	return (int)(i + j + x);
}

같은 이름의 Sum이라는 메서드가 여러 개 존재하지만 메서드를 호출할 때 매개변수의 데이터형, 또는 매개변수의 개수에 따라서 다른 메서드를 호출하게 됩니다.


8. 로컬 함수

 

메서드 안에서 사용되는 또 다른 메서드를 의미합니다.

static void Main(string[] args)
{
	int i = 20;
	int j = 10;

	int s = Sum(i, j);

	Console.WriteLine($"Result : {s}");

	int Sum(int i, int j)
	{
		return (i + j);
	}
}

예제에서는 Main메서드 안에서 Sum이라는 메서드를 구현하고 있는데 이런 경우에는 Main메서드 밖에서는 Sum메서드를 사용할 수 없습니다. 메서드 내부에서 단독으로 특정 처리를 위한 기능이 일시적으로 필요할 때 사용됩니다.

728x90

'.NET > C#' 카테고리의 다른 글

[C#] 클래스  (0) 2021.01.26
[C#] 구조체와 튜플  (0) 2021.01.25
[C#] 메서드  (0) 2021.01.22
[C#] 제어문  (0) 2021.01.21
[C#] 연산자  (0) 2021.01.19
[C#] 문자열 및 문자열출력 다루기  (0) 2021.01.18

관련글 더보기

댓글 영역