본문 바로가기
프로그래밍 언어/C#

C# 6. 함수

by Jinger 2024. 3. 10.

서론

   함수(function) 혹은 메서드(method)는 반복되는 코드를 특정 작업으로 묶어 사용하여 편의성을 제공한다. 즉, 함수의 목적은 코드 재사용에 있다. 한 번 만들어 놓은 함수는 프로그램에서 한 번 이상 사용할 수 있다.


함수

   함수에는 내장 함수와 사용자 정의 함수가 있다. 내장 함수는 C#이 자주 사용하는 기능을 미리 만들어 제공하는 함수로, 특정 클래스의 함수로 표현된다. 예를 들어, 날짜 및 시간 함수, 수학 관련 함수, 형식 변환 함수 등이 있다. 이러한 내장 함수들을 API(Application Programming Interface)로 표현한다. 내장 함수와 달리 사용자 정의 함수는 프로그래머가 필요할 때마다 새롭게 기능을 추가하여 사용한다.

정의

    함수 정의(define)는 함수를 만드는 작업이다. 함수 호출(call)은 함수를 사용하는 작업이다. 함수 생성 및 호출은 반드시 소괄호가 들어간다.

static 자료형 함수이름(자료형 매개변수)
{
    함수 내용
    return 반환값;
}

   함수의 자료형은 함수가 반환하는 자료형과 같아야 한다. 만약 반환하는 값이 없다면 void 자료형을 사용하면 된다. 이는 아무것도 반환하지 않는다는 의미를 가진다.

사용

    함수를 호출하는 방법은 아래와 같이 3가지 형태가 있다.

함수명();
함수명(매개변수);
변수 = 함수이름(매개변수);

매개변수

    함수를 호출할 때 필요한 값이 있을 수 있다. 이때 매개변수(인자, 파라미터)를 통해 어떤 정보를 넘겨준다. 이러한 매개변수는 콤마를 기준으로 여러 개 설정할 수 있다.

  • 매개변수가 없는 함수: 매개변수도 없고 반환값도 없는 함수 형태이다. 
  • 매개변수가 있는 함수: 특정 함수에 인자 값을 1개 이상 전달하는 방식이다.
  • 반환값이 있는 함수: 함수의 처리 결과를 함수를 호출한 쪽으로 반환할 때는 return 키워드를 사용하여 데이터를 돌려줄 수 있다.
  • 매개변수가 가변(여러 개)인 함수: C#에서 크래스 하나에 매개변수의 형식과 개수를 달리하여 이름이 동일한 함수를 여러 개 만들 수 있다. 이를 가리켜 함수 중복 혹은 함수 오버로드(Overload)라고 한다.

반환값

    함수의 여러 가지 특징 중 하나인 반환값(return value)은 함수에서 어떤 처리를 진행한 후 그 결과를 다시 함수를 호출한 부분으로 되돌려 주는 것을 의미한다. 되돌려 주는 값은 매개변수와 마찬가지로 C#의 모든 데이터 형식으로 줄 수 있다. 주의할 점으로는 return 키워드 뒤로는 어떠한 코드도 실행되지 않는다. 만약 중간에 return 할 일이 있다면 if문을 사용하자.

static 자료형 함수이름(자료형 매개변수 = 디폴트 값)
{
    함수 내용
    return 반환값;
}

    메서드를 선언할 때 매개변수를 선어노가 동시에 초기화해 놓으면, 메서드를 호출할 때 매개변수를 지정하지 않아도 기본값으로 자동 설정한다. 이 기능을 기본 매개변수(defalult parameter) 또는 선택적 인수(optional argument)라고 한다.

명명된 매개변수

   명명된 매개변수를 사용하면 함수를 호출할 때 필요한 매개변수 이름을 직접 지정할 수 있다.

using System;

class NamedParameter
{
	static void Main()
    {
    	Sum(10, 20);
        Sum(first: 10, second: 20);
        Sum(second: 20, first: 10);
    }
    
    static void Sum(int first, int second)
    {
    	Console.WriteLine(first + second);
    }
}

함수 오버로드

    클래스 하나에 매개변수를 달리해서 이름이 동일한 함수 여러 개를 정의할 수 있는 데, 이를 함수 오버로드라고 한다. 함수 오버로드를 할 때에는 함수의 이름, 반환값이 같아야 하며, 오직 매개변수의 수, 자료형, 순서가 달라야 한다.

using System;

class FunctionOverload
{
    static void Multi()
    {
    	Console.WriteLine("안녕하세요.");
    }
    
    static void Multi(srting message)
    {
    	Console.WriteLine(message);
    }
    
    static void Multi(string message, int count)
    {
    	for(int i = 0; i < count; i++)
        {
    		Console.WriteLine(message);
        }
    }
    
    static void Main()
    {
    	Multi();
        Multi("잘가");
        Multi("반가워", 3);
    }
   
}

재귀함수

    함수에서 함수 자신을 호출하는 것을 재귀(recursion) 또는 재귀 함수라고 한다. 재귀함수에 대표적인 예인 패토리얼이다. 팩토리얼이란 n! 일 때 1부터 n까지의 곱을 의미한다.

using System;

class RecursionDemo
{
    static void Main()
    {
    	Console.WirteLine(FactorialFor(4));
        Console.WirteLine(Factorial(4));
    	Console.WirteLine(Fact(4));
    }
   
   // 3항 연산자를 사용한 재귀 함수
   static void Fact(int n)
   {
   	return (n > 1) ? n * Fact(n-1) : 1;
   }
   
   // 재귀함수
   static void Fact(int n)
   {
   	if(n == 0 || n == 1)
    {
    	return 1;
    }
    return n * Factorial(n - 1);
   }
   
   // 반복문으로 구하기
   static void Fact(int n)
   {
   int result = 1;
    for(int i = 1; i <= n; i ++)
    {
    	result *= i;
    }
    return result;
   }
}

    재귀 호출은 스택(stack) 메모리에 저장되는 형태로 실행한다. 너무 많은 재귀 처리는 스택 오버플로(stack overflow) 에러가 발생하기 쉽다. 그러기에 많은 양의 데이터를 처리하는 코드를 작성할 때는 재귀 호출보다 반복문 등으로 풀어 쓰는 것이 훨씬 좋다.

함수 범위(전역과 지역)

    클래스와 같은 레벨에서 선언된 변수를 전역 변수(global variable) 또는 필드(field)라고 하며, 함수 레벨에서 선언된 변수를 지역 변수(local variable)라고 한다. 이때 동일한 이름으로 변수를 전역 변수와 함수 내의 지역 변수로 선언할 수 있다. 함수 내에서는 함수 범위에 있는 지역 변수를 사용하고, 함수 범위 내에 선언된 변수가 없으면 전역 변수 내에 선언된 변수를 사용한다. C#에서 전역 변수가 아닌 필드라는 단어를 주로 사용하며, 전역변수는 주로 언더스코어(_) 혹은 (m_) 접두사를 붙인다.

    로컬 함수라 하여 함수 내에서만 사용하는 또 다른 함수를 만드는 것이 있다.

=> 연산자

    화살표 모양의 연산자인 화살표 연산자(=>)를 사용하여 메서드 코드를 줄일 수 있다. 이를 화살표 함수(Arrow Function)이라고 한다. 프로그래밍에서 화살표 함수 또는 화살표 메서드는 람다식(lambda expression)의 또 다른 이름이다.

using System;

class Demo
{
	static void Main()
    {
    	int Add(int a, int b) => a + b;	// 로컬 함수
    	Log("함수 축약");
    }
    
    static void Log(string message) => Console.WriteLine(message);
}

주섬주섬

  • static 키워드 유무로 정적이냐 인스턴스냐로 나뉘지만 클래스 이전까지는 신경을 쓰지 않아도 된다. static이 있든 없든 코드 내에서는 잘 작동이 된다.

참고

 

C# 네이밍

서론 C# 코딩 컨벤션(C# coding Conventions)은 C# 코드를 작성할 때 사용되는 규칙과 가이드라인의 모음이다. 이러한 컨벤션은 코드의 가독성과 일관성을 유지하고 협업 시에도 작성자 간에 일관된 스

jinger.tistory.com

 

반응형

'프로그래밍 언어 > C#' 카테고리의 다른 글

C# 7. 닷넷 API  (0) 2024.05.09
C# 5. 배열  (0) 2024.03.02
C# 4. 제어문  (1) 2024.02.27
C# 3. 변수와 입력문  (1) 2023.10.04
C# 2. 출력문  (0) 2023.09.10

댓글