함수
프로그래밍을 하다 보면 같은 유형의 코드를 반복할 때가 많다. 이 코드들을 매번 입력하면 불편하고 입력하다 실수도 할 수 있습니다. 이때 ‘함수’를 사용합니다.
함수의 종류(내장 함수와 사용자 정의 함수)
- 내장함수
- 내장 함수는 C#이 자주 사용하는 기능을 미리 만들어서 제공하는 함수로, 특정 클래스의 함수로 표현됩니다.
- 문자열 관리 함수, 날짜 및 시간 관련 함수, 수학 관련 함수, 형식 변환 관련 함수 등으로 이러한 내장 함수를 API(Application Programming Interface)로 표현합니다.
- 사용자 정의 함수
- 프로그래머가 필요할 때마다 새롭게 기능을 추가하여 사용하는 함수
함수를 만들고 호출하여 사용하기
using System;
namespace Day7
{
class Day7
{
static void Show()
{
Console.WriteLine("Hello World");
}
static void Main()
{
Show();
}
}
}
💡 Result
Hello World
매개변수가 있는 함수
using System;
namespace Day7
{
class Day7
{
static void ShowMessage(string message) // 매개변수가 있는 함수
{
Console.WriteLine(message); //넘어온 매개변수 값을 출력
}
static void Main()
{
ShowMessage("매개변수"); //ShowMessage() 함수에 "매개변수" 문자열 전달
ShowMessage("Parameter"); //ShowMessage() 함수에 "Parameter" 문자열 전달
}
}
}
💡 Result
매개변수
Parameter
반환값이 있는 함수
함수의 여러 가지 특징 중 하나인 반환값(return value)은 함수에서 어떤 처리를 진행한 후 그 결과를 다시 함수를 호출한 부분으로 되돌려 주는 것을 의미합니다.
using System;
namespace Day7
{
class Day7
{
static string GetString()
{
return "반환값 드릴게요"; // return으로 단순 문자열 반환
}
static void Main()
{
String ReturnValue = GetString(); // 함수 호출 / 반환값을 ReturnValue 값에 저장
Console.WriteLine(ReturnValue);
}
}
}
💡 Result
반환값 드릴게요
정수형 반환값이 있는 함수 만들고 사용
using System;
namespace Day7
{
class Day7
{
static int Calculation(int x, int y) //입력 매개변수
{
int i = x * y;
return i; //반환값
}
static void Main()
{
int result = Calculation(2, 4); // result = 2 * 4
Console.WriteLine(result);
}
}
}
💡 Result
8
응용
//FunctionValue.cs
using System;
namespace N_FunctionValue
{
internal class FunctionValue
{
static int Result(int x, int y) //Result에서 3, 5 전달 받음
{
int i = x * y;
return i; //반환값
}
public void Calculation(int a, int b) // 3, 5 각각 입력 받음
{
int result = Calculation(a, b);
Console.WriteLine(result);
}
}
}
//Day7_Main.cs << 실행 cs 파일
using System;
using N_FunctionValue;
namespace Day7
{
class Day7
{
static void Main(string[] args)
{
FunctionValue functionValue = new FunctionValue();
functionValue.Result(3, 5);
}
}
}
💡 Result
15
함수를 사용하여 큰 값과 작은 값, 절댓값 구하기
//Day7_Main.cs << 실행 cs 파일
using System;
using N_FunctionValue;
using N_MaxMin;
namespace Day7
{
class Day7
{
static void Main(string[] args)
{
MaxMin maxMin = new MaxMin();
Console.WriteLine("최댓값은 : " + maxMin.Max(55, 80));
Console.WriteLine("최솟값은 : " + maxMin.Min(75, 50));
}
}
}
using System;
namespace N_MaxMin
{
internal class MaxMin
{
public int Max(int x, int y)
{
return x > y ? x : y; //3항 연산자
}
public int Min(int x, int y)
{
if (x < y)
{
return x;
} else
{
return y;
}
}
}
}
💡 Result
최댓값은 : 80
최솟값은 : 50
기본 매개변수
매서드를 선언할 때 매개변수를 선언과 동시에 초기화해 놓으면, 매서드를 호출할 때 매개변수를 지정하지 않아도 기본값으로 자동 설정합니다. 이 기능을 기본 매개변수(default parameter) 또는 선택적 인수(optional argument) 라고 합니다.
//DefaultParameter.cs
using System;
namespace N_DefaultParameter
{
internal class DefaultParameter
{
public void DefaultParameterEx(string name, int age = 27)
//age 매개변수 선언과 동시에 초기화
{
Console.WriteLine($"나의 이름은 {name}이며, 나이는 {age}살 입니다.");
}
}
}
using System;
using N_FunctionValue;
using N_MaxMin;
using N_DefaultParameter;
namespace Day7
{
class Day7
{
static void Main(string[] args)
{
DefaultParameter defaultParameter = new DefaultParameter();
defaultParameter.DefaultParameterEx("이정원", 50);
//할당된 값 출력
defaultParameter.DefaultParameterEx("이정원");
//입력하지 않아도 초기화 되어 있는 값 출력
}
}
}
💡 Result
나의 이름은 이정원이며, 나이는 50살 입니다.
나의 이름은 이정원이며, 나이는 27살 입니다.
명명된 매개변수
using System;
using N_FunctionValue;
using N_MaxMin;
using N_DefaultParameter;
namespace Day7
{
class Day7
{
static void Main(string[] args)
{
DefaultParameter defaultParameter = new DefaultParameter();
defaultParameter.DefaultParameterEx("이정원", 50); //할당된 값 출력
defaultParameter.DefaultParameterEx("이정원"); //입력하지 않아도 초기화 되어 있는 값 출력
Console.WriteLine();
defaultParameter.DefaultParameterEx(age : 111, name : "가든가든");
//명명된 매개변수
}
}
}
💡 Result
나의 이름은 이정원이며, 나이는 50살 입니다.
나의 이름은 이정원이며, 나이는 27살 입니다.
나의 이름은 가든가든이며, 나이는 111살 입니다.
매개변수 이름을 지정하면 변수 위치 변경도 가능합니다!
함수 오버로드 : 다중 정의
클래스 하나에 매개변수를 달리해서 이름이 동일한 함수 여러 개를 정의할 수 있는데, 이를 함수 오버로드라고 합니다. 우리말로는 함수 ‘다중 정의’, 즉 여러 번 정의한다는 의미입니다.
using System;
namespace N_MethodOverload
{
internal class MethodOverload
{
public void MethodOverloadEx(int age)
{
Console.WriteLine("함수는 같지만 매개변수 타입은 (int)" + age);
}
public void MethodOverloadEx(long age)
{
Console.WriteLine("함수는 같지만 매개변수 타입은 (long)" + age);
}
}
}
using System;
using N_FunctionValue;
using N_MaxMin;
using N_DefaultParameter;
using N_MethodOverload;
namespace Day7
{
class Day7
{
static void Main(string[] args)
{
MethodOverload methodOverload = new MethodOverload();
methodOverload.MethodOverloadEx(27);
methodOverload.MethodOverloadEx(27L);
}
}
}
💡 Result
함수는 같지만 매개변수 타입은 (int)27
함수는 같지만 매개변수 타입은 (long)27
매개변수가 없거나 있는 함수 오버로드
using System;
namespace N_MethodOverload
{
internal class MethodOverload
{
//매개변수가 없거나 있는 함수 오버로드
public void hello()
{
Console.WriteLine("넌 이름이 없구나");
}
public void hello(string name)
{
Console.WriteLine($"너의 이름은 {name}이구나");
}
public void hello(string name, int age)
{
Console.WriteLine($"너의 이름은 {name}이고, 나이는 {age}살 이구나!");
}
}
}
using System;
using N_FunctionValue;
using N_MaxMin;
using N_DefaultParameter;
using N_MethodOverload;
namespace Day7
{
class Day7
{
static void Main(string[] args)
{
MethodOverload methodOverload = new MethodOverload();
methodOverload.hello("이정원");
methodOverload.hello();
methodOverload.hello("가든", 27);
}
}
}
💡 Result
너의 이름은 이정원이구나
넌 이름이 없구나
너의 이름은 가든이고, 나이는 27살 이구나!
재귀 함수
함수에서 함수 자신을 호출하는 것을 재귀(recursion) 또는 재귀 함수라고 합니다.
팩토리얼 구하기 예제
using System;
namespace N_Recursion
{
internal class Recursion
{
public void RecursionMain()
{
Console.WriteLine(4 * 3 * 2 * 1);
Console.WriteLine(FactorialEx1(4));
Console.WriteLine(FactorialEx2(4));
Console.WriteLine(FactorialEx3(4));
}
//재귀 함수를 활용한 3항 연산자 사용
static int FactorialEx1(int n)
{
return (n > 1) ? n * FactorialEx1(n - 1) : 1;
}
//재귀 함수를 활용한 트리 구조 사용 (재귀 함수는 트리구조에 유리함)
static int FactorialEx2(int n)
{
if (n == 1 || n == 0)
{
return 1;
}
return n * FactorialEx2(n - 1);
}
//단순한 팩토리얼 방식에 유용
static int FactorialEx3(int n)
{
int result = 1;
for (int i = 1; i <= n; i++)
{
result *= i;
}
return result;
}
}
}
함수 범위 : 전역 변수와 지역 변수
클래스와 같은 레벨에서 선언된 변수를 **전역 변수(global variable) 또는 필드(field)**라고 하며, 함수 레벨에서 선언된 변수를 **지역 변수(local variable)**이라고 합니다.
이때 동일한 이름으로 변수를 전역변수와 함수 내의 지역변수로 선언할 수 있습니다.
using System;
namespace N_FunctionScope;
internal class FunctionScope
{
static string message = "전역변수 메세지"; //클래스 레벨
static void showmessage()
{
string message = "지역변수 메세지"; //함수 레벨 (함수 안에서 선언시 지역변수)
Console.WriteLine(message); //지역 변수 출력
}
public void FunctionScopeMain()
{
showmessage(); //지역 변수 출력
Console.WriteLine(message); //전역 변수 출력
}
}
using System;
using N_FunctionScope;
namespace Day7
{
class Day7
{
static void Main(string[] args)
{
FunctionScope functionScope = new FunctionScope();
functionScope.FunctionScopeMain();
}
}
}
화살표 함수 : =>
화살표 모양의 연산자인 화살표 연산자(=>)를 사용하여 메서드 코드를 줄일 수 있습니다. 이를 화살표 함수(arrow function)라고 합니다.
화살표 함수 사용하기
using System;
namespace N_ArrowFunction
{
internal class ArrowFunction
{
public void ArrowMain()
{
Hi();
Multiply(13, 14);
Console.WriteLine(YesOrNo(1, 2));
InputParameter("hello~");
}
static void Hi() => Console.WriteLine("안녕하세요");
static void Multiply(int a, int b) => Console.WriteLine(a + b);
static bool YesOrNo(int A, int B) => A == B;
static void InputParameter(string message) => Console.WriteLine(message);
}
}
using System;
using N_ArrowFunction;
namespace Day7
{
class Day7
{
static void Main(string[] args)
{
ArrowFunction arrowFunction = new ArrowFunction();
arrowFunction.ArrowMain();
}
}
}
💡 Result
안녕하세요
27
False
hello~
로컬 함수
C# 7.0 버전부터는 로컬 함수(local function) 기능을 제공합니다. 로컬 함수는 함수 내에서만 사용하는 또 다른 함수를 만드는 것입니다. 특정 함수 내에서만 사용하는 또 다른 함수를 로컬 함수라고 합니다.
Demo 예제
using System;
namespace N_LocalFunction
{
internal class LocalFunction
{
internal void LocalMain()
{
Hello();
}
void Hello()
{
Console.WriteLine("Hello");
}
}
}
using System;
using N_LocalFunction;
namespace Day7
{
class Day7
{
static void Main(string[] args)
{
LocalFunction localFunction = new LocalFunction();
localFunction.LocalMain();
}
}
}
💡 Result
Hello
로컬 함수에 화살표 연산자 사용하기
using System;
namespace N_LocalFunction
{
internal class LocalFunction
{
internal void LocalMain()
{
Hello();
int AddResult = Add(10, 20);
decimal SubtractResult = Subtract(2.22M, 1.11M);
Console.WriteLine(AddResult);
Console.WriteLine(SubtractResult);
}
void Hello()
{
Console.WriteLine("Hello");
}
int Add(int a, int b) => a + b;
decimal Subtract(decimal x, decimal y) => x - y;
}
}
💡 Result
Hello 30
1.11
'C# > Basic Syntax' 카테고리의 다른 글
[C#] 10. 구조체 사용하기 (0) | 2022.10.22 |
---|---|
[C#] 09. 닷넷 API 사용하기 (0) | 2022.10.22 |
[C#] 7. 배열 (1) | 2022.09.22 |
[C#] 6. 제어문 if/else, switch, for, while, foreach 등 (0) | 2022.09.20 |
[C#] 5. 연산자 (0) | 2022.09.19 |