함수는 언제쯤 듣기 시작하냐면, 우리나라에서는 초등학교에서 기본적인 개념은 배우고 중학교 1~2년 시점에 함수를 본격적으로 배우기 시작합니다. 이렇게 함수를 인식하고 코딩을 처음 접했을 때의 함수의 의미는 같으면서 목적은 조금 다릅니다.
수학에서의 정의는 하나의 입력값에 대해 하나의 출력값을 만드는 관계 이다. 목적은 수학적 관계나 규칙 표현을 위해서이다.
그럼 프로그래밍에서의 함수의 정의는 어떤 기능(행동)을 수행하는 코드의 묶음이다. 목적은 재사용성, 유지보수, 가독성 향상을 위해서이다.
입력 > 출력
입력 > 작업 > 결과/없음
이번에 포스팅할 것은 함수이다. 이 포스팅을 진행하면서 이전에 포스팅했던 글들의 기능들을 하나하나 함수로 구현을 하면 함수의 목적인 재사용성과 유지보수, 가독성 향상을 목표로 작성해보겠다.
함수는 기본적으로 접근 범위, 반환 자료형, 함수의 이름, 외부 값을 받을 수 있게하는 매개 변수로 이루어져 있다.
아래에 코드로 보겠다.
접근범위 반환형 함수이름(매개변수1, 매개변수2)
{
함수 내용
}
간단한 변경
🔽🔽🔽🔽
public int Add(int num1, int num2)
{
int result = num1 + num2;
return result;
}
프로그래밍에서는 이미 만들어진 여러가지의 함수들이 정의가 되어있다.
일반적인 일반함수, 자기 자신을 부르는 함수인 재귀함수, 람다식을 사용한 익명함수 등등의 함수의 형태가 있다. 각각 프로그래밍을 하다가 상황에 맞는 함수를 사용한다.
그럼 아래의 표로 어떤 종류의 함수가 있는지 정리하겠다.
| 형태 | 반환값 | 매개변수 | 설명 및 특징 | 예시 코드 (간단 표현) |
|---|---|---|---|---|
| 기본 함수 (일반) | ❌ | ❌ | 가장 단순한 형태 | void Hello() { ... } |
| 기본 함수 (입력 있음) | ❌ | ✅ | 입력만 받고 결과 없음 | void Print(string s) |
| 기본 함수 (출력 있음) | ✅ | ❌ | 입력 없이 결과만 반환 | int GetCount() => 5; |
| 일반 함수 (입출력 있음) | ✅ | ✅ | 가장 일반적인 형태 | int Add(int a, int b) |
| 재귀 함수 | ✅ | ✅ | 자기 자신을 호출하는 함수 | int Fact(int n) => n == 1 ? 1 : n * Fact(n-1); |
| 익명 함수 (delegate) | ✅/❌ | ✅/❌ | 이름이 없는 함수, delegate로 선언 | delegate(int x) { return x * x; } |
| 람다식 | ✅/❌ | ✅/❌ | 화살표(=>)를 이용한 간결한 표현식 함수 | (x, y) => x + y |
이렇게 많은 형태의 함수들이 존재한다. 알맞게 적재적소에 사용하는게 프로그래머의 영량일 것이다.
using System;
namespace Study
{
class Program
{
static void Main(string[] args)
{
Hello();
Hello();
}
static void Hello()
{
Console.WriteLine("Hello");
Console.WriteLine("World!");
Console.WriteLine("");
}
}
}
Hello
World!
Hello
World!
이와 같이 출력 함수가 3개를 하나의 Hello() 라는 함수로 묶어서 사용하여, 코드가 간결하면서 알기도 쉬워졌다.
더 이어서 보겠다.
using System;
namespace Study
{
class Program
{
static void Main(string[] args)
{
MovieEndingTime("미키 17", 2, 17, 0);
MovieEndingTime("어벤져스", 2, 23, 0);
MovieEndingTime("나 홀로 집에", 1, 43, 0);
}
static void MovieEndingTime(string movieName, uint hour, uint minute, uint second)
{
Console.WriteLine("[영화 이름]: {0}", movieName);
Console.WriteLine("[영화 상영 시간]: {0}:{1}:{2}", hour, minute, second);
}
}
}
[영화 이름]: 미키 17
[영화 상영 시간]: 2:17:0
[영화 이름]: 어벤져스
[영화 상영 시간]: 2:23:0
[영화 이름]: 나 홀로 집에
[영화 상영 시간]: 1:43:0
using System;
namespace Study
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("PI 값은?");
Console.WriteLine(PI());
}
static float PI()
{
return 3.141592f;
}
}
}
PI 값은?
3.141592
using System;
namespace Study
{
class Program
{
static void Main(string[] args)
{
int numA = 10;
int numB = 3;
Console.WriteLine(Add(numA, numB));
Console.WriteLine(Minus(numA, numB));
Console.WriteLine(Multiply(numA, numB));
Console.WriteLine(Divide(numA, numB));
}
static int Add(int num1, int num2)
{
int sumResult = num1 + num2;
return sumResult;
}
static int Minus(int num1, int num2)
{
int minusResult = num1 - num2;
return minusResult;
}
static int Multiply(int num1, int num2)
{
int multiplyResult = num1 * num2;
return multiplyResult;
}
static int Divide(int num1, int num2)
{
int divideResult = num1 / num2;
return divideResult;
}
}
}
13
7
30
3
자기 자신들 다시 부르는 함수이다.
using System;
namespace Study
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Pow(2, 0));
Console.WriteLine(Pow(2, 4));
Console.WriteLine(Pow(2, 8));
}
static void Pow(int num, int)
{
if (n > 0)
return b * power(b,n-1)
else
return 1
}
}
}
1
16
256
이러한 식으로 어떠한 수의 n승 만큼의 수를 구할 수도 있습니다. 하지만 재귀함수는 자기자신을 부르는 함수이기때문에 설계할 때 주의를 해야됩니다. 아니면 무한이 자기 자신을 부르면서 컴퓨터가 프로그래밍을 종료 시키거나 문제가 생길 수 있기 때문입니다.
피보나치 수열, 팩토리얼 같은 것들을 재귀 함수로 작성할 수 있습니다.
익명함수와 람다식은 클래스를 설명을 마치고 따로 다루겠다. 그것을 정리할 때는 클래스도 정리하여서 많은 것들을 복합적으로 정리하겠다.