Program development concept and Visual Studio
프로그램 개발 개념과 비주얼 스튜디오, 프로그램 설명

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

이 이미지는 소프트웨어 개발 과정을 다섯 가지 주요 단계로 보여줍니다:
요구사항 분석(Requirements Analysis)
무엇을 만들 것인지 결정한다.
프로젝트에 필요한 요구사항을 이해하고 수집한다.
설계(Design)
알고리즘을 설계한다.
프로그램의 구조를 설계하여 구현의 기초로 사용한다.
구현(Implementation)
개발 도구를 사용하여 소스 코드를 작성한다.
설계를 실제 코드로 구현하는 단계이다. (C, Python, C++ 등으로 구현)
테스팅(Testing)
여러 가지 경우에 대하여 프로그램을 실행해본다.
프로그램이 예상대로 작동하는지 확인하고, 오류를 수정한다.
유지보수(Maintenance)
사용자의 추가 요구사항을 반영한다.
피드백이나 새로운 요구에 따라 프로그램을 유지하고 업데이트한다.
이 과정은 소프트웨어를 개발하는 일반적인 단계로, 초기 구상부터 완성된 제품의 유지보수까지를 포함한다.
설계(Design)

문제를 해결하는 알고리즘을 개발하는 단계이다.
순서도와 의사 코드를 도구로 사용하여 알고리즘을 시각적으로 또는 논리적으로 표현한다.
알고리즘은 프로그래밍 언어와 무관하며, 특정 언어에 종속되지 않고 개념적으로 작성된다.
알고리즘은 원하는 결과를 얻기 위해 따라야 하는 단계에 집중하여, 문제 해결의 절차와 흐름에 초점을 맞춘다.
즉, 설계 단계는 프로그램이 어떤 절차를 통해 문제를 해결할지 구체적인 계획을 세우는 단계로, 이후 코딩의 기초가 된다.
구현(Implementation) 1#: 소스 작성(Source Code Writing)
알고리즘의 각 단계를 프로그래밍 언어를 이용하여 기술하는 과정이다.
알고리즘을 프로그래밍 언어의 문법에 맞추어 작성한 것을 **소스 프로그램 (source program)**이라고 한다.
소스 프로그램은 주로 텍스트 에디터나 **통합 개발 환경(IDE)**을 이용하여 작성된다.
소스 파일 이름은 일반적으로 프로그램의 확장자를 포함하며, 예를 들어 test.c는 C 언어로 작성된 소스 파일이다.
소스 작성은 알고리즘을 구체적인 코드로 변환하는 단계로, 소스 프로그램은 컴파일러에 의해 기계어로 변환되어 실행되게 된다.

구현(Implementation) 2#: 컴파일(Compile)
소스 프로그램을 오브젝트 파일로 변환하는 작업이다.
컴파일된 결과물은 기계어로 변환된 파일이며, 이 파일은 CPU가 직접 실행할 수 있는 형태이다.
오브젝트 파일 이름은 보통 .obj 확장자를 가지며, 예를 들어 test.obj가 그 예시이다.
컴파일 과정은 소스 코드가 컴퓨터가 이해할 수 있는 저수준 언어로 변환되는 필수적인 단계이다.

오브젝트 파일

컴파일과 소스 작성은 소프트웨어 개발 과정의 다섯 가지 주요 단계 중 구현(Implementation) 단계에 포함된다.
소스 작성은 개발자가 알고리즘을 프로그래밍 언어로 작성하는 단계이다. 이는 구현 과정에서 이루어진다.
컴파일은 작성된 소스 코드를 기계어로 변환하는 과정을 뜻한다. 역시 구현 단계의 중요한 부분이다.
따라서 두 작업 모두 구현(Implementation) 단계에 속하며, 프로그램을 실제로 작동할 수 있는 형태로 만드는 핵심 과정에 속한다.
컴파일 오류 (Compile Error)

컴파일 오류는 주로 문법 오류로 인해 발생하는 오류이다.
컴파일러가 소스 코드를 기계어로 변환할 때, 프로그래밍 언어의 문법을 제대로 지키지 않은 경우 오류가 발생한다.
예시: "He go to school;"와 같이 문법이 잘못된 문장이 있을 경우, 프로그래밍 언어에서도 이와 같은 잘못된 구문이 오류를 발생시키게 된다.
컴파일 오류는 프로그램이 올바르게 실행되기 전에 수정해야 할 부분을 알려주는 중요한 경고이다.
링크 (Linking)
링크는 **컴파일된 목적 프로그램(object file)**을 라이브러리와 연결하여 실행 프로그램을 작성하는 과정이다.
실행 파일 이름은 보통 .exe 확장자를 가지며, 예를 들어 test.exe가 그 예시이다.
**라이브러리 (library)**는 프로그래머들이 자주 사용하는 기능을 미리 작성해 놓은 코드 집합으로, 개발자가 다시 작성할 필요 없이 바로 사용할 수 있다.
- 예시: 입출력 기능, 파일 처리, 수학 함수 계산 등.
링크 작업을 수행하는 프로그램을 **링커(linker)**라고 한다.
링크 과정은 프로그램이 실행 가능한 형태로 최종적으로 완성되는 단계로, 목적 파일과 라이브러리를 결합하여 실행 파일을 만든다.
링크 (Linking)

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

이 이미지는 실행 및 디버깅 과정을 설명하는 다이어그램이다. 각 단계에서 발생할 수 있는 에러 유형도 포함되어 있다.
소스파일 (test.c):
소스 코드를 작성하는 단계이다.
**컴파일러(compiler)**가 이 소스 파일을 컴파일하여 오브젝트 파일로 변환한다.
이 과정에서 발생할 수 있는 에러는 컴파일 시간 에러이다. 예를 들어 문법 오류가 있을 수 있다.
오브젝트 파일 (test.obj):
소스 코드가 컴파일되어 생성된 파일다.
**링커(linker)**가 오브젝트 파일과 라이브러리를 연결하여 실행 파일을 생성한다.
실행파일 (test.exe):
링커에 의해 생성된 실행 파일이다.
사용자가 이 파일을 실행시켜 프로그램을 작동시킨다.
실행 중에 발생할 수 있는 에러는 실행 시간 에러(Runtime error) 또는 **논리 에러(logical error)**이다.
실행 시간 에러는 프로그램이 실행되는 동안 발생하는 에러이다. 예를 들어, 파일을 찾을 수 없거나 메모리 오류가 발생할 수 있다.
논리 에러는 프로그램이 실행은 되지만 예상한 대로 동작하지 않는 경우이다. 예를 들어 잘못된 계산 결과가 나오는 경우가 해당된다.
이 과정은 소스 코드 작성에서 실행까지의 전체 흐름을 시각적으로 보여주며, 각 단계에서 발생할 수 있는 오류를 확인할 수 있게 해준다.
실행 및 디버깅(Execution and Debugging)
실행 시간 오류 (Runtime Error):
프로그램이 실행되는 동안 발생하는 오류로, 프로그램이 갑자기 중단되거나 비정상적으로 작동하게 만든다.
예시:
0으로 나누는 것: 수학적으로 정의되지 않은 연산을 수행할 때 발생하는 오류.
잘못된 메모리 주소에 접근하는 것: 존재하지 않거나 잘못된 메모리 영역에 접근하려고 할 때 발생하는 오류.
논리 오류 (Logical Error):
문법적으로는 오류가 없지만, 프로그램이 기대한 결과를 도출하지 못하는 경우
예시:
프로그램이 의도한 대로 작동하지 않아서 잘못된 결과를 산출하는 것. 예를 들어, 덧셈을 해야 할 때 곱셈을 하는 경우.
조건문이 잘못되어 예상과 다른 흐름으로 프로그램이 작동하는 경우.

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

디버깅은 소스 코드에 존재하는 오류를 찾아 수정하는 과정이다.
이는 프로그램이 예상대로 작동하지 않거나, 오류가 발생했을 때 이를 해결하기 위해 필수적인 과정이다.
디버깅을 통해 실행 시간 오류나 논리 오류를 발견하고, 프로그램의 올바른 동작을 보장한다.
디버깅의 유래(Origin of Debugging)

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

유지 보수가 필요한 이유:
디버깅 후에도 버그가 남아 있을 수 있기 때문이다. 모든 버그를 한 번에 수정하기 어려워, 추가적인 수정이 필요할 수 있다.
소프트웨어가 개발된 후 사용자의 요구사항이 추가될 수 있기 때문이다. 사용자의 피드백이나 변화하는 필요에 맞춰 소프트웨어를 개선해야 할 수 있다.
유지 보수 비용은 소프트웨어 전체 비용의 50% 이상을 차지한다.
이러한 이유로 소프트웨어 유지 보수는 개발 과정에서 중요한 단계 중 하나이다.
2️⃣비주얼 스튜디오 (Visual Studio)
통합 개발 환경 (IDE: Integrated Development Environment)

통합 개발 환경은 에디터 + 컴파일러 + 디버거를 포함한 개발 도구를 하나로 통합한 소프트웨어이다.
에디터: 코드를 작성할 수 있는 텍스트 편집기.
컴파일러: 코드를 기계어로 변환하는 도구.
디버거: 코드에 존재하는 오류를 찾아 수정하는 도구.
IDE는 개발자들이 코드를 작성, 테스트, 디버깅하는 과정을 간소화하고, 생산성을 높이기 위해 사용됩니다. 예시로는 Visual Studio, Eclipse, IntelliJ IDEA 등이 있다.
통합 개발 환경의 예
비주얼 스튜디오 (Visual Studio):
- 마이크로소프트(Microsoft)에서 개발한 IDE로, 다양한 프로그래밍 언어와 플랫폼을 지원한다.
이클립스 (Eclipse):
- 오픈 소스 프로젝트로, Java를 비롯한 여러 언어를 지원하는 인기 있는 IDE이다.
Dev-C++:
- 오픈 소스 프로젝트로, C와 C++ 개발을 위한 가벼운 IDE이다.
이러한 IDE는 개발자들에게 코드 작성, 컴파일, 디버깅 등의 기능을 통합적으로 제공하여, 개발 효율성을 높여준다.
비주얼 스튜디오 버전
커뮤니티 버전 (Visual Studio Community), 초급
- "기업 외 응용 프로그램 빌드 개발자를 위한 완벽한 기능의 확장 가능한 무료 도구"로 제공된다. 주로 개인 개발자나 소규모 오픈 소스 프로젝트에 적합하다.
프로페셔널 버전 (Visual Studio Professional), 중급
- "개별 개발자 또는 소규모 팀을 위한 전문적인 개발자 도구 및 서비스"로 설계된 상용 버전이다. 소규모 팀을 위한 효율적인 도구와 협업 기능을 제공한다.
엔터프라이즈 버전 (Visual Studio Enterprise), 고급
- "고급 테스트 및 DevOps를 포함하여 복잡한 프로젝트와 대규모 개발 팀을 위한 엔터프라이즈급 솔루션"으로, 모든 규모의 프로젝트에서 고급 기능을 제공하는 최상위 버전이다.
이러한 버전은 각기 다른 요구와 규모에 맞게 개발자들에게 다양한 기능을 제공한다.
비주얼 스튜디오 설치



비주얼 스튜디오 시작

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

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

소스 파일 생성하기


프로그램 입력


컴파일 하기

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

3️⃣프로그램 설명 (Program Description)
첫번째 프로그램의 설명

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

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

주석 부분인 "여기다가 원하는 작업을 수행하는 문장을 적어준다."는 main() 함수 내부에 프로그램이 해야 할 작업을 정의해야 한다는 설명이다. 즉, 이 영역에 printf()와 같은 함수 호출이나, 변수 선언, 연산 등의 코드를 작성하면 그 내용이 실행된다는 것을 나타낸다.
현재는 기본적으로 return 0;만 작성되어 있는데, 이는 프로그램이 성공적으로 실행되었음을 의미하며, 운영체제에 반환된다. 실제로 화면에 무언가 출력하고 싶다면 이 빈 공간에 printf()나 다른 코드를 넣을 수 있다.
간략한 소스 설명

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

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

함수(function):
- 특정한 작업을 수행하기 위해 작성된 독립적인 코드 블록을 의미한다. 함수는 반복적으로 사용될 수 있으며, 입력을 받아 특정한 처리를 한 후 출력을 반환하는 구조이다.
(참고) 수학적인 함수:
- 수학적인 함수의 예시로,
y = x² + 1이 나와 있다. 이는 수학에서 입력(독립 변수x)을 받아 특정 연산을 수행한 후 결과(종속 변수y)를 반환하는 수학적 함수를 나타낸다.
- 수학적인 함수의 예시로,
프로그램 = 함수의 집합:
- 프로그램은 여러 함수들로 구성된 집합체라고 볼 수 있다. 각각의 함수는 특정 작업을 담당하며, 프로그램 전체는 이러한 함수들이 모여서 원하는 동작을 수행하게 된다.
이미지의 그림에서는 입력이 함수에 들어가면, 기어가 돌아가듯 함수가 입력을 처리하고, 그 결과로 출력이 나오는 과정을 시각적으로 표현하고 있다.
함수의 간략한 설명
아래 이미지는 함수의 구조를 세부적으로 나누어 각 요소가 무엇을 의미하는지 설명하고 있다.

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

함수는 여러 개의 문장으로 이루어진다.
- 함수는 특정 작업을 수행하는 코드 블록이다. 이 함수는 여러 개의 명령문(문장)으로 구성될 수 있으며, 각각의 문장은 특정한 동작을 수행한다.
문장들은 순차적으로 실행된다.
- 함수 내의 명령문들은 위에서 아래로 차례대로 실행된다. 코드의 실행 순서는 명령문이 작성된 순서에 따른다.
문장의 끝에는 반드시 ;이 있어야 한다.
C 언어에서 명령문이 끝났다는 것을 알리기 위해서 문장 끝에 세미콜론(;)을 붙여야 한다. 세미콜론은 컴파일러가 명령문의 종료를 인식하도록 해준다.
예:
printf("Hello World!");에서;는 문장의 끝을 나타낸다다.
이 규칙들은 C 언어에서 매우 중요한 기본 개념들로, 문법을 올바르게 사용하기 위해 반드시 기억해야 한다.
printf() 호출
아래 설명은 C 프로그램에서 가장 기본적인 출력 함수인 printf()의 사용 방법을 시각적으로 설명하고 있다.

printf()는 컴파일러가 제공하는 함수로서 출력을 담당한다:printf()함수는 C 표준 라이브러리의 함수로, 화면에 문자열이나 다른 데이터 형식의 값을 출력하는 역할을 한다. print function에서 따온 printf이다.
큰따옴표 안의 문자열이 화면에 출력된다:
printf("Hello World!");에서 큰따옴표 안의"Hello World!"라는 문자열이 출력된다. 이 경우, "Hello World!"가 화면에 표시되며, 이미지에서는 모니터 화면에 출력된 예시가 보여지고 있다.
함수의 반환값(Return value of a function0
이 설명은 함수가 실행을 완료하고 결과를 반환하는 과정을 간단히 보여주고 있다.

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

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

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

줄바꿈 문자인
\n은 화면에서 커서를 다음 줄로 이동하게 한다.첫 번째 예시에서는
printf("Hello World!");를 사용하여 "Hello World!"를 출력합니다. 이 경우, 출력 후 커서는 같은 줄에 머무르게 된다.두 번째 예시에서는
printf("Hello World!\n");를 사용하여 "Hello World!"를 출력하고,\n이 줄바꿈을 수행하여 커서를 다음 줄로 이동시킨다. 다음에 출력되는 내용은 이 줄바꿈 후 위치에서 시작된다.
설명:
첫 번째 모니터에서는 "Hello World!" 출력 후 커서가 같은 줄에 남아있다.
두 번째 모니터에서는 "Hello World!" 출력 후, 줄바꿈이 발생하여 커서가 그다음 줄의 첫 번째 위치로 이동한 것을 볼 수 있다.
변경된 프로그램

중간 점검
Lab: 간단한 계산을 해보자

Solution
#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: 구구단을 출력해보자

Solution
#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;
}
오류 수정 및 디버깅

컴파일이나 실행 시에 오류가 발생할 수 있다.
- 프로그램을 작성한 후, 컴파일할 때 또는 실행할 때 오류가 발생할 수 있다. 이 오류는 프로그램이 제대로 동작하지 못하게 하는 원인이 된다.
에러와 경고
- 컴파일러는 코드를 검사할 때 에러(error)와 경고(warning)를 표시할 수 있다.
에러(error): 심각한 오류
에러는 프로그램이 실행되지 못하게 하는 심각한 문제이다. 이 오류가 있으면 컴파일이 중단되고 프로그램이 실행되지 않는다. 꼭 디버깅을 해야한다.
예: 구문 오류(syntax error), 정의되지 않은 변수 사용 등.
경고(warning): 경미한 오류
경고는 프로그램이 실행될 수는 있지만, 잠재적으로 문제가 있을 수 있다는 경미한 오류이다. 경고를 무시할 수 있지만, 프로그램의 안정성을 위해 주의 깊게 검토하는 것이 좋다.
예: 선언된 변수 사용 안 함, 자료형 간 부적절한 변환 등.
에러는 반드시 해결해야 하며, 경고도 프로그램의 정확한 동작을 위해 수정하는 것이 바람직다. 디버깅은 이러한 에러와 경고를 찾아서 수정하는 과정을 의미한다.
오류의 종류
컴파일 시간 오류:
컴파일러가 코드를 컴파일할 때 발생하는 오류로, 대부분 문법적인 오류이다. 컴파일 시간 오류가 발생하면 프로그램이 실행되지 않는다.
예: 세미콜론(;)을 빼먹거나, 괄호의 짝이 맞지 않는 경우.
예시:
cCopy codeint main(void) {
printf("Hello World!" // 세미콜론 누락
}
이 경우, 세미콜론이 빠져있어 컴파일 시간 오류가 발생한다.
실행 시간 오류:
프로그램이 실행 중에 발생하는 오류이다. 이 오류는 컴파일 단계에서는 발생하지 않고, 프로그램이 실행되는 도중에 나타난다. 대표적으로 0으로 나누는 연산과 같은 오류가 있다.
예: 배열의 크기를 초과하는 인덱스 접근, 0으로 나누기.
예시:
cCopy codeint main(void) {
int a = 5, b = 0;
printf("%d", a / b); // 실행 시간 오류: 0으로 나누기
}
논리 오류:
프로그램이 문법적으로는 문제가 없고 실행도 되지만, 의도한 결과와 다르게 동작하는 오류이다. 이 오류는 코드의 논리적 결함 때문에 발생하며, 컴파일러나 런타임에서 자동으로 탐지되지 않는다.
예: 덧셈을 해야 하는데 실수로 곱셈을 하는 경우.
예시:
cCopy codeint main(void) {
int a = 5, b = 10;
int result = a * b; // 의도는 더하기인데, 곱셈으로 잘못 작성됨
printf("%d", result);
}
이 세 가지 오류는 프로그램 작성 시 발생할 수 있으며, 각각의 오류를 적절히 수정하는 것이 필요하다. 컴파일 시간 오류는 컴파일러가 잡아주지만, 실행 시간 오류와 논리 오류는 디버깅을 통해 찾아야 한다.
오류 수정 과정

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

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

오류 #3

논리 오류

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

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

- 각 줄마다 \n을 붙여서 줄을 바꿔준다.
디버깅(Debugging)
- 디버깅은 논리 오류나 실행 오류를 찾아내고 수정하는 과정이다. 프로그램이 컴파일되고 실행되지만, 의도한 대로 동작하지 않을 때 디버깅을 통해 문제의 원인을 분석하고 해결할 수 있다.
디버거(Debugger)

디버거:
- 디버거는 프로그램을 한 문장씩 실행하면서 오류의 원인을 찾아내는 도구이다. 이를 통해 개발자는 프로그램의 흐름을 한 단계씩 추적하고, 변수의 값이나 조건문의 상태를 실시간으로 확인할 수 있다.
디버거의 역할:
프로그램을 단계별로 실행할 수 있어, 특정 부분에서 발생하는 문제를 쉽게 추적할 수 있다.
변수의 값을 중간에 확인하거나 변경할 수 있다.
중단점(브레이크포인트, breakpoint)을 설정하여, 특정 지점에서 프로그램이 일시 중단되도록 할 수 있다.
디버거는 논리 오류나 실행 오류의 원인을 찾는 데 매우 유용한 도구이다.
예시: Visual Studio, GDB, Xcode와 같은 개발 도구에 포함된 디버거는 프로그램이 실행되는 도중에 중단점을 설정하고, 코드를 한 줄씩 실행하며 오류를 추적하는 기능을 제공한다.
디버거 명령어 정의
디버거의 실행F5 (Go): 실행
- 프로그램을 전체 실행하는 명령어이다. 설정된 중단점(브레이크포인트)까지 실행이 진행된다. 중단점이 없으면 프로그램이 끝까지 실행된다.
F10 (Step Over): 한 문장씩 실행 (함수도 하나의 문장 취급)
- 현재 문장을 한 단계씩 실행하지만, 함수 호출을 만나면 함수의 세부 내용을 들어가지 않고, 함수 전체를 하나의 문장으로 처리해 실행 후 다음 문장으로 넘어간다.
F11 (Step Into): 한 문장씩 실행 (함수 안으로 진입)
- 현재 문장을 한 단계씩 실행하며, 함수 호출을 만나면 그 함수 내부로 진입해 함수 내부 코드도 한 단계씩 실행한다. 함수 내부의 동작을 추적하고 싶을 때 사용한다.
F9 (Breakpoint): 현재 문장에 중단점을 설정
- 디버거에서 중단점(Breakpoint)을 설정하는 명령어이다. 중단점을 설정한 곳에서 프로그램이 일시 정지되어, 해당 지점까지의 상태를 확인하고 디버깅할 수 있다.
이 명령어들은 프로그램의 실행을 제어하고, 오류를 찾는 데 매우 유용한 도구이다. 디버깅할 때 각각의 명령어를 적절히 사용하여 프로그램 흐름을 파악하고, 문제를 해결할 수 있다.
디버거의 실행 과정

이 이미지는 Visual Studio에서 디버깅 과정 중 F10 (Step Over) 명령을 사용하여 한 문장씩 프로그램을 실행하는 예시를 보여주고 있다.
첫 번째 이미지:
디버깅이 시작된 상태이다.
F10키를 누르면 첫 번째 명령문인printf("Hello World!\n");이 실행될 준비가 되어 있다.현재 디버거는 첫 번째 명령문을 실행하기 직전이다.
두 번째 이미지:
F10키를 눌러 첫 번째 명령문이 실행되었다. 결과적으로 콘솔 창에 "Hello World!"가 출력된다.이제 두 번째 명령문
printf("Good Morning!\n");이 실행될 준비가 된 상태이다.
세 번째 이미지:
다시
F10키를 눌러 두 번째 명령문도 실행되었다. 이로 인해 콘솔 창에 "Good Morning!"이 추가로 출력되었다.모든 명령문이 실행된 후 프로그램이 종료되었다.
요약:
F10 (Step Over): 한 문장씩 실행하며, 함수가 있을 경우 함수의 세부 내용을 실행하지 않고 넘어간다. 여기서는 각
printf문을 순차적으로 실행하면서 프로그램의 실행 과정을 추적하고 있다.디버거를 통해 이렇게 프로그램의 실행 흐름을 한 단계씩 확인하며, 오류를 추적할 수 있다.
참고사항: 디버거 기능

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


학습 정리



