본 포스팅은 Perfect C, C언어로 배우는 프로그래밍 기초 책을 기반으로 공부한 자료입니다.
다른 포스팅을 참고한 자료는 모두 출처를 남겨놓았습니다.
2.1 프로그래밍 구현(implementation) 과정
프로그래밍을 구현하려면,요구분석, 설계, 구현, 검증, 유지보수 총 5단계가 필요하다.
프로그래밍 입문은 이 중 세번째 단계인 "구현" 부분이다.
c프로그래밍 구현 과정은 크게
1. 프로그램 구상 --> 2. 소스 편집 --> 3. 컴파일 --> 4. 링크 --> 5. 실행
으로 이루어진다. 각 단계의 기본 개념을 톺아보겠다.
1. 프로그램 구상 & 2. 소스 편집
프로그램을 구현하기 위해 가장 먼저 할 일은, 소스코드를 어떻게 작성해야할 지이다.
선정된 프로그래밍 언어로 일련의 명령어가 저장된 파일을
소스파일 or 소스코드 라고하며 일반 텍스트파일로 저장되어 있다.
소스파일은 프로그래밍 언어에 따라 고유한 확장자를 가지는데, C언어는 .c, 자바는 .java 또 c++은 .cpp등등
3. 컴파일
컴파일러는 앞에서 다루었다시피
고급언어인 프로그래밍 언어로 작성된 소스파일에서 기계어로 작성된 목적파일을 만들어내는 프로그램이다.
즉, 고급 프로그래밍 언어에서 기계어를 만들어내는 과정을 "컴파일 과정"이라고 하며, "컴파일한다"라고 한다.
좀 더 자세히 알고 싶다면 아래 포스팅을 참고하면 된다.
https://chohaeminn.tistory.com/1
컴파일 결과로 목적코드가 저장된 목적파일이 생성되는데, 비주얼 스튜디오에서는 소스파일이
main.c, submodule.c 을 컴파일하면,
확장자는 .obj이고 대응하는 목적파일 main.obj이 생긴다.
4. 링크와 실행
링커는 위에서 컴파일한 결과로 나온 목적파일을 연결하고
참조하는 라이브러리를 포함시켜 하나의 실행파일을 생성해주는 프로그램이다.
링커가 수행하는 과정을 "링크" 또는 "링킹"이라고 한다.
자주 사용하는 프로그램을 작성할 때,
개발자마다 새로 작성할 필요없이 개발환경에서 미리 만들어서 이를 컴파일로 저장해놓는데,
이 모듈을 "라이브러리"라고 한다.
즉 공용으로 사용하기 위해 미리 만들어둔 "목적코드"라고 생각하면 된다.
비즈얼 스튜디오에서는 컴파일과 링크 과정을 합쳐서 메뉴 빌드(build)를 제공한다.
즉 build는 컴파일 후, 계속해서 자동으로 링크를 수행하는 과정을 말한다.
빌드가 성공하면 파일 확장자가 .exe인 하나의 실행파일이 만들어지고, 이를 실행하면 프로그램의 실행결과를 알 수 있다.
++ if, 컴파일과 링크를 합친 빌드만 있다면 무슨 문제가 있을까?
여러가지 문제로 다시 빌드할 때 효율적이지 못한 상황이 발생한다.
즉, 여러 소스 파일로 구성된 프로젝트에서 하나의 소스에 문제가 있더라도 다시 파일을 컴파일 한 후에 링크를 해야한다.
컴파일과 링크가 분리되어 있다면 문제가 있는 소스파일만 컴파일하고, 기존의 다른 목적파일을 그대로 사용하여 링크하면 효율적으로 실행파일을 만들 수 있다.
5. 오류와 디버깅
프로그램 개발 과정에서 나타나는 모든 문제를 오류 또는 에러라고 한다.
오류는 그 발생 시점에 따라 컴파일(시간), 링크(시간), 실행(시간) 오류로 구분할 수 있다.
- 컴파일 오류는 개발환경에서 오류 내용과 오류 발생위치를 어느정도 알려주므로 오류를 찾아 수정하기가 쉽다.
- 링크 오류는 컴파일 오류보다 상대적으로 드물고, main() 함수 이름이나 라이브러리 함수 이름을 잘못 기술하여 발생하는 경우가 대부분이다.
- 링크까지 성공했는데, 실행하면서 오류가 발생해 실행이 중지되는 경우가 실행오류로 간혹 문법적인 문제가 실행 오류까지 영향을 미치는 경우가 있다.
오류의 원인과 성격에 따라, 프로그래밍 언어 문법을 잘못 기술한 구문오류(문법오류)와
내부 알고리즘이 잘못되거나 원하지 않는 결과가 나오는 논리오류로 분류할 수 있다.
ex) 잘못된 한국어는 영어로 통역이 안 되듯이 문법이 잘못된 소스로 발생하는 오류는 문법오류이다.
ex) 원의 면적을 구하는데 2*3.14*r 처럼, 아예 잘못된 공식을 쓰는 경우 논리오류이다.
대부분의 문법오류는 컴파일 또는 링크시간에 발생하며, 로직 오류는 아예 오류메세지가 뜨지 않아서 실행결과를 보고 확인한다. 이렇게
프로그램 개발 과정에서 발생하는 다양한 오류를 찾아
소스를 수정하여 다시 컴파일, 링크, 실행하는 과정을 디버깅이라고 하며
이를 도와주는 프로그램을 디버거라고 한다.
[프로그램 구현과정 총 순서도]
다양한 통합개발환경
1. 통합개발환경이란?
여행을 갈 때, 항공예약, 교통이용, 관광지, 숙박 ,,, 등 찾아봐야 할 것이 많으면 우리를 패키지 상품을 이용한다.
프로그램 개발에도 편집기, 컴파일러, 링커, 디버거 등 다양한 기능이 필요하기에 이러한 것들을
통합하여 편리하고 효율적으로 제공하는 개발환경을 통합개발환경,
영문약자로, IDE(Integrated Development Environmnet)라 한다.
2.2 비주얼 스튜디오 설치와 C 프로그램의 첫 개발
우선 아래의 사이트에 접속해서 visual studio를 설치한다.
https://visualstudio.microsoft.com/ko/downloads/
누가봐도 눌러야할 것들을 계속 다음을 누르다 보면
이 페이지가 나오는데
그 때 여기 C++을 이용한 데스크톱 개발을 선택한다.
여기까지가 기본 visual studio 설치이다.
지금부터는 프로젝트 만드는 법을 포스팅해보겠다.
HelloWorld 프로그램 짜기
아까 화면에서 넘겨서 새 프로젝트 만들기를 클릭한다.
이렇게 이름. 위치. 솔루션을 지정하고 나면
우측의 솔루션 탐색기에서 파일을 만든다.
여기서 팁!!
들여쓰기를 하기 귀찮을 때,
Ctrl + A, Ctrl + K, Ctrl + F
를 차례로 누르면 자동으로 완벽한 들여쓰기가 된다!!!
#마이크로소프트 #사랑해
실행 단축키는 Ctrl + F5이다.
이렇게 한 건 빌드(컴파일 + 빌드) 과정이다.
컴파일
이렇게 하면 컴파일만 수행될 수 있고, 링크만도 할 수 있다.
근데 나는 빌드만 할듯 ㅋ
이제 여기에 새 프로젝트를 추가해보자
솔루션 탐색기에서 이렇게 따라하면
짜잔 ! 우측에 새 프로젝트가 생겼지모얌 ~
완전 러키비키자나!
만약에 Ctrl + F5를 눌렀을 때, 계속 프로젝트 1이 실행된다면?
아래 방법을 따라서 해봐라
필자도 같은 오류를 겼어서, 이렇게 했다.
헤더파일과 프로그램 실행과정
필자도 처음에 생겼던 궁금증인데,
#include <stdio.h> 라는 문장을 왜 쓸까?
라는 생각을 해본적이 있을 것이다.
우리가 프로그램을 짜다보면, 함수 puts()나 printf()를 자주 쓰게되는데 이 함수를 쓰려면, 헤더파일 <stdio.h>가 필요하다.
#include 는 영어 포함하다라는 뜻이 있듯이, 바로 뒤에 기술하는 헤더파일 <stdio.h>를 현재 위치에 삽입하라는 말이다.
나중에 코딩을 하다보면 파이썬이나 자바를 할 때도 생각없이
#include <stdio.h>를 타이핑하게 되는 본인을 자각할 수 있을것이다.
프로그램 실행 과정
c프로그램에서 main() 함수는 자동차에 시동을 켜는 열쇠와 같은 역할을 하므로, 반드시 정의되어야 한다.
이러한 함수의 형태는 하나의 사람과 같이 머리와 몸체를 가지게 되는데, 함수 머리 (function header), 함수 몸체(function body)로 이루어진다.
C언어에서 함수
- 함수 머리: int main(void) 처럼 함수에서 제일 중요한 결과값의 유형, 함수이름, 함수로 값을 전달하는 매개변수인 입력 변수 나열을 각각 표시
- 함수 몸체: 함수 머리 이후 {...}의 구현 부분
- 프로그램은 반드시 함수 main()을 정의하는 블록 내부의 문장을 순차적으로 실행하므로, 위 예제에서는 printf()를 처음으로 실행한 뒤 puts()를 실행한 후, 다음 return 0 문장을 실행하고 종료된다.
- 함수 헤더에서 괄호 내부의 (void)는 함수 입력이 없다는 뜻이며,
- 몸체에서 마지막 문장인 return 0은 정수 0값을 함수가 출력한다는 의미이다.
C프로그램과 같은 절차지향 프로그램은 함수(function)로 구성된다.
전체 프로그램에서, 이러한 기계 장치인 함수 하나하나가 프로그램의 단위가 된다.
함수는 입력은 여러개 사용될 수 있지만 결과값은 꼭 하나여야한다.
C언어에서 함수의 종류는?
1. 프로그래머가 직접 만드는 사용자 정의함수
2. 시스템이 미리 만들어놓은 라이브러리 함수
로 나뉜다.
2.4 오류와 디버깅
"구문오류"에서
이렇게 오류가 나면 빨간줄이 생긴 곳이 오류가 난 부분이며, 좌측 동그라미를 선택하면 오류가 자동으로 수정된다.
밑에 출력창에서 어떤 파일이 컴파일 되었고, 어디서 뭐 때문에 오류가 난 지를 알 수 있다.
이렇게 다양한 오류가 있다.
오류는 여러번 코딩을 하다보면 쉽게 찾아진다.
오류가 난 줄이 정확하지 않을 수도 있다.
그럴 때는 주위를 찾아보면 나온다.
링크 오류와 디버깅
링크오류란, 자동차로 따지면 만들어진 부품을 조립하는 링크 과정에서 발생하는 오류가 "링크 오류"이다.
즉, 자동차로 예를 들자면 자동차 생산과정에서 소나타 자동차 엔진을 장착해야 하는 과정에서 그랜져 자동차 엔진이 공급된 상황이다.
대표적인 링크오류는, 라이브러리 함수인 printf()의 철자를 잘못 기술하는 경우이다.
다음 예와 같이 마지막 f를 빼고 print()로 기술해서 빌드하면 경고가 표시되고 링크오류가 발생한다.
즉, 프로그램을 만드는데 필요한 prinf()라는 함수라는 부품대신 print() 함수를 활용해서 링크오류가 난 케이스
논리 오류 수정
컴파일과 링크를 성공해 프로그램을 잘 실행했는데 원하지 않는 결과가 나온다면, 이는 논리오류이다.
예를 들어 나는
"무지개 같은 내 친구" 를 출력하고 싶었는데
"무지 개같은 내친구 " 를 출력할 수 있다.
이렇게 문자열에서 띄어쓰기를 잘못한다거나 철자를 잘 못쓰는 것도 논리오류 중 하나다.
가능한 한 프로그램의 문제해결 절차인 알고리즘을 잘 만들고 이를 준수해서 소스를 코딩해야한다.
CHAPTER 2 까지는 프로그래밍의 개념적인 부분을 다루었고,
CHAPTER 3 부터 본격적인 C언어 지식이 나올 것이다.
'햄깅이의 C언어' 카테고리의 다른 글
[햄깅이의 C언어] Chapter 6 / 조건 (0) | 2024.07.16 |
---|---|
[햄깅이의 C언어] Chapter 5 / 연산자와 연산식 (2) | 2024.07.16 |
[햄깅이의 C언어] Chapter 4/ 전처리와 입출력 (1) | 2024.07.12 |
[햄깅이의 C언어] Chapter3/ 자료형과 변수 (0) | 2024.07.09 |
[햄깅이의 C언어] Chapter 1/ 프로그래밍 언어 개요 (1) | 2024.07.08 |