# Function in Programming (1/2)

**Contents**

---

**1️⃣** 함수(function)의 개념과 특징

---

## **1️⃣** 함수(function)의 개념과 특징

### 함수의 개념 🔽

**<mark>💡요약: </mark>** 함수는 입력을 받아 특정한 규칙에 따라 처리를 하고, 그 결과를 출력으로 내보내는 일련의 과정으로 이해하면 된다. **함수는 코드의 재사용성을 높이고, 복잡한 작업을 더 쉽게 수행할 수 있게 해주는 중요한 도구이다.**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730637384700/f0f3a946-a929-45d6-95a2-819f01c1f0bc.png align="center")

함수는 **입력**(**input**)을 받아서 특정한 작업을 수행한 후 **출력**(**output**)을 제공하는, 일종의 **블랙 박스**(**black box**)처럼 동작한다고 볼 수 있다. 여기서 **max()** 함수가 예시로 사용되었는데, 이는 입력받은 값들 중에서 가장 큰 값을 출력으로 반환하는 함수이다.

* **함수(function)**: 입력 값을 받아 특정 작업을 수행하고 그 결과를 반환하는 도구이다. 복잡한 계산이나 작업을 쉽게 처리할 수 있도록 도와준다.
    
* **입력(input)**: 함수가 작업을 수행하기 위해 받는 값을 뜻한다. 예를 들어, `max()` 함수는 여러 숫자를 입력으로 받아 그중 가장 큰 값을 찾아준다.
    
* **출력(output)**: 함수가 작업을 수행한 후 결과로 반환하는 값이다. `max()` 함수의 경우 가장 큰 값이 출력으로 반환된다.
    

---

### 함수가 필요한 이유 (**Why Functions are Necessary**) 🔽

**<mark>💡요약: </mark>** 동일한 코드를 여러 곳에서 사용해야 할 때, 함수는 코드의 **재사용성**(**reusability**)을 높여주고, 코드의 **중복**(**duplication**)을 줄여준다. 함수를 사용하면 동일한 작업을 수행하는 코드를 여러 번 작성할 필요 없이 함수 호출만으로 같은 작업을 반복할 수 있다.  

* **재사용성(reusability)**: 동일한 작업을 여러 번 수행할 때, 함수를 사용하면 코드의 중복을 줄이고 유지보수를 쉽게 할 수 있다.
    
* **중복 제거**(**removal of duplication**): 동일한 코드를 여러 곳에 반복해서 작성하는 대신, 함수로 정의하여 필요할 때마다 호출할 수 있다.
    

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730637531169/e468e06e-2f39-45be-8ac7-0f5030d78d0d.png align="center")

동일한 코드를 여러 번 작성해야 하는 상황이다. 예를 들어, 별(`*`)을 30번 출력하는 코드를 두 번 작성하는 경우, 중복된 코드가 생기게 된다. 이는 유지보수가 어렵고, 실수할 가능성도 높아지게 된다. 이를 함수를 작성하여 동일한 코드를 하나로 만들 수 있게된다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730637537310/21187e1b-b802-4106-b093-d3213cafdeb4.png align="center")

`print_stars()`라는 **함수**(**function**)를 작성하여 별을 출력하는 코드를 함수로 묶은 예제이다. 이제 별을 출력하려면 `print_stars();`라는 함수 호출만 하면 된다. 이렇게 하면 동일한 작업을 수행할 때마다 코드를 복사해서 붙여넣지 않아도 되므로 더 효율적이다.

---

### 함수의 특징 (**Characteristics of Functions**)🔽

**<mark>💡요약: </mark>** 함수는 특정한 작업을 수행하기 위해 필요한 명령어들의 모음으로, 반복적인 작업을 효율적으로 처리할 수 있게 도와준다.  

* **명령어들의 모음(sets of commands)**: 함수는 특정 작업을 수행하기 위해 여러 명령어가 모여 있는 집합체이다. 이러한 명령어들은 함께 묶여서 한 번에 실행된다.
    

* **서로 구별되는 이름(distinct names)**: 함수는 각기 다른 이름을 가지고 있어, 코드 내에서 쉽게 구분할 수 있다. 예를 들어, 덧셈을 수행하는 함수는 `add()`로 명명한다.
    
* **특정한 작업 수행(executing a specific task)**: 각 함수는 특정한 작업을 수행하도록 설계되어 있다. `add()` 함수는 두 수를 더하는 작업을 수행하는 예이다.
    
* **입력과 출력(input and output)**: 함수는 입력값을 받아서, 그 결과를 출력으로 반환할 수 있다.
    

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730638322316/9aaefad6-4c81-4469-bed7-943637bb9477.png align="center")

`add()`라는 함수는 입력값으로 `3`과 `7`을 받아 이를 더하고, 결과로 `10`을 출력한다.

---

### 함수의 장점 (**Advantages of Functions**) 🔽  

* **코드 중복 방지(prevent code duplication)**: 함수를 사용하면 동일한 작업을 여러 곳에서 반복할 때, 코드의 중복을 피할 수 있다. 동일한 기능을 매번 다시 작성하지 않고, 함수로 정의해 필요할 때마다 호출할 수 있게 된다.
    
* **재사용성(reusability)**: 한 번 작성된 함수는 여러 번 재사용할 수 있어, 개발 시간을 줄이고 코드를 간결하게 유지할 수 있다.
    
* **모듈화(modularity)**: 함수를 사용하면 전체 프로그램을 여러 작은 모듈로 나눌 수 있다. 이렇게 하면 각 모듈을 독립적으로 개발하고 유지할 수 있어, 프로그램의 체계성을 높이고 유지보수를 쉽게 할 수 있다.
    

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730638428125/07f443c6-f937-4ea6-9fdc-9bcdb913087e.png align="center")

레고 블록을 사용하여 함수 이해해보자. 프로그램을 레고 블록처럼 작은 부분들로 나누어 각각의 블록이 특정한 기능(함수)을 수행하도록 설계하는 것이다. 이렇게 큰 작업을 여러 개의 작은 작업으로 나누어하는 개념을 “모듈화(**modularity**)”라고 하고 “작은 작업”을 함수로 정의한다. 이렇게 하면 프로그램이 체계적이고 이해하기 쉬워지며, 개발 과정과 유지보수도 수월해지게 된다.

---

### 함수의 종류 (**Types of Functions**)🔽

* **사용자 정의 함수(user-defined functions)**: 프로그래머가 필요에 따라 직접 만드는 함수이다. 기본적으로 제공되지 않는 특별한 기능이 필요할 때, 사용자가 함수를 정의하여 사용할 수 있다.
    
* **라이브러리 함수(library functions)**: 프로그래밍 언어에서 기본적으로 제공하는 함수들로, 자주 쓰이는 기능을 쉽게 사용할 수 있도록 만들어졌다. 예를 들어, `printf()`, `scanf()`, `sqrt()` 같은 함수들이 있다.
    

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730638557318/7236257b-0d73-48ed-99e2-6010fb8fb00f.png align="center")

사용자 정의 함수는 원하는 기능을 직접 추가할 수 있는 유연함을 제공하고, 라이브러리 함수는 이미 제공된 기능을 손쉽게 사용할 수 있는 장점을 제공한다. 필요에 따라 직접 함수를 작성하거나, 이미 제공된 라이브러리 함수를 사용함으로써 개발 시간을 절약할 수 있다.

---

### 중간 점검 (**Midpoint Check**)🔽

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730638690782/4c626cc3-ee71-485e-b39d-fb54cc66c63d.png align="center")

* **함수가 필요한 이유는 무엇인가?**
    
    * 함수는 **코드 중복을 방지**(**prevent code duplication**)하고 **재사용성**(**reusability**)을 높이며, 프로그램을 **체계적**(**organized**)으로 유지할 수 있도록 도와준다. 동일한 작업을 반복할 때 함수로 정의하면 코드가 더 깔끔해지고 유지보수가 쉬워진다.
        
* **함수와 프로그램의 관계는?**
    
    * 함수는 프로그램 내에서 **특정 작업**(**specific tasks**)을 수행하는 작은 단위이다. 프로그램은 여러 함수로 구성될 수 있으며, 이 함수들이 상호작용하여 프로그램의 전체적인 기능을 완성한다. **함수를 사용하면 프로그램을 모듈화할 수 있어**(modularize the program) 각 기능을 독립적으로 관리할 수 있게 된다.
        
* **컴파일러에서 지원되는 함수를 \_\_\_\_\_\_\_ 함수라고 한다.**
    
    * **라이브러리 함수**(library functions)라고 한다. 라이브러리 함수는 프로그래밍 언어에서 기본적으로 제공되는 함수로, 자주 사용하는 기능을 쉽게 활용할 수 있도록 미리 구현된 함수들이다.
        

---

### 함수의 정의 (**Function Definition**) #1 - 구문(Syntax) 🔽

**<mark>💡요약: </mark> 함수는 코드의 일부 작업을 묶어서 재사용할 수 있게 해주는 중요한 도구**이며, 반환형, 이름, 매개변수, 몸체로 구성된다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730639735310/e38198bb-c8a9-48c8-bac9-f7ae14faea9a.png align="center")

**1\. 반환형 (Return Type)**

* **반환형**(return type)은 함수가 작업을 수행한 후 반환하는 데이터의 **자료형**(**data type**)을 나타낸다. 예를 들어, `void`는 함수가 아무 값도 반환하지 않는다는 뜻이다.
    
* 반환형이 `int`라면, 함수는 정수형 데이터를 반환한다.
    
* 예시: `int`로 설정된 함수는 정수를 반환해야 한다.
    

**2\. 함수 이름 (Function Name)과 매개변수 (Parameters)**

* **함수 이름**(function name)은 함수가 호출될 때 사용되는 식별자이다. 이름은 함수의 역할을 잘 설명하도록(descriptive name) 지정하는 것이 좋다. 예를 들어, `print_stars`는 별을 출력하는 함수이다. 또한 이름을 지을 때 **동사 + 명사**(verb + noun) 형태로 기능을 명확하게 나타내는 것이 좋다. 예를 들어, `compute_average()`는 평균을 계산하는 함수임을 쉽게 알 수 있다.
    
* **매개변수**(parameters)는 함수가 필요로 하는 입력 값들이다. 위 예시에서는 매개변수가 없지만, 일반적으로 `()` 안에 변수 이름과 자료형을 지정하여 함수가 필요로 하는 값을 받도록 할 수 있다.
    

**3\. 함수 몸체 (Function Body)와 함수 헤더 (Function Header)**

* **함수 헤더**(function header)는 반환형, 함수 이름, 매개변수로 구성된 첫 줄을 일컫는다. 이 부분에서 함수의 역할을 정의하고, 필요한 값을 받는 형식을 지정한다.
    
* **함수 몸체**(function body)는 `{}` 안에 있는 부분으로, 함수가 수행할 작업을 포함한다. 이 예제에서 `for` 문은 별을 30번 출력하는 작업을 수행하게 된다.  
    

**💡예시상황:** 함수 이름의 예제이다. 아래와 같은 방식으로 함수 이름을 지으면, 코드의 가독성이 높아지고, 함수의 기능을 쉽게 파악할 수 있게 된다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730702796136/cfecb0a5-62e3-4088-b172-fa4eab566a5d.png align="center")

* `int square()` : 정수를 제공하는 함수
    
* `double compute_average()` : 평균을 구하는 함수
    
* `void set_cursor_type()` : 커서의 타입을 설정하는 함수
    

---

### 함수 호출 (**Function Call**) #1 🔽

**<mark>💡요약: </mark>** 함수 호출은 프로그램이 함수의 이름을 불러 함수 내의 작업을 수행하도록 지시하는 과정이다. 이는 코드의 흐름을 제어하고, 원하는 작업을 특정 위치에서 반복적으로 실행할 수 있도록 도와주는 중요한 개념이다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730704264349/002c67f4-dc0a-46c1-bd5f-27552dc3fc9c.png align="center")

* **함수 호출(function call)**
    
    * 함수 호출이란 `print_stars()`와 같이 **함수의 이름을 불러**(**calling the function by its name**) 함수를 실행하도록 지시하는 것이다..
        
* **실행 흐름의 중단과 이동**
    
    * 함수 호출이 발생하면 현재 실행 중이던 **코드가 일시 중단**(**temporarily paused**)되고, 프로그램 흐름이 호출된 함수로 이동한다. 함수 내부의 코드가 순서대로 실행되며, 호출된 함수의 작업이 완료될 때까지 기존 코드의 실행은 멈추게 된다.
        
* **실행 후 복귀**
    
    * 호출된 함수의 실행이 끝나면 프로그램은 **다시 원래 위치로 돌아가**(**returns to the original location**) 남은 코드를 계속 실행한다.  
        

**💡예시상황:** 예제에서는 `print_stars()`라는 함수를 호출하고 있다. 이 함수는 별(`*`)을 30번 출력하는 기능을 한다.

* 프로그램이 `print_stars();`를 만나면 함수를 호출하고, 함수 내부 코드(`for`문)가 실행됨
    
* `for`문은 `printf("*");`를 30번 반복하여 별을 출력함
    
* 함수 실행이 끝나면 프로그램은 호출 위치로 돌아와 다음 코드를 계속해서 실행함.
    

**💡추가정보**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730704361832/ec87252e-cd7f-42b4-941f-180ffdf7323d.png align="center")

* 위의 예제처럼 함수는 여러번 호출될 수 있다.
    

---

### 예제 🔽

`print_stars()` 함수를 두 번 호출하여 화면에 별을 출력하고, 그 사이에 `"Hello World!"`를 출력하는 코드를 작성해본다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730704395451/d76a38c2-8e13-4c29-af98-7c2985619276.png align="center")

* **함수 정의**: `print_stars()` 함수는 별(`*`)을 30번 출력하는 기능을 수행한다. 함수 내부의 `for` 반복문이 이를 수행하게 된다.
    
* **함수 호출(function call)**: `print_stars();`라는 구문을 통해 함수를 호출한다. `main()` 함수 내에서 두 번 호출되었으며, 첫 번째 호출 후 `"Hello World!"`가 출력되고, 다시 `print_stars()`가 호출된다.
    
* **출력 흐름**:
    
    * 첫 번째 `print_stars()` 호출로 별이 30번 출력된다.
        
    * `"Hello World!"`가 새로운 줄에 출력된다.
        
    * 두 번째 `print_stars()` 호출로 별이 다시 30번 출력된다.
        

```sql
#include <stdio.h>

void print_stars() // 별을 출력하는 함수 정의
{
    for (int i = 0; i < 30; i++)
        printf("*");
}

int main(void)
{
    print_stars(); // 첫 번째 함수 호출
    printf("\nHello World!\n"); // "Hello World!" 출력
    print_stars(); // 두 번째 함수 호출
    return 0;
}
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730704636558/e7287b27-83de-4e34-8457-6e37c59246ac.png align="center")

* **실행결과**
    

### **매개 변수**(**Parameters**) 및 **반환값**(**Return Value**) 🔽

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730704685333/5578068e-5b25-4f24-b010-7aca847a2707.png align="center")

* **매개 변수 (Parameters)**
    
    * **매개 변수**(parameters)는 함수가 작업을 수행할 때 필요한 입력값이다. 이 예제에서는 `int x`와 `int y`라는 두 매개 변수를 사용하여 두 개의 정수를 함수에 전달한다.
        
* **함수 몸체 (Function Body)와 반환값 (Return Value)**
    
    * **함수 몸체**(function body)는 `{}` 안에 있는 부분으로, 함수가 수행할 작업을 포함하는데, 이 예제에서는 `if` 조건문을 사용하여 `x`와 `y` 중 큰 값을 결정하고 반환한다.
        
    * **반환값**(return value)은 함수가 실행을 완료한 후 호출한 위치로 전달하는 값이다. 이 함수는 `return x;` 또는 `return y;`를 통해 두 값 중 큰 값을 반환다.
        

**<mark>💡요약: </mark>** 위의 예제는 `max()` 함수가 두 개의 정수 입력을 받아, 그 중 더 큰 값을 찾아 반환하는 과정을 설명한다. 함수는 입력을 받아서 조건문을 통해 큰 값을 결정하고, 그 값을 결과로 반환한다. **함수는 매개 변수를 통해 필요한 입력을 받아 작업을 수행하고, 반환값을 통해 결과를 제공**한다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730705834913/4124e8cf-183e-46e8-b0bc-90e3897f65d3.png align="center")

---

### **인수**(**Argument**)와 **매개변수**(**Parameter**) #1 🔽

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730705920764/642b495f-5b9a-48c3-ba2a-4a1a0fd3ce06.png align="center")

* **인수 (Argument)**
    
    * **인수**(argument)는 함수가 호출될 때 **실제로 함수에 전달되는 값**(**actual value passed to the function**)이다. 인수는 함수가 작업을 수행하기 위해 사용하는 구체적인 데이터이다.
        
    * 예를 들어, `max(10, 20);`에서 `10`과 `20`은 `max` 함수로 전달되는 인수이다.
        
* **매개변수 (Parameter)**
    
    * **매개변수**(parameter)는 함수가 인수를 받아들이기 위해 사용하는 **변수**(**variable that receives the argument value**)이다. 매개변수는 함수가 호출될 때 전달된 인수를 저장하여 함수 내에서 사용하게 해준다.
        
    * 예를 들어, `int max(int x, int y)`에서 `x`와 `y`는 매개변수이며, 함수가 호출될 때 인수 `10`과 `20`을 각각 받아오게 된다.
        

**💡예시상황:** 위의 이미지에서는 `value = max(10, 20);`라는 코드가 있다. 여기서 `10`과 `20`은 **인수**이고, `int max(int x, int y)` 함수 내의 `x`와 `y`는 **매개변수**이다. 인수 `10`과 `20`이 매개변수 `x`와 `y`에 전달되어, `max` 함수가 그 값을 사용하여 두 값 중 큰 값을 결정하고 반환하게 된다. 인수와 매개변수를 이해하면 함수 호출 시 데이터가 어떻게 전달되고, 함수 내에서 어떻게 사용되는지 쉽게 이해할 수 있게 된다.

---

### **인수**(**Argument**)와 **매개변수**(**Parameter**) #2 - 추가적인 규칙 🔽

* **매개변수가 없는 함수 (Function without Parameter)**
    
    * 매개변수가 없는 함수는 `print_stars(void)`처럼 매개변수 위치에 `void`를 쓰거나, `print_stars()`처럼 아무것도 적지 않아도 된다. 이는 함수가 호출될 때 별도의 값을 받지 않는다는 것을 의미한다.
        
* **인수의 다양성 (Variety of Argument)**
    
    * 함수가 호출될 때마다 인수는 다르게 설정될 수 있다. 즉, 매번 호출 시 다른 값을 함수에 전달할 수 있다는 뜻이다. 이를 통해 함수는 다양한 입력을 처리할 수 있게 된다.
        
* **매개변수와 인수의 개수 일치 (Parameter and Argument must match exactly)**
    
    * 매개변수의 개수는 **정확히 인수의 개수와 일치**(**must match exactly**)해야 한다. 만약 매개변수와 인수의 개수가 일치하지 않으면 **오류**(**error**)가 발생하게 된다. 예를 들어, `max(int x, int y)`라는 함수가 두 개의 매개변수를 요구하는데, 인수를 한 개만 전달하면 오류가 발생한다.
        

**💡예시상황:** 매개변수의 개수가 맞지 않을 때 발생하는 상황을 생각해보자. 예를 들어 `max(10);`처럼 인수를 하나만 전달할 경우나 `max();` 처럼 void인 경우 `max` 함수는 두 개의 매개변수를 요구하므로 오류가 발생하게 된다. 따라서 **인수의 개수와 매개변수의 개수는 항상 일치해야 함을 기억하자**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730706357390/06de5df6-7bdd-4a8b-867c-1035ffb04e08.png align="center")

---

### **반환값**(**Return Value**) 🔽

**<mark>💡요약: </mark>** 반환값은 함수가 작업을 수행한 후 호출된 위치로 **결과를 돌려주는 값**이다. 반환값은 함수가 수행한 계산이나 작업의 최종 결과라고 할 수 있다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730706424301/21946833-d335-42a8-b17e-255eddede572.png align="center")

* **반환값 (Return Value)**
    
    * **반환값**은 함수가 작업을 완료하고 호출한 곳으로 전달하는 결과 값이다. 이 값은 함수가 끝난 후 `return` 문을 사용하여 반환된다.
        
* `return` 문
    
    * `return` 문은 함수가 호출된 위치로 값을 돌려보낼 때 사용한다. `return` 뒤에 계산된 값을 적으면 그 값이 반환된다.
        
    * 예를 들어, `return x;`라고 하면 함수는 `x`의 값을 호출한 곳으로 돌려준다.
        
* **반환값의 개수**
    
    * 함수는 **여러 개의 인수**(**multiple arguments**)를 받을 수 있지만, 반환값은 **오직 하나**(**only one return value**)만 가능하다. 이는 함수가 하나의 작업 결과만 반환한다는 것을 의미한다.
        

**💡예시상황:** 위의 이미지에서는 `value = max(10, 20);`라는 코드가 있다. 여기서 `max(10, 20)` 함수가 실행되어, `10`과 `20` 중 더 큰 값이 반환되게 된다. 반환된 값은 `value` 변수에 저장된다.

---

### 중간 점검(**Midpoint Check**)

* **함수의 반환형이 없는 경우에는 어떻게 표시하는가?**
    
    * **반환형이 없는 함수**(function without a return type)는 `void` 키워드를 사용하여 표시한다. 예를 들어, `void print_stars()`는 반환값이 없는 함수이다.
        
* **수식 (x+y+z)의 값을 반환하는 문장을 작성해보자.**
    
    * 수식 `(x + y + z)`의 값을 반환하는 `return` 문은 다음과 같다:
        
        ```c
        return x + y + z;
        ```
        
    * 이 `return` 문은 `x`, `y`, `z`의 합을 계산하여 호출한 곳으로 돌려준다.
        
* **double형 변수 f를 매개 변수로 가지고 double형의 값을 반환하는 fabs() 함수 헤더를 정의해보자.**
    
    * `fabs()` 함수는 `double`형 매개 변수를 하나 받고, `double`형 값을 반환한다. 함수 헤더는 다음과 같이 정의할 수 있다.
        
        ```c
        double fabs(double f);
        ```
        
    * 여기서 `double`은 반환형을 나타내고, `f`는 `double`형 매개 변수이다.
        

---

### 예제 🔽

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730712357392/e5c0584f-ce0f-46e9-a5ae-37c1156cfce1.png align="center")

```c
#include <stdio.h>

int max(int x, int y) // 두 정수 중 더 큰 값을 반환하는 함수
{
    if (x > y)
        return x;
    else
        return y;
}

int main(void)
{
    int x, y, larger;
    
    printf("정수 2개를 입력하세요: ");
    scanf("%d %d", &x, &y); // 사용자로부터 두 정수 입력 받기

    larger = max(x, y); // max 함수 호출하여 더 큰 값 찾기
    printf("더 큰 값은 %d입니다.\n", larger); // 결과 출력

    return 0;
}
```

* `max()` 함수: `max()` 함수는 두 개의 정수를 매개변수로 받아, 더 큰 값을 반환하는 함수이다. `if` 문을 사용하여 `x`가 `y`보다 큰 경우 `x`를 반환하고, 그렇지 않으면 `y`를 반환한다.
    
* `main()` 함수
    
    * `main()` 함수에서는 사용자로부터 두 개의 정수를 입력받고, `max()` 함수를 호출하여 더 큰 값을 찾는다.
        
    * `scanf()` 함수를 사용하여 사용자의 입력을 받아 변수 `x`와 `y`에 저장한다.
        
    * `larger` 변수에 `max(x, y)`의 결과를 저장한 후, `printf()` 함수를 사용하여 더 큰 값을 화면에 출력한다.
        

---

### 생일 축하 함수 🔽

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730712847649/536f01e9-1532-466c-b10c-20868d1eeb90.png align="center")

```c
cCopy code#include <stdio.h>

void happyBirthday() // 생일 축하 메시지를 출력하는 함수
{
    printf("생일축하 합니다! \n");
    printf("생일축하 합니다! \n");
    printf("사랑하는 친구의 ");
    printf("생일축하 합니다! \n");
}

int main(void)
{
    happyBirthday(); // happyBirthday 함수 호출
    return 0;
}
```

* **함수 정의**
    
    * `happyBirthday()` 함수는 반환형이 없는 `void`형 함수로, 생일 축하 메시지를 여러 줄로 출력한다.
        
    * `printf()` 함수를 사용하여 각 줄마다 생일 축하 메시지를 출력한다.
        
* **함수 호출**
    
    * `main()` 함수에서는 `happyBirthday()` 함수를 호출하여 생일 축하 메시지를 화면에 출력한다.
        
    * `happyBirthday()`가 호출되면 정의된 메시지가 차례로 출력된다.
        

---

### 정수를 입력받는 get\_integer()함수 🔽

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730713861903/6ebed00f-8cc5-45fd-a47d-ce311d858f6c.png align="center")

* **함수 정의**
    
    * `get_integer()` 함수는 **반환형이** `int`형이므로 정수 값을 반환한다.
        
    * 이 함수는 매개변수를 받지 않으므로 `(void)`로 표시하여 인수를 필요로 하지 않는 함수임을 나타낸다.
        
* **입력 안내와 입력값 저장**
    
    * `printf("정수를 입력하세요: ");`는 사용자에게 입력을 요청하는 메시지를 화면에 출력한다.
        
    * `scanf("%d", &value);`는 사용자가 입력한 정수를 `value` 변수에 저장한다. `&` 기호는 `value` 변수의 메모리 주소를 가리키며, `scanf`가 입력값을 해당 변수에 저장하도록 한다.
        
* **반환값**
    
    * `return value;`는 함수가 `value` 변수에 저장된 입력값을 호출한 위치로 반환하게 한다. 이로써 함수는 사용자로부터 입력받은 정수를 반환하게 된다.
        

```c
#include <stdio.h>

// 사용자로부터 정수를 입력받아 반환하는 함수
int get_integer(void)
{
    int value; // 정수를 저장할 변수 선언
    
    printf("정수를 입력하세요: "); // 사용자에게 안내 메시지 출력
    scanf("%d", &value); // 입력받은 정수를 value에 저장
    
    return value; // 입력된 정수를 반환
}

int main() {
    int number = get_integer(); // get_integer 함수 호출하여 입력받은 정수 저장
    printf("입력한 정수는 %d입니다.\n", number); // 결과 출력
    
    return 0;
}
```

이 코드를 실행하면 다음과 같은 흐름으로 진행된다:

```c
정수를 입력하세요: 15
입력한 정수는 15입니다.
```

---

### 정수의 합을 계산하는 add() 함수 🔽

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730714305160/ab051814-f1e2-4dcc-a703-3b9e7f80812a.png align="center")

* `get_integer()` 함수: 사용자에게 정수를 입력하도록 요청하고, 입력받은 값을 반환한다. 이 함수는 여러 번 호출되어도 같은 방식으로 작동하여 정수를 입력받아 반환할 수 있다.
    
* `add()` 함수
    
    * 두 개의 정수를 매개변수로 받아, 두 값의 합을 계산하여 반환한다. `return x + y;` 문을 통해 두 수의 합을 반환한다.
        
* `main()` 함수의 동작 흐름
    
    * `get_integer()` 함수를 두 번 호출하여 사용자로부터 두 정수를 입력받고, 각각 `x`와 `y`에 저장한다.
        
    * `add(x, y)` 함수를 호출하여 `x`와 `y`의 합을 계산하고, 그 결과를 `sum`에 저장한다.
        
    * `printf()`를 통해 두 수의 합을 출력한다.
        

```c
#include <stdio.h>

// 사용자로부터 정수를 입력받아 반환하는 함수
int get_integer()
{
    int value;
    printf("정수를 입력하세요: ");
    scanf("%d", &value);
    return value;
}

// 두 정수를 더하여 반환하는 함수
int add(int x, int y)
{
    return x + y;
}

int main(void)
{
    int x = get_integer(); // 첫 번째 정수 입력
    int y = get_integer(); // 두 번째 정수 입력
    
    int sum = add(x, y); // 두 수의 합 계산
    printf("두 수의 합은 %d입니다.\n", sum); // 결과 출력

    return 0;
}
```

이 프로그램을 실행하면 다음과 같은 흐름으로 진행된다:

```c
정수를 입력하세요: 10
정수를 입력하세요: 20
두 수의 합은 30입니다.
```

---

### 중간점검 🔽

* **인수와 매개변수는 어떤 관계가 있는가?**
    
    * **인수**(argument)는 함수가 호출될 때 **실제로 함수에 전달되는 값**이다.
        
    * **매개변수**(parameter)는 함수가 인수를 받아들이기 위해 선언하는 **변수**이다.
        
    * 관계적으로, 인수는 매개변수에 전달되는 실제 값이며, 매개변수는 함수가 그 값을 사용할 수 있도록 정의된 변수이다.
        
    * 예를 들어, `add(5, 10)`에서 `5`와 `10`은 인수이며, `add` 함수의 매개변수 `x`와 `y`는 이 값을 받아 작업에 사용하게 된다.
        
* **반환값이** `double`형으로 정의된 함수에서 정수를 반환하면 어떤 일이 발생할까?
    
    * 함수가 `double`형으로 정의되었다면 반환되는 값은 **자동으로** `double`형으로 변환된다.
        
    * 함수가 정수를 반환해도 컴파일러가 정수를 `double`형으로 변환하여 반환하므로 오류는 발생하지 않는다. 대신, 정수 값이 소수점이 있는 `double`형으로 변환된다. 예를 들어, `3`이 반환되면 `3.0`으로 변환된다.
        

---

### 소수(prime number)

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1730714465286/a8c33018-d24d-4fe0-915b-6ead7a0f74e0.png align="center")

* **소수의 정의**
    
    * 소수는 양의 정수 중에서 1과 자기 자신만을 약수로 가지는 수입니다. 예를 들어, 2, 3, 5, 7 등은 소수이다.
        
    * 소수 판별 프로그램은 입력된 정수를 2부터 해당 숫자 - 1까지 나누어 나머지가 0인 경우가 있으면 소수가 아닌 것으로 판단하게 된다.
        
* **알고리즘**
    
    * 입력된 정수를 변수 `n`에 저장한다.
        
    * `for` 루프를 이용해 `i`를 2부터 `n - 1`까지 증가시키면서 `n`을 `i`로 나누어 나머지가 0인지 확인한다.
        
    * 나머지가 0인 경우 약수가 존재하므로 소수가 아니다. 그렇지 않으면 소수이다.
        
* **함수 설명**
    
    * `get_integer()` 함수는 사용자로부터 정수를 입력받아 반환한다..
        
    * `is_prime(int n)` 함수는 입력된 정수가 소수인지 판별하여 결과를 반환한다. 소수일 경우 1을, 소수가 아닐 경우 0을 반환한다.
        

```c
#include <stdio.h>

// 사용자로부터 정수를 입력받아 반환하는 함수
int get_integer(void)
{
    int n;
    printf("정수를 입력하세요: ");
    scanf("%d", &n);
    return n;
}

// 입력된 정수가 소수인지 판별하는 함수
int is_prime(int n)
{
    int i;
    for (i = 2; i < n; i++) {
        if (n % i == 0) // 나누어 떨어지면 소수가 아님
            return 0;
    }
    return 1; // 나누어 떨어지지 않으면 소수
}

int main(void)
{
    int n;
    n = get_integer(); // 사용자로부터 정수 입력 받기

    // 소수 여부를 출력
    if (is_prime(n) == 1)
        printf("%d는 소수입니다.\n", n);
    else
        printf("%d는 소수가 아닙니다.\n", n);

    return 0;
}
```

이 프로그램을 실행하면 다음과 같은 흐름으로 진행된다.

```c
정수를 입력하세요: 12229
12229는 소수가 아닙니다.
```
