# Program development concept and Visual Studio

**Contents**

**1️⃣**프로그래밍 개발 개념 (Program development concept)  
**2️⃣**비주얼 스튜디오 (Visual Studio)  
**3️⃣**프로그램 설명 (Program Description)

---

**프로그램 개발 과정**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726828762801/9495c98f-4354-41aa-8260-3bcd31b2e830.png align="center")

이 이미지는 **소프트웨어 개발 과정**을 다섯 가지 주요 단계로 보여줍니다:

1. **요구사항 분석(Requirements Analysis)**
    
    * 무엇을 만들 것인지 결정한다.
        
    * 프로젝트에 필요한 요구사항을 이해하고 수집한다.
        
2. **설계(Design)**
    
    * 알고리즘을 설계한다.
        
    * 프로그램의 구조를 설계하여 구현의 기초로 사용한다.
        
3. **구현(Implementation)**
    
    * 개발 도구를 사용하여 소스 코드를 작성한다.
        
    * 설계를 실제 코드로 구현하는 단계이다. (C, Python, C++ 등으로 구현)
        
4. **테스팅(Testing)**
    
    * 여러 가지 경우에 대하여 프로그램을 실행해본다.
        
    * 프로그램이 예상대로 작동하는지 확인하고, 오류를 수정한다.
        
5. **유지보수(Maintenance)**
    
    * 사용자의 추가 요구사항을 반영한다.
        
    * 피드백이나 새로운 요구에 따라 프로그램을 유지하고 업데이트한다.
        

이 과정은 소프트웨어를 개발하는 일반적인 단계로, 초기 구상부터 완성된 제품의 유지보수까지를 포함한다.

---

**설계(Design)**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726829278074/adc97f07-9597-458c-a039-a70f47f4732f.png align="center")

* **문제를 해결하는 알고리즘을 개발하는 단계**이다.
    
* **순서도**와 **의사 코드**를 도구로 사용하여 알고리즘을 시각적으로 또는 논리적으로 표현한다.
    
* **알고리즘은 프로그래밍 언어와 무관**하며, 특정 언어에 종속되지 않고 개념적으로 작성된다.
    
* **알고리즘**은 원하는 결과를 얻기 위해 따라야 하는 **단계**에 집중하여, 문제 해결의 절차와 흐름에 초점을 맞춘다.
    

즉, 설계 단계는 프로그램이 어떤 절차를 통해 문제를 해결할지 구체적인 계획을 세우는 단계로, 이후 코딩의 기초가 된다.

---

**구현(Implementation) 1#: 소스 작성(Source Code Writing)**

* **알고리즘의 각 단계를 프로그래밍 언어를 이용하여 기술**하는 과정이다.
    
* 알고리즘을 **프로그래밍 언어의 문법에 맞추어 작성**한 것을 \*\*소스 프로그램 (source program)\*\*이라고 한다.
    
* **소스 프로그램**은 주로 **텍스트 에디터**나 \*\*통합 개발 환경(IDE)\*\*을 이용하여 작성된다.
    
* **소스 파일 이름**은 일반적으로 프로그램의 확장자를 포함하며, 예를 들어 **test.c**는 C 언어로 작성된 소스 파일이다.
    

소스 작성은 알고리즘을 구체적인 코드로 변환하는 단계로, 소스 프로그램은 컴파일러에 의해 기계어로 변환되어 실행되게 된다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726829463554/61b03664-679d-4664-8bf1-e876c686263f.png align="center")

---

**구현(Implementation) 2#: 컴파일(Compile)**

* **소스 프로그램**을 **오브젝트 파일**로 변환하는 작업이다.
    
* 컴파일된 결과물은 **기계어**로 변환된 파일이며, 이 파일은 CPU가 직접 실행할 수 있는 형태이다.
    
* **오브젝트 파일 이름**은 보통 **.obj** 확장자를 가지며, 예를 들어 **test.obj**가 그 예시이다.
    

컴파일 과정은 소스 코드가 컴퓨터가 이해할 수 있는 저수준 언어로 변환되는 필수적인 단계이다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726829553760/153022f2-3d38-4c25-b1e0-7d09429973b3.png align="left")

---

**오브젝트 파일**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726829691316/46470441-c770-44be-b762-f1e7de40be0c.png align="center")

**컴파일**과 **소스 작성**은 **소프트웨어 개발 과정**의 다섯 가지 주요 단계 중 **구현(Implementation)** 단계에 포함된다.

* **소스 작성**은 개발자가 알고리즘을 프로그래밍 언어로 작성하는 단계이다. 이는 구현 과정에서 이루어진다.
    
* **컴파일**은 작성된 소스 코드를 기계어로 변환하는 과정을 뜻한다. 역시 **구현 단계**의 중요한 부분이다.
    

따라서 두 작업 모두 **구현(Implementation)** 단계에 속하며, 프로그램을 실제로 작동할 수 있는 형태로 만드는 핵심 과정에 속한다.

---

**컴파일 오류 (Compile Error)**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726829758954/4f4ffa10-543a-4e13-9846-73beec24bb8f.png align="center")

* **컴파일 오류**는 주로 **문법 오류**로 인해 발생하는 오류이다.
    
* 컴파일러가 소스 코드를 기계어로 변환할 때, 프로그래밍 언어의 문법을 제대로 지키지 않은 경우 오류가 발생한다.
    
* **예시**: "He go to school;"와 같이 문법이 잘못된 문장이 있을 경우, 프로그래밍 언어에서도 이와 같은 잘못된 구문이 오류를 발생시키게 된다.
    

컴파일 오류는 프로그램이 올바르게 실행되기 전에 수정해야 할 부분을 알려주는 중요한 경고이다.

---

**링크 (Linking)**

* **링크**는 \*\*컴파일된 목적 프로그램(object file)\*\*을 **라이브러리**와 연결하여 **실행 프로그램**을 작성하는 과정이다.
    
* **실행 파일 이름**은 보통 **.exe** 확장자를 가지며, 예를 들어 **test.exe**가 그 예시이다.
    
* \*\*라이브러리 (library)\*\*는 프로그래머들이 자주 사용하는 기능을 미리 작성해 놓은 코드 집합으로, 개발자가 다시 작성할 필요 없이 바로 사용할 수 있다.
    
    * **예시**: 입출력 기능, 파일 처리, 수학 함수 계산 등.
        
* **링크 작업**을 수행하는 프로그램을 \*\*링커(linker)\*\*라고 한다.
    

링크 과정은 프로그램이 실행 가능한 형태로 최종적으로 완성되는 단계로, 목적 파일과 라이브러리를 결합하여 실행 파일을 만든다.

---

**링크 (Linking)**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726829937560/ead024e3-2989-4c2c-81dd-91c8b079b82d.png align="center")

이 이미지는 **링크(Linking)** 과정을 설명하는 다이어그램이다.

1. **C 소스 파일**: C 언어로 작성된 소스 코드이다.
    
2. **컴파일**: C 소스 파일이 컴파일되어 **오브젝트 파일**로 변환된다.
    
3. **오브젝트 파일**: 각각의 소스 파일이 기계어로 변환된 파일다.
    
4. **라이브러리**: 이미 정의된 코드 집합으로, 프로그램에서 자주 사용하는 기능을 제공한다. 예를 들어 입출력 함수나 수학적 계산을 위한 코드가 포함된다.
    
5. **링크**: 링커(Linker)가 오브젝트 파일들과 라이브러리를 연결하여 **실행 파일**을 생성한다.
    
6. **실행 파일**: 링크가 완료된 후 생성된 실행 가능한 파일이다. 보통 **.exe** 확장자를 가진다.
    
7. **실행**: 생성된 실행 파일을 실제로 실행하여 프로그램이 동작하게 된다.
    

이 과정을 통해, 여러 소스 파일과 라이브러리가 결합되어 하나의 **실행 가능한 프로그램**이 만들어지게 된다.

---

**실행 및 디버깅(Execution and Debugging)**

![Uploaded image](https://files.oaiusercontent.com/file-g27gTPkyk8P1mnprzMEAGNs0?se=2024-09-20T11%3A06%3A15Z&sp=r&sv=2024-08-04&sr=b&rscc=max-age%3D299%2C%20immutable%2C%20private&rscd=attachment%3B%20filename%3Dimage.png&sig=S/G0%2BmNZTKBMUBww%2BTXopZJVDQTglwJ1RHJXVzRuE84%3D align="left")

이 이미지는 **실행 및 디버깅** 과정을 설명하는 다이어그램이다. 각 단계에서 발생할 수 있는 에러 유형도 포함되어 있다.

1. **소스파일 (test.c)**:
    
    * 소스 코드를 작성하는 단계이다.
        
    * \*\*컴파일러(compiler)\*\*가 이 소스 파일을 컴파일하여 **오브젝트 파일**로 변환한다.
        
    * 이 과정에서 발생할 수 있는 에러는 **컴파일 시간 에러**이다. 예를 들어 문법 오류가 있을 수 있다.
        
2. **오브젝트 파일 (test.obj)**:
    
    * 소스 코드가 컴파일되어 생성된 파일다.
        
    * \*\*링커(linker)\*\*가 오브젝트 파일과 라이브러리를 연결하여 **실행 파일**을 생성한다.
        
3. **실행파일 (test.exe)**:
    
    * 링커에 의해 생성된 실행 파일이다.
        
    * 사용자가 이 파일을 실행시켜 프로그램을 작동시킨다.
        
    * 실행 중에 발생할 수 있는 에러는 **실행 시간 에러(Runtime error)** 또는 \*\*논리 에러(logical error)\*\*이다.
        
        * **실행 시간 에러**는 프로그램이 실행되는 동안 발생하는 에러이다. 예를 들어, 파일을 찾을 수 없거나 메모리 오류가 발생할 수 있다.
            
        * **논리 에러**는 프로그램이 실행은 되지만 예상한 대로 동작하지 않는 경우이다. 예를 들어 잘못된 계산 결과가 나오는 경우가 해당된다.
            

이 과정은 소스 코드 작성에서 실행까지의 전체 흐름을 시각적으로 보여주며, 각 단계에서 발생할 수 있는 오류를 확인할 수 있게 해준다.

---

**실행 및 디버깅(Execution and Debugging)**

* **실행 시간 오류 (Runtime Error)**:
    
    * 프로그램이 실행되는 동안 발생하는 오류로, 프로그램이 갑자기 중단되거나 비정상적으로 작동하게 만든다.
        
    * **예시**:
        
        * **0으로 나누는 것**: 수학적으로 정의되지 않은 연산을 수행할 때 발생하는 오류.
            
        * **잘못된 메모리 주소에 접근하는 것**: 존재하지 않거나 잘못된 메모리 영역에 접근하려고 할 때 발생하는 오류.
            
* **논리 오류 (Logical Error)**:
    
    * 문법적으로는 오류가 없지만, 프로그램이 기대한 결과를 도출하지 못하는 경우
        
    * **예시**:
        
        * 프로그램이 의도한 대로 작동하지 않아서 잘못된 결과를 산출하는 것. 예를 들어, 덧셈을 해야 할 때 곱셈을 하는 경우.
            
        * 조건문이 잘못되어 예상과 다른 흐름으로 프로그램이 작동하는 경우.
            

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726831184494/f46c3951-d45f-440a-9c2a-1eda8da937cf.png align="center")

이 두 가지 오류는 디버깅을 통해 문제를 찾아내고 해결해야 한다. **실행 시간 오류**는 프로그램이 실행되는 도중 발생하며, **논리 오류**는 프로그램이 정상적으로 실행되지만 예상한 결과를 내지 못하는 경우이다.

---

**디버깅(Debugging)**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726831122678/323d5f7d-3765-4f91-bc50-8853aa091262.png align="center")

* **디버깅**은 **소스 코드에 존재하는 오류를 찾아 수정하는 과정**이다.
    
* 이는 프로그램이 예상대로 작동하지 않거나, 오류가 발생했을 때 이를 해결하기 위해 필수적인 과정이다.
    

디버깅을 통해 실행 시간 오류나 논리 오류를 발견하고, 프로그램의 올바른 동작을 보장한다.

---

**디버깅의 유래(Origin of Debugging)**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726831241532/34273ba5-9b66-4b97-ba30-8c906d255ca9.png align="center")

* 1945년, **마크 II 컴퓨터**가 릴레이 장치에 들어온 **나방(bug)** 때문에 고장이 발생했다. 이 사건 이후, 컴퓨터 오류를 \*\*"버그(bug)"\*\*라고 부르게 되었다.
    
* \*\*그레이스 호퍼(Grace Hopper)\*\*라는 여성 컴퓨터 과학자가 나방을 제거한 후, 이를 기록으로 남기고, 이 작업을 \*\*"디버깅(debugging)"\*\*이라고 보고했다.
    

이 사건에서 유래하여, 소프트웨어에서 발생하는 오류를 수정하는 과정을 **디버깅**이라고 부르게 되었다.

---

**소프트웨어의 유지 보수**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726831309535/def5bd28-8950-4c50-ae9b-e2608cda97e2.png align="center")

* **유지 보수가 필요한 이유**:
    
    1. **디버깅 후에도 버그**가 남아 있을 수 있기 때문이다. 모든 버그를 한 번에 수정하기 어려워, 추가적인 수정이 필요할 수 있다.
        
    2. 소프트웨어가 개발된 후 **사용자의 요구사항이 추가**될 수 있기 때문이다. 사용자의 피드백이나 변화하는 필요에 맞춰 소프트웨어를 개선해야 할 수 있다.
        
* **유지 보수 비용**은 소프트웨어 전체 비용의 **50% 이상**을 차지한다.
    

이러한 이유로 소프트웨어 유지 보수는 개발 과정에서 중요한 단계 중 하나이다.

---

## **2️⃣**비주얼 스튜디오 (Visual Studio)

**통합 개발 환경 (IDE: Integrated Development Environment)**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726831442096/5d96f787-bace-4417-a6d0-890ff315d56d.png align="center")

* **통합 개발 환경**은 **에디터 + 컴파일러 + 디버거**를 포함한 개발 도구를 하나로 통합한 소프트웨어이다.
    
* **에디터**: 코드를 작성할 수 있는 텍스트 편집기.
    
* **컴파일러**: 코드를 기계어로 변환하는 도구.
    
* **디버거**: 코드에 존재하는 오류를 찾아 수정하는 도구.
    

IDE는 개발자들이 코드를 작성, 테스트, 디버깅하는 과정을 간소화하고, 생산성을 높이기 위해 사용됩니다. 예시로는 **Visual Studio**, **Eclipse**, **IntelliJ IDEA** 등이 있다.

---

**통합 개발 환경의 예**

1. **비주얼 스튜디오 (Visual Studio)**:
    
    * 마이크로소프트(Microsoft)에서 개발한 IDE로, 다양한 프로그래밍 언어와 플랫폼을 지원한다.
        
2. **이클립스 (Eclipse)**:
    
    * **오픈 소스 프로젝트**로, Java를 비롯한 여러 언어를 지원하는 인기 있는 IDE이다.
        
3. **Dev-C++**:
    
    * **오픈 소스 프로젝트**로, C와 C++ 개발을 위한 가벼운 IDE이다.
        

이러한 IDE는 개발자들에게 코드 작성, 컴파일, 디버깅 등의 기능을 통합적으로 제공하여, 개발 효율성을 높여준다.

---

비주얼 스튜디오 버전

1. **커뮤니티 버전 (Visual Studio Community), 초급**
    
    * "기업 외 응용 프로그램 빌드 개발자를 위한 **완벽한 기능의 확장 가능한 무료 도구**"로 제공된다. 주로 개인 개발자나 소규모 오픈 소스 프로젝트에 적합하다.
        
2. **프로페셔널 버전 (Visual Studio Professional), 중급**
    
    * "**개별 개발자 또는 소규모 팀**을 위한 **전문적인 개발자 도구 및 서비스**"로 설계된 상용 버전이다. 소규모 팀을 위한 효율적인 도구와 협업 기능을 제공한다.
        
3. **엔터프라이즈 버전 (Visual Studio Enterprise)**, **고급**
    
    * "**고급 테스트** 및 **DevOps**를 포함하여 **복잡한 프로젝트**와 **대규모 개발 팀**을 위한 **엔터프라이즈급 솔루션**"으로, 모든 규모의 프로젝트에서 고급 기능을 제공하는 최상위 버전이다.
        

이러한 버전은 각기 다른 요구와 규모에 맞게 개발자들에게 다양한 기능을 제공한다.

---

비주얼 스튜디오 설치

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726832514198/3c9117e1-348f-4cde-9fa9-17c3d0426804.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726832537284/2ee4c32a-2c11-4112-a4e9-bbdf60e08408.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726832546522/51fc4b9a-fca7-4a4c-a06c-7d69c79a2120.png align="center")

**비주얼 스튜디오 시작**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726832704421/d361b5fe-1e36-4ace-b129-4c3057d4a571.png align="center")

**솔루션과 프로젝트 (Solution and Project)**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726832749761/dd99e7b0-2f12-47ea-93d2-5119a860288e.png align="center")

* **솔루션 (Solution)**:
    
    * 문제 해결에 필요한 **프로젝트들이 들어 있는 컨테이너**이다. 그릇이라고 생각하면 쉽다.
        
    * 여러 프로젝트를 하나로 묶어 관리할 수 있으며, 대규모 소프트웨어 개발에서 유용하게 사용된다.
        
* **프로젝트 (Project)**:
    
    * 하나의 **실행 파일**을 만들기 위해 필요한 여러 항목들이 들어 있는 컨테이너이다.
        
    * 프로젝트에는 소스 코드 파일, 리소스 파일, 설정 파일 등이 포함되며, 이를 통해 프로그램을 빌드할 수 있다.
        

**솔루션**은 여러 **프로젝트**를 포함할 수 있어, 복잡한 애플리케이션 개발에 필요한 구성 요소를 체계적으로 관리할 수 있는 구조이다.

---

**프로젝트 생성하기**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726834344695/e9f8e97d-4b34-4c6e-816a-3655193aca04.png align="center")

**소스 파일 생성하기**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726834352025/f92710f0-6a16-4bd6-beb0-d87ebbceb825.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726834361245/f1910271-19fe-4fb8-9ee9-169fdc64e413.png align="center")

**프로그램 입력**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726834366897/d44e226f-58d6-4f29-a452-e8294cd997aa.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726834372242/75039a46-ceba-4cd2-9140-eaeb62f13c57.png align="center")

**컴파일 하기**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726834377481/3fb0f06b-44c0-4f80-9365-dc29fed98963.png align="center")

**프로그램 실행하기(Running a program)**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726834381841/650bd0d3-0c9d-41bd-8160-6a907f1b8cf1.png align="center")

---

## **3️⃣**프로그램 설명 (Program Description)

**첫번째 프로그램의 설명**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726881875026/6a6d2af1-d4f2-4f36-ab9b-5ff9160811ee.png align="center")

`#include <stdio.h>`는 C 언어에서 사용하는 **전처리기 지시문**으로, 표준 입출력 함수들을 포함하는 `stdio.h` 헤더 파일을 프로그램에 포함하라는 의미이다. `stdio.h`는 **Standard Input Output Header**의 약자로, C 표준 라이브러리의 일부로서 기본적인 입출력 기능을 제공하는 함수들을 포함하고 있다.

주요 역할은 다음과 같다:

* `printf()` 함수: 텍스트를 화면에 출력하는 함수. 예를 들어, `printf("Hello World!");`는 "Hello World!"라는 문자열을 콘솔에 출력한다.
    
* `scanf()` 함수: 콘솔로부터 입력을 받을 때 사용하는 함수.
    
* `getchar()`, `putchar()`: 각각 문자 하나를 입력받고 출력하는 함수.
    

`#include <stdio.h>`를 사용함으로써, 프로그램에서 이러한 입출력 함수들을 자유롭게 사용할 수 있게 된다. 만약 이 헤더 파일을 포함하지 않으면, `printf()`와 같은 함수들은 정의되지 않아 오류가 발생하게 된다.

따라서 이 지시문은 C 프로그램에서 입출력 작업을 수행할 때 필수적으로 포함되어야 한다.

`int main(void) {}`는 C 언어에서 프로그램의 **시작점**을 정의하는 함수이다. C 프로그램은 항상 `main()` 함수에서 실행을 시작하며, 프로그램이 종료될 때도 이 함수에서 종료된다.

이 문법에 대한 세부 설명은 다음과 같다:

1. **int**:
    
    * `main()` 함수는 **정수(int)** 값을 반환한다. 이 반환 값은 운영체제에게 프로그램이 어떻게 종료되었는지 알려주는 역할을 한다.
        
    * 일반적으로 `0`을 반환하면 프로그램이 정상적으로 종료되었음을 의미한다. 예를 들어, `return 0;`은 성공적인 실행을 나타낸다.
        
    * 만약 오류가 발생했다면 다른 값을 반환할 수 있다.
        
2. **main()**:
    
    * `main()` 함수는 C 프로그램의 진입점이다. 이 함수는 프로그램이 실행되면 제일 먼저 호출된다.
        
    * 이 함수의 내부에 작성된 코드가 프로그램의 동작을 결정한다.
        
3. **(void)**:
    
    * `void`는 `main()` 함수가 **매개변수**를 받지 않는다는 것을 의미한다. 즉, 이 함수는 외부로부터 어떤 입력도 받지 않고 실행된다는 뜻이다.
        
    * C 표준에서 `main()` 함수는 보통 매개변수를 받을 수 있도록 정의되기도 한다. `int main(int argc, char *argv[])`와 같이 인자를 받을 수 있는 형태도 있으며, 이 경우 프로그램 실행 시 명령줄 인자를 전달받는다.
        
    * 그러나 `(void)`는 매개변수가 없을 때 사용되는 문법이다.
        
4. **{}**:
    
    * 중괄호 `{}`는 함수의 본문을 정의하는 부분이다. 중괄호 안에 들어간 코드는 함수가 호출될 때 실행된다.
        
    * 이 예시에서는 `printf("Hello World!");`라는 코드가 중괄호 안에 있어, 프로그램이 실행되면 "Hello World!"라는 문자열을 콘솔에 출력하게 된다.
        

따라서 `int main(void)`는 매개변수를 받지 않고, 정수 값을 반환하며, 프로그램의 시작점을 의미하는 함수라고 할 수 있다. 이 함수 안에 있는 코드들이 프로그램이 실행될 때 순서대로 실행된다.

---

**프로그램 === 작업 지시서**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726884012042/5568fc2b-b405-4107-ae44-8d822a058ac9.png align="center")

이 도표는 "화면에 텍스트를 출력하라"는 작업 지시가 프로그램의 `printf("Hello World!");` 명령문과 어떻게 연결되는지를 설명하고 있다.

---

작업을 적어주는 위치

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726884316292/571078d3-dbaa-406e-ae30-b5156ad2b093.png align="center")

주석 부분인 "여기다가 원하는 작업을 수행하는 문장을 적어준다."는 `main()` 함수 내부에 프로그램이 해야 할 작업을 정의해야 한다는 설명이다. 즉, 이 영역에 `printf()`와 같은 함수 호출이나, 변수 선언, 연산 등의 코드를 작성하면 그 내용이 실행된다는 것을 나타낸다.

현재는 기본적으로 `return 0;`만 작성되어 있는데, 이는 프로그램이 성공적으로 실행되었음을 의미하며, 운영체제에 반환된다. 실제로 화면에 무언가 출력하고 싶다면 이 빈 공간에 `printf()`나 다른 코드를 넣을 수 있다.

---

간략한 소스 설명

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726884352159/bcb12285-bf3e-493c-ab1f-338f4aa2e84a.png align="center")

각 주석에 대한 설명은 다음과 같다:

1. `#include <stdio.h>`:
    
    * **헤더 파일을 포함한다.**: 표준 입출력 라이브러리인 `stdio.h`를 프로그램에 포함시킨다. 이 파일은 `printf()` 같은 입출력 함수를 사용할 수 있게 해준다.
        
2. `int main(void)`:
    
    * **메인 함수 시작**: 프로그램의 시작점이 되는 함수이다. 프로그램이 실행되면 가장 먼저 호출된다.
        
3. `printf("Hello World!");`:
    
    * **화면에 "Hello World!"를 출력**: 콘솔에 "Hello World!"라는 문장을 출력하는 명령문이다.
        
4. `return 0;`:
    
    * **외부로 0값을 반환**: 프로그램이 정상적으로 종료되었음을 운영체제에 알리는 코드이다.
        
5. `}`:
    
    * **메인 함수 종료**: 메인 함수의 끝을 나타낸다. 중괄호로 함수의 시작과 끝을 구분한다.
        

---

**헤더 파일 포함**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726884646313/14f153ca-a1ea-4321-85ae-c64a77253176.png align="center")

* `#include`는 소스 코드 안에 특정 파일을 현재의 위치에 포함:
    
    * `#include`는 전처리기 지시문(preprocessor directive)으로, 프로그램에서 지정한 파일을 현재 소스 코드에 포함시킨다. 이로 인해 코드에서 다른 파일에 정의된 함수나 변수를 사용할 수 있게된다.
        
* **헤더 파일(header file): 컴파일러가 필요로 하는 정보를 가지고 있는 파일**:
    
    * 헤더 파일은 함수, 변수, 또는 상수 등의 선언이 담겨 있는 파일로, 컴파일러가 프로그램을 컴파일할 때 이 파일에 정의된 정보들을 참고한다.
        
* `stdio.h`: standard input output header file:
    
    * `stdio.h`는 C 표준 라이브러리의 입출력 관련 함수들을 정의한 파일이다. `printf()`, `scanf()` 등의 함수들이 여기에 포함되어 있다.
        
* **주의: 전처리기 지시자 문장 끝에는 세미콜론(;)을 붙이면 안 된다**:
    
    * `#include` 문장은 전처리기 지시자(preprocessor directive)이기 때문에 세미콜론을 붙이지 않는다. 세미콜론은 C 코드의 일반적인 문장 끝에 붙이지만, 전처리기 명령어에는 적용되지 X
        

---

**함수**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726885380914/27c0de47-1c44-4549-bfd1-99ca370acdec.png align="center")

1. **함수(function)**:
    
    * 특정한 작업을 수행하기 위해 작성된 독립적인 코드 블록을 의미한다. 함수는 반복적으로 사용될 수 있으며, 입력을 받아 특정한 처리를 한 후 출력을 반환하는 구조이다.
        
2. **(참고) 수학적인 함수**:
    
    * 수학적인 함수의 예시로, `y = x² + 1`이 나와 있다. 이는 수학에서 입력(독립 변수 `x`)을 받아 특정 연산을 수행한 후 결과(종속 변수 `y`)를 반환하는 수학적 함수를 나타낸다.
        
3. **프로그램 = 함수의 집합**:
    
    * 프로그램은 여러 함수들로 구성된 집합체라고 볼 수 있다. 각각의 함수는 특정 작업을 담당하며, 프로그램 전체는 이러한 함수들이 모여서 원하는 동작을 수행하게 된다.
        

이미지의 그림에서는 입력이 함수에 들어가면, 기어가 돌아가듯 함수가 입력을 처리하고, 그 결과로 출력이 나오는 과정을 시각적으로 표현하고 있다.

---

**함수의 간략한 설명**

아래 이미지는 함수의 구조를 세부적으로 나누어 각 요소가 무엇을 의미하는지 설명하고 있다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726885394087/e88cbb83-fb78-4a68-9be5-1388c685ce24.png align="center")

* **int**:
    
    * **함수의 출력 타입**: 이 함수가 반환할 값의 타입을 의미한다. `int`는 정수형 값을 반환한다는 뜻이다.
        
* **main**:
    
    * **함수의 이름**: 프로그램의 진입점이 되는 함수이다. C 프로그램은 항상 `main()` 함수에서 실행이 시작된다.
        
* **(void)**:
    
    * **함수의 입력 타입**: `void`는 이 함수가 입력 인자를 받지 않는다는 것을 나타낸다. 즉, `main()` 함수는 실행될 때 외부에서 어떤 값을 전달받지 않는다.
        
* **{ }**:
    
    * **함수의 시작**과 **끝**: 중괄호 `{`와 `}`는 함수의 범위를 나타내며, 그 안에 함수의 내용이 포함된다.
        
* **printf("Hello World!");**:
    
    * **함수의 본체**: 함수가 실행될 때 수행할 작업을 정의하는 코드이다. 여기서는 `printf()` 함수를 사용해 "Hello World!"라는 메시지를 출력한다.
        
* **return 0;**:
    
    * 프로그램이 성공적으로 실행되었음을 운영체제에 알려주는 값으로, 함수의 종료 시 반환된다.
        

---

**문장(명령문)**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726885573359/1cd4b124-7547-4cd2-a522-cb3ed8ce3bdb.png align="center")

1. **함수는 여러 개의 문장으로 이루어진다.**
    
    * 함수는 특정 작업을 수행하는 코드 블록이다. 이 함수는 여러 개의 명령문(문장)으로 구성될 수 있으며, 각각의 문장은 특정한 동작을 수행한다.
        
2. **문장들은 순차적으로 실행된다.**
    
    * 함수 내의 명령문들은 위에서 아래로 차례대로 실행된다. 코드의 실행 순서는 명령문이 작성된 순서에 따른다.
        
3. **문장의 끝에는 반드시 ;이 있어야 한다.**
    
    * C 언어에서 명령문이 끝났다는 것을 알리기 위해서 문장 끝에 **세미콜론(;)**을 붙여야 한다. 세미콜론은 컴파일러가 명령문의 종료를 인식하도록 해준다.
        
    * 예: `printf("Hello World!");`에서 `;`는 문장의 끝을 나타낸다다.
        

이 규칙들은 C 언어에서 매우 중요한 기본 개념들로, 문법을 올바르게 사용하기 위해 반드시 기억해야 한다.

---

**printf() 호출**

아래 설명은 C 프로그램에서 가장 기본적인 출력 함수인 `printf()`의 사용 방법을 시각적으로 설명하고 있다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726885630270/003f9497-1a9f-4268-b655-8ff10deff9cb.png align="center")

1. `printf()`는 컴파일러가 제공하는 함수로서 출력을 담당한다:
    
    * `printf()` 함수는 C 표준 라이브러리의 함수로, 화면에 문자열이나 다른 데이터 형식의 값을 출력하는 역할을 한다. print function에서 따온 printf이다.
        
2. **큰따옴표 안의 문자열이 화면에 출력된다**:
    
    * `printf("Hello World!");`에서 큰따옴표 안의 `"Hello World!"`라는 문자열이 출력된다. 이 경우, "Hello World!"가 화면에 표시되며, 이미지에서는 모니터 화면에 출력된 예시가 보여지고 있다.
        

---

**함수의 반환값(Return value of a function0**

이 설명은 함수가 실행을 완료하고 결과를 반환하는 과정을 간단히 보여주고 있다.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726885691343/693e9824-dc2f-4e86-b5bf-8d4f6039d365.png align="center")

1. `return`은 함수의 결과값을 외부로 반환:
    
    * `return` 문은 함수의 실행을 종료하고, 그 함수가 계산한 결과값을 호출한 곳으로 돌준다. 여기서는 `main()` 함수가 종료될 때 0을 반환하고 있다.
        
2. **반환값은 0**:
    
    * `return 0;`에서 `0`은 반환되는 값이다. C 언어에서 `main()` 함수가 `0`을 반환하면 프로그램이 정상적으로 종료되었음을 의미한다.
        

---

응용 프로그램 #1

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726885804363/c059e49a-20c6-492a-be91-7d54722d84a9.png align="center")

---

**첫번째**

```python
#include <stdio.h>
int main(void) {    // 메인 함수 시작
    printf("Hello World!");  // 화면에 "Hello World!"를 출력
    printf("Kim ChulSoo"); 
    return 0;  // 외부로 0값을 반환
}  // 메인 함수 종료
```

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726885929987/35445153-4825-47ad-89ca-861651a90692.png align="center")

> 위의 코드 결과를 보면 헬로 월드와 김철수가 붙어 있으므로 줄을 바꾸는 문자를 추가해야 한다.

---

**줄바꿈 문자(newline character)**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726886052348/f705baf9-75af-4fdf-aa78-e87693ab7e03.png align="center")

1. **줄바꿈 문자인** `\n`은 화면에서 커서를 다음 줄로 이동하게 한다.
    
    * 첫 번째 예시에서는 `printf("Hello World!");`를 사용하여 "Hello World!"를 출력합니다. 이 경우, 출력 후 커서는 같은 줄에 머무르게 된다.
        
    * 두 번째 예시에서는 `printf("Hello World!\n");`를 사용하여 "Hello World!"를 출력하고, `\n`이 줄바꿈을 수행하여 커서를 다음 줄로 이동시킨다. 다음에 출력되는 내용은 이 줄바꿈 후 위치에서 시작된다.
        

**설명**:

* 첫 번째 모니터에서는 "Hello World!" 출력 후 커서가 같은 줄에 남아있다.
    
* 두 번째 모니터에서는 "Hello World!" 출력 후, 줄바꿈이 발생하여 커서가 그다음 줄의 첫 번째 위치로 이동한 것을 볼 수 있다.
    

---

**변경된 프로그램**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726886070167/d2f09ec8-3389-4270-bba0-9f764660ae10.png align="center")

---

**중간 점검**

**Lab: 간단한 계산을 해보자**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726896084861/379d1c85-5428-4d0d-a799-8b924d08ffdc.png align="center")

**Solution**

```c
#include <stdio.h> 
int main(void) {    
    printf("결과값=%d\n", 2+5);
    printf("결과값=%d\n", 1-2);
    printf("결과값=%d\n", 2*3);
    printf("결과값=%d\n", 2/10);  
    return 0; 
}
```

---

**Lab: 구구단을 출력해보자**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726897553095/72a3f937-883b-4619-9ffa-dd9e039f8aa0.png align="center")

**Solution**

```c
#include <stdio.h> 
int main(void) {    
    printf("9 X 1 =%d\n", 9*1);
    printf("9 X 2 =%d\n", 9*2);
    printf("9 X 3 =%d\n", 9*3);
    printf("9 X 4 =%d\n", 9*4);  
    printf("9 X 5 =%d\n", 9*5);  
    return 0; 
}
```

---

**오류 수정 및 디버깅**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726898431289/424e6e08-eea7-4a5b-8950-78bcfbcfe1b8.png align="center")

1. **컴파일이나 실행 시에 오류가 발생할 수 있다.**
    
    * 프로그램을 작성한 후, 컴파일할 때 또는 실행할 때 오류가 발생할 수 있다. 이 오류는 프로그램이 제대로 동작하지 못하게 하는 원인이 된다.
        
2. **에러와 경고**
    
    * 컴파일러는 코드를 검사할 때 **에러(error)**와 **경고(warning)**를 표시할 수 있다.
        
3. **에러(error): 심각한 오류**
    
    * **에러**는 프로그램이 실행되지 못하게 하는 **심각한 문제**이다. 이 오류가 있으면 컴파일이 중단되고 프로그램이 실행되지 않는다. 꼭 디버깅을 해야한다.
        
    * 예: 구문 오류(syntax error), 정의되지 않은 변수 사용 등.
        
4. **경고(warning): 경미한 오류**
    
    * **경고**는 프로그램이 실행될 수는 있지만, 잠재적으로 문제가 있을 수 있다는 **경미한 오류**이다. 경고를 무시할 수 있지만, 프로그램의 안정성을 위해 주의 깊게 검토하는 것이 좋다.
        
    * 예: 선언된 변수 사용 안 함, 자료형 간 부적절한 변환 등.
        

에러는 반드시 해결해야 하며, 경고도 프로그램의 정확한 동작을 위해 수정하는 것이 바람직다. **디버깅**은 이러한 에러와 경고를 찾아서 수정하는 과정을 의미한다.

---

**오류의 종류**

1. **컴파일 시간 오류**:
    
    * 컴파일러가 코드를 컴파일할 때 발생하는 오류로, **대부분 문법적인 오류**이다. 컴파일 시간 오류가 발생하면 프로그램이 실행되지 않는다.
        
    * 예: 세미콜론(;)을 빼먹거나, 괄호의 짝이 맞지 않는 경우.
        
    
    **예시**:
    
    ```c
    cCopy codeint main(void) {
        printf("Hello World!"  // 세미콜론 누락
    }
    ```
    
    이 경우, 세미콜론이 빠져있어 컴파일 시간 오류가 발생한다.
    
2. **실행 시간 오류**:
    
    * 프로그램이 **실행 중에 발생하는 오류**이다. 이 오류는 컴파일 단계에서는 발생하지 않고, 프로그램이 실행되는 도중에 나타난다. 대표적으로 0으로 나누는 연산과 같은 오류가 있다.
        
    * 예: 배열의 크기를 초과하는 인덱스 접근, 0으로 나누기.
        
    
    **예시**:
    
    ```c
    cCopy codeint main(void) {
        int a = 5, b = 0;
        printf("%d", a / b);  // 실행 시간 오류: 0으로 나누기
    }
    ```
    
3. **논리 오류**:
    
    * 프로그램이 문법적으로는 문제가 없고 실행도 되지만, **의도한 결과와 다르게 동작**하는 오류이다. 이 오류는 코드의 논리적 결함 때문에 발생하며, 컴파일러나 런타임에서 자동으로 탐지되지 않는다.
        
    * 예: 덧셈을 해야 하는데 실수로 곱셈을 하는 경우.
        
    
    **예시**:
    
    ```c
    cCopy codeint main(void) {
        int a = 5, b = 10;
        int result = a * b;  // 의도는 더하기인데, 곱셈으로 잘못 작성됨
        printf("%d", result);
    }
    ```
    

이 세 가지 오류는 프로그램 작성 시 발생할 수 있으며, 각각의 오류를 적절히 수정하는 것이 필요하다. **컴파일 시간 오류**는 컴파일러가 잡아주지만, **실행 시간 오류**와 **논리 오류**는 디버깅을 통해 찾아야 한다.

---

**오류 수정 과정**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726898568591/b4b76a3e-eb7f-44c4-90b6-106729bb7f31.png align="center")

위 이미지는 프로그램이 소스 파일에서 실행 파일로 변환되는 과정을 설명하고 있으며, 그 과정에서 발생할 수 있는 오류를 보여준다.

1. **소스 파일 (test.c)**:
    
    * 프로그래머가 작성한 C 코드가 저장된 파일.
        
    * 이 파일은 **컴파일러(compiler)**에 의해 처리된다.
        
2. **오브젝트 파일 (test.obj)**:
    
    * 컴파일러는 소스 코드를 **오브젝트 파일**로 변환한다. 이 과정에서 **컴파일 시간 오류**가 발생할 수 있다.
        
    * 예를 들어, 문법 오류가 있으면 컴파일러가 에러를 출력하고, 오브젝트 파일이 제대로 생성되지 않을 수 있다.
        
3. **실행 파일 (test.exe)**:
    
    * 오브젝트 파일은 **링커(linker)**에 의해 실행 가능한 파일로 변환된다.
        
    * 링킹 과정에서 파일을 결합할 때 오류가 발생할 수 있다. 이 과정이 성공하면 실행 가능한 프로그램 파일이 만들어진다.
        
4. **실행 (execution)**:
    
    * 실행 파일이 생성되면 **실행 단계**로 넘어간다. 이때 프로그램이 실제로 동작하게 된다.
        
    * 실행 중에는 **실행 시간 오류**나 **논리 오류**가 발생할 수 있다. 예를 들어, 0으로 나누는 연산이 있을 때 실행 중 오류가 발생하거나, 논리 오류로 인해 의도한 결과가 나오지 않을 수 있다.
        

이미지의 흐름에서 컴파일 시간 오류는 소스 코드에서 오브젝트 파일을 생성할 때 발생하고, 실행 시간 오류와 논리 오류는 실행 파일이 실제로 실행될 때 발생하는 것을 시각적으로 보여주고 있다.

---

오류 #1

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726899670519/e0e8b548-bcbf-44ac-9ff7-d3ae8ceed9e9.png align="center")

1. **코드에서 발생한 오류**:
    
    * 코드 상에 `return` 앞에 세미콜론(;)이 빠졌다는 오류가 발생했다. 이는 C 언어에서 문장의 끝을 알리기 위한 필수적인 구문이므로, 세미콜론이 없으면 컴파일 오류가 발생한다.
        
2. **오류가 발생한 위치**:
    
    * 코드에서 6번째 줄에 오류가 발생한 것을 확인할 수 있다. **오류가 발견된 소스 파일**과 **오류가 발생한 줄 번호(6번 줄)**이 하단의 오류 목록 창에 표시되어 있다.
        
3. **오류 메시지**:
    
    * 하단 오류 목록 창에는 `C2143` 오류 코드와 함께 **구문 오류**임을 알리는 메시지가 있다. 여기서는 세미콜론(;)이 필요하다는 메시지를 통해 정확한 오류를 알리고 있다.
        
4. **수정 필요 사항**:
    
    * `return 0;`에서 세미콜론이 빠져 있기 때문에, 해당 구문 뒤에 세미콜론을 추가하면 오류가 해결된다.
        

Visual Studio와 같은 IDE는 이러한 방식으로 코드 내에서 발생한 오류를 실시간으로 감지하고, 오류가 발생한 파일과 줄 번호를 명확하게 표시해 준다. 이를 통해 개발자는 빠르게 오류를 수정할 수 있게 된다.

---

오류 #2

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726899880522/234b639e-5d71-4755-9f52-ac31b92adcee.png align="center")

---

오류 #3

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726901026094/952d5eef-3db9-492a-bea8-05feb5972f41.png align="center")

---

논리 오류

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726901046243/9a0ab1c1-79c5-4ba6-9bf5-d758ec93f5af.png align="center")

**논리 오류가 존재하는 프로그램**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726901078492/44b3746d-fd40-469d-b07b-f052a63d2cba.png align="center")

**논리 오류가 수정된 프로그램**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726901087300/f8bfb7af-aa4f-4b0f-a2f5-958b629dfc7f.png align="center")

* 각 줄마다 \\n을 붙여서 줄을 바꿔준다.
    

**디버깅(Debugging)**

* * 디버깅은 **논리 오류**나 **실행 오류**를 찾아내고 수정하는 과정이다. 프로그램이 컴파일되고 실행되지만, 의도한 대로 동작하지 않을 때 디버깅을 통해 문제의 원인을 분석하고 해결할 수 있다.
        

**디버거(Debugger)**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726901375451/e8aec6f3-bdb4-4d76-9a8b-c6be5159724a.png align="center")

1. **디버거**:
    
    * 디버거는 **프로그램을 한 문장씩 실행하면서** 오류의 원인을 찾아내는 도구이다. 이를 통해 개발자는 프로그램의 흐름을 한 단계씩 추적하고, 변수의 값이나 조건문의 상태를 실시간으로 확인할 수 있다.
        
2. **디버거의 역할**:
    
    * 프로그램을 **단계별로 실행**할 수 있어, 특정 부분에서 발생하는 문제를 쉽게 추적할 수 있다.
        
    * **변수의 값**을 중간에 확인하거나 변경할 수 있다.
        
    * **중단점(브레이크포인트, breakpoint)**을 설정하여, 특정 지점에서 프로그램이 일시 중단되도록 할 수 있다.
        
    * 디버거는 논리 오류나 실행 오류의 원인을 찾는 데 매우 유용한 도구이다.
        

**예시**: Visual Studio, GDB, Xcode와 같은 개발 도구에 포함된 디버거는 프로그램이 실행되는 도중에 중단점을 설정하고, 코드를 한 줄씩 실행하며 오류를 추적하는 기능을 제공한다.

**디버거 명령어 정의**

디버거의 실행**F5 (Go): 실행**

* 프로그램을 **전체 실행**하는 명령어이다. 설정된 중단점(브레이크포인트)까지 실행이 진행된다. 중단점이 없으면 프로그램이 끝까지 실행된다.
    

1. **F10 (Step Over): 한 문장씩 실행 (함수도 하나의 문장 취급)**
    
    * 현재 문장을 **한 단계씩 실행**하지만, 함수 호출을 만나면 함수의 세부 내용을 들어가지 않고, 함수 전체를 **하나의 문장**으로 처리해 실행 후 다음 문장으로 넘어간다.
        
2. **F11 (Step Into): 한 문장씩 실행 (함수 안으로 진입)**
    
    * 현재 문장을 **한 단계씩 실행**하며, 함수 호출을 만나면 그 **함수 내부로 진입**해 함수 내부 코드도 한 단계씩 실행한다. 함수 내부의 동작을 추적하고 싶을 때 사용한다.
        
3. **F9 (Breakpoint): 현재 문장에 중단점을 설정**
    
    * 디버거에서 **중단점(Breakpoint)**을 설정하는 명령어이다. 중단점을 설정한 곳에서 프로그램이 일시 정지되어, 해당 지점까지의 상태를 확인하고 디버깅할 수 있다.
        

이 명령어들은 프로그램의 실행을 제어하고, 오류를 찾는 데 매우 유용한 도구이다. 디버깅할 때 각각의 명령어를 적절히 사용하여 프로그램 흐름을 파악하고, 문제를 해결할 수 있다.

---

**디버거의 실행 과정**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726901513629/ec581e96-bb73-4eb9-bc90-40fdaf76535d.png align="center")

이 이미지는 Visual Studio에서 디버깅 과정 중 **F10 (Step Over)** 명령을 사용하여 한 문장씩 프로그램을 실행하는 예시를 보여주고 있다.

1. **첫 번째 이미지**:
    
    * 디버깅이 시작된 상태이다. `F10` 키를 누르면 첫 번째 명령문인 `printf("Hello World!\n");`이 실행될 준비가 되어 있다.
        
    * 현재 디버거는 첫 번째 명령문을 실행하기 직전이다.
        
2. **두 번째 이미지**:
    
    * `F10` 키를 눌러 첫 번째 명령문이 실행되었다. 결과적으로 콘솔 창에 **"Hello World!"**가 출력된다.
        
    * 이제 두 번째 명령문 `printf("Good Morning!\n");`이 실행될 준비가 된 상태이다.
        
3. **세 번째 이미지**:
    
    * 다시 `F10` 키를 눌러 두 번째 명령문도 실행되었다. 이로 인해 콘솔 창에 **"Good Morning!"**이 추가로 출력되었다.
        
    * 모든 명령문이 실행된 후 프로그램이 종료되었다.
        

### 요약:

* **F10 (Step Over)**: 한 문장씩 실행하며, 함수가 있을 경우 함수의 세부 내용을 실행하지 않고 넘어간다. 여기서는 각 `printf` 문을 순차적으로 실행하면서 프로그램의 실행 과정을 추적하고 있다.
    
* 디버거를 통해 이렇게 프로그램의 실행 흐름을 한 단계씩 확인하며, 오류를 추적할 수 있다.
    

---

**참고사항: 디버거 기능**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726901670413/fe8df266-1db6-4a7f-b96e-cc5d64302c0d.png align="center")

> 중급 단계부터 숙지해 놓으면 더욱 유용하다.

---

**Mini Project**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726901707449/d34e22cd-27af-484a-8899-d2a4cabcf31e.png align="center")

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726901937141/e452739b-6854-4613-b521-a61b23307a3d.png align="center")

---

**학습 정리**

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1726901953989/8e5cb749-210b-4f45-9c83-ed04f440bfd7.png align="center")
