[C] C를 이해해보자

장세민·2022년 6월 16일
0

📝 TIL

목록 보기
1/40

컴퓨터는 어떤 언어를 이해하지?

컴퓨터는 0과 1로만 구성된 기계어

컴퓨터에게 일을 시키려면?

인간이 사용하는 자연어와 컴퓨터가 사용하는 기계어가 다르기 때문에,
프로그램으로 작성하여 일을 시켜야 한다.

프로그램
컴퓨터에게 내리는 명령을 알고리즘 순서에 맞게 모아둔 것

알고리즘
문제를 풀기위한 처리 과정을 순서대로 적은 것

프로그램은 무엇으로 작성?

프로그래밍 언어
컴퓨터 프로그램을 짜는 데 사용하는 언어

프로그래머는 어떤 언어를 쓰지?

고급 언어
사람이 사용하는 자연어와 비슷하게 명령을 작성할 수 있는 언어
FORTRAN, BASIC, C, JAVA, C++, C# 등
고급 언어를 컴퓨터가 이해하려면 기계어로 번역해야 이해

고급 언어를 기계어로 번역하려면?

소스(source) 프로그램인 C 언어를 목적(object) 프로그램인 기계어로 전환 시키기 위해서는 컴파일러가 필요

컴파일러
고급 언어로 작성한 프로그램을 기계어로 번역하는 프로그램
C 언어 구문에 맞지 않으면 컴파일러가 번역을 완료할 수 없다.

주의!
컴파일러는 프로그램이기 때문에 사람만큼 똑똑하지 않고, 정확하게 명령문을 작성해야 한다.

프로그램 개발 과정

1. 문제 분석
개발 할 프로그램이 있다면 프로그램의 내용과 성격을 파악하고, 프로그램 사용자가 요구하는 것을 분석

2. 알고리즘 설계
프로그램 개발에서 아주 중요한 단계이며, 알고리즘은 요청에 대한 출력을 위해 컴퓨터가 해야할 일을 순서대로 모아둔 것
알고리즘은 순서도(flow chart)나 의사 코드(pseudo code)를 이용하여 나타낸다.

ex) 삼각형 넓이 구하기 알고리즘

의사 코드
사람의 자연어와 프로그래밍 언어의 중간 수준

3. 코딩
알고리즘이 완성되면 코딩을 통해 프로그램 작성

코딩
알고리즘을 특정 프로그램으로 옮기는 작업
코딩 과정을 마친 프로그램을 소스 파일(*.c), 소스 코드, 소스 프로그램이라고 한다.

4. 컴파일
고급언어로 작성된 프로그램을 기계어로 번역하는 것

5. 링킹
목적 파일(.obj)을 실행 파일(.exe)로 만드는 과정
프로그램이 클 경우 여러 개 소스 파일로 나눠서 저장
= 소스 파일이 여러 개 -> 목적 파일도 여러 개 만들어짐
이 목적 파일을 하나로 만들어 주는 과정

scanf와 printf 함수와 같은 라이브러리 함수의 코드의 목적 파일은 따로 만들어져 있고(라이브러리 파일),
이 파일을 사용자 프로그램 파일과 연결 시켜주는 과정

디버깅 과정

버그
프로그램이 제대로 실행되는 것을 방해하는 오류

디버깅
프로그램 소스 코드를 추적하여 버그를 발견한 후 제거하는 작업

오류(error)

구문(syntax) 오류
소스 파일에서 목적 파일로 번역할 때 컴파일 시점 오류
대부분이 구문 오류

ex)

age = 15 <- (C 프로그램 에서는 문장 뒤에 ; 를 써야함)
if age < 20 <- (C 프로그램 에서는 if 조건을 ()안에 써야함)
 
#영어의 문법적 오류에 해당

링크 시점 오류

ex)

int mian()
 
#main 이름의 함수 오타

논리(logic) 오류
프로그램을 실행하면서 발생하는 오류

ex)
sum/n 문장이 실행될 시점에 n이 0일 때
a, b, c 중 제일 큰 값은 c 인데 결과로 a가 나온 경우

디버깅 해결 과정

소스 파일에서 컴파일 하면서 오류가 발생하면? -> 소스 파일 수정
컴파일 완료 후 링킹 과정에서 오류 발생하면? -> 소스 파일 수정, 새로운 목적 파일, 새로운 실행 파일
실행 파일 만들고 결과가 마음에 안 들면? -> 소스 파일 수정, 새로운 목적 파일, 새로운 실행 파일

C 프로그램 구조

main 함수
반드시 있어야 하는 함수

함수 원형 선언

어떤 함수가 있다는 사실을 알려주려면 함수 선언(function declaration)을 해주어야 한다.

즉, 함수를 사용하기 전 미리 컴파일러에게 함수에 대한 정보를 알려야 하기 위한 목적

ex)

sort(a, b) 호출문이 sort 함수 정의보다 앞에 있을 때 필요
scanf 함수와 printf 함수의 원형 선언은 stdio.h 안에 있다.

추가 공부 내용

함수 선언은 반환값 자료형, 함수 이름, ()순으로 적어주고 ;을 붙인다. 특히 여기서는 함수를 정의할 때와는 달리 {}를 사용하지 않는다.

반환값은 함수를 정의할 때 반환값의 자료형을 지정해주고 함수 안에서 return 키워드로 값을 반환

반환값자료형 함수이름()
{
    return 반환값;
}

중요한 점은 반환값과 반환값의 자료형의 일치이다.

반환값=정수 -> 반환값 자료형은 정수에 해당하는 int, long 등을 쓰고
반환값=실수 -> float, double

함수 원형 선언 없이 컴파일을 진행하면?

int main()
{
   int a, b;
 
   scanf("%d %d", &a, &b);
 
   a=b*2;
   b=a/2;
   sort(a, b);
 
   printf("%d, %d", a, b);
 
   return 0;
}
 In function 'int main()':
error: 'sort' was not declared in this scope

sort 함수가 정의되지 않았다는 컴파일 경고와 에러가 발생.
main 함수 부분에서 sort 함수에 대한 정보가 없었기 때문이다.

main 함수의 구조

int  #정수 integer의 줄임말
int main()  #main 함수의 header 부분
{ }  #main 함수의 body 부분

프로그램 실행 순서

프로그램 실행은 main 함수에서 시작하여 위에서 아래로 차례대로 실행하고, main 함수가 끝나면(return 문을 실행하면) 프로그램 실행도 끝

차례대로의 순서를 만들어 내는 것 = 알고리즘

전처리기 지시
컴파일러 보다 먼저 특정 일을 수행하는 전처리기(preprocessor)에게 내리는 지시
전처리기에게 내리는 지시는 #으로 시작

#include <stdio.h>

사용자가 만들지 않은 라이브러리 함수, 예로 scanfprintf를 사용하는 데 필요한 header 파일 'stdio.h'를 이 프로그램에 포함시키라는 뜻

scanf 함수  #키보드에서 입력이 가능하게 해주는 함수
printf 함수  #모니터에서 출력이 가능하게 해주는 함수

=> 라이브러리 함수

[참고]C 언어 코딩 도장: 60.2 함수 선언과 정의 분리하기

profile
분석하는 남자 💻

0개의 댓글