컴퓨터 과학에서 함수란?
함수(function), 서브루틴(subroutine), 루틴(routine), 메서드(method), 프로시저(procedure)는 소프트웨어에서 특정 동작을 수행하는 일정 코드 부분이다. 즉, '특정한 작업을 위해 재활용할 수 있도록 구현한 코드 블록'을 의미한다.
간단하게 풀어 설명하면 프로그래밍에서 함수/메서드란 어떤 기능들의 묶음(코드 블록),
또는 어떤 매개변수를 넣었을 때 특정한 결과값을 도출하는 것으로 볼 수 있다.
코드가 방대해 지면 질수록 Main 함수에 모든 코드를 나열하는 것은 불가능해진다. 예를 들어 온라인 게임 기준으로 프로그램의 코드 줄이 몇십만 줄의 수준이 되는데, 이 줄을 모두 메인 함수에 넣으면 가독성이 너무나도 떨어질 것이다. (개인적인 기준으로 하나의 기능을 위한 코드가 100줄 정도가 넘어가기 시작하면 가독성이 상당히 떨어지기 시작한다) 따라서 코드를 기능별로 묶어 주는 것은 반드시 필요하고, 이 때 사용하는 것들이 함수라는 개념이다.함수(Function) 또는 메서드(Method)라는 표현으로 혼용해서 사용(세부적으로는 차이가 있으나, 일반적으로 혼용해서 사용한다)하니 메서드라는 표현도 잘 알아두자.
한정자 반환형식 함수명(매개변수목록) {}
예시로 간단하게 Hello World를 출력하는 함수(로직 묶음)를 만들어 봤다.
namespace CSharp
{
internal class Program
{
//메서드 함수
static void HelloWorld()
{
Console.WriteLine("Hellow World");
}
static void Main(string[] args)
{
Program.HelloWorld();
}
}
}
이번에는 입력값에 따른 출력값을 받기 위한 덧셈 함수를 만들어 봤다.
namespace CSharp
{
internal class Program
{
//메서드 함수
static int Add(int a, int b)
{
int result = a + b;
return result;
}
static void Main(string[] args)
{
int result = Program.Add(5, 10);
Console.WriteLine(result);
}
}
}
여기서 주의해야 되는 사항이 있는데, 코드를 다음과 같이 1을 증가시키는 함수를 만들어서 짰다고 가정해 보겠다.
C++에서 다루었던 복사/참조 문제, 즉 Call by reference Call by Value 문제와도 같다.
namespace CSharp
{
internal class Program
{
//메서드 함수
static void AddOne(int number)
{
number = number + 1;
}
static void Main(string[] args)
{
int a = 0;
Program.AddOne(a);
Console.WriteLine(a);
}
}
}
당연히 1이 나올 줄 알았겠지만, 결과는 0이다. 왜일까?
메인함수에서 변수 a를 AddOne() 함수에 넘겼을 때, 진짜 a 값을 넘기는 것이 아니라 a값을 '복사' 해서 넘기는 것이기 때문에 변수 a의 진짜 값에는 변동이 없다고 이해하면 된다.
풀어서 설명해 보겠다. 실제 컴퓨터 어딘가에 저장된 a의 메모리에 접근해서 변경해야지만 a의 값이 실제로 변경될 것이다. 하지만 여기서는 a의 값을 '복사'해서 함수에 넘겨주는 것이기에 AddOne() 함수 안에서는 a의 값을 복사해서 넘겨받은 후에(여기서 복사해 넘겨받은 값을 임시값 b라고 하겠다), 복사한 값 b에 1을 더해주는 것이기 때문에 실제 a의 메모리에 변동이 있을 리가 없는 것이다!
이 주제에 관해서는 C++ 관련 포스트에서 많이 다뤘기에 관련 글을 참고해 주면 더 깊은 이해를 할 수 있을 것이다.
만약 실제 a의 값을 변동하고 싶다면?
ref 키워드를 사용해 주면 된다. reference, 즉 실제 a의 메모리에 해당하는 주소를 참조해 넘기라는 의미이다.
초보자 분들은 쉽게 외워 주시면 된다. 복사는 짝퉁, 참조는 진퉁이다.
namespace CSharp
{
internal class Program
{
//메서드 함수
static void AddOne(ref int number)
{
number = number + 1;
}
static void Main(string[] args)
{
int a = 0;
Program.AddOne(ref a);
Console.WriteLine(a);
}
}
}
참고로 실제 게임 개발에서는 모든 코드를 그대로 메인 함수에 넣는 것이 아니라, 코드를 기능별로 메서드로 모두 묶을 것을 추천한다.
'C# 기초 프로그래밍 > C# Basic' 카테고리의 다른 글
[C# Basics] 재귀 함수 (0) | 2024.06.11 |
---|---|
[C# Basics] 다형성 (polymorphism) - OOP의 핵심 개념 (0) | 2024.04.15 |
[C# Basics] 캡슐화 / 은닉성 - OOP 의 핵심 개념(객체 지향 프로그래밍) (0) | 2024.04.12 |
[C# Basics] 객체지향 OOP란 무엇인가? - 핵심 4개념과 개론 (0) | 2024.04.12 |
[C# Basics] 생성자 Constructor (0) | 2024.04.02 |
[C# Basics] 스택과 힙 정리 - feat.복사와 참조, value, reference (0) | 2024.04.01 |
<C# Basics> 복사와 참조 (struct, class의 차이, 깊은 복사) (0) | 2023.12.23 |
<C# Basics> ref, out 키워드 (0) | 2023.12.11 |