본문 바로가기

별걸다하는 IT/프로그래밍언어

[C/C++/C#]프로그램 구조(structure)-전처리기, 전역, 메인, 함수구간

반응형

[C언어, C++언어 강좌 모음 및 목차]

C나 C++이나 C#이나 비슷하니 말할 때 그냥 C로 통칭할게요)

자 프로그래밍 언어로 코드를 짜서 우리가 원하는 프로그램을 만들 수 있다는 걸 알아요

하지만 프로그램을 만들어봐! 하면 막막하잖아요. 어떻게 시작하지? 뭐부터 짜야하지?

 

오늘은 C언어로 프로그램을 짜기 전에 어떤 구조로 짜야할지, 어떻게 구조가 이루어져있는지, 각각 구조는 무엇을 의미하는지 한 번 훑고 넘어가는 시간이 될거에요. 그리고 각각에 해당하는 부문은 나중에 좀 더 상세히 다룰겁니다.

 

C프로그램 구조! (Structure of a C program)

ㅎㅎ 열심히 그렸습니다 ㅋㅋ

프로그램은 대게 이런 구조를 띄고 있어요 꼭 이렇게 작성해야 하는 건 아니지만 모든 개발자가 지키고 있는 룰인거죠.

이렇게 해야 코드를 나중에 수정하기도 쉽고, 알아보기도 쉽고, 쉽게 말해~~ 짜임새 있는 구조로 작성하기 위해 이렇게 짜게 된거예요.

이런 공통적인 규격이 있어야 남이 짠 코드를 내가 봐도 익숙하게 이해할 수 있겠죠?

▶ 순서 ◀

1. 전처리기 섹션이 가장 먼저!

2. 그리고 그 다음은 전역변수 선언구간!

3. 그 다음이 프로그램이 실질적으로 시작되는 메인(main) 섹션,

4. 마지막이 함수를 정의해논 걸 모아두는 공간입니다. User defined function은 사용자 정의 함수라고 해요.

1. 전처리기 구간이란?

먼저 전처리기 구간을 볼게요. 항상 전처리기는 파일의 가장 상단에 선언해야 합니다 ㅎㅎ

 

They are special instructions to the preprocessor that tell it how to prepare your program for compilation.

얘는 좀 특별한 코드 구간인데, 컴파일러한테 컴파일하기 위해서 뭘 준비해야하는지 말해주는 부분이예요. 그래서 이름이 전처리기입니다. 처리하기 전에 확인해 ~ㅎㅎ

https://m.blog.naver.com/PostView.nhn?blogId=highkrs&logNo=220458843058&proxyReferer=https%3A%2F%2Fwww.google.com%2F

예를 들어, 내가 계산기 코드를 짤건데 내가 모든 수식을 직접 다 일일이 짜기엔 비효율적이니까 남이 짠 것 (헤더파일!) 좀 갖다가 쓸거야. ~~ 이게 대표적 전처리기 사용 예시입니다.

 

한 예로, 제곱수를 구하는 함수는 누가 이미 만들어 놓은 게 있어요 ㅎㅎ. 그럼 내가 굳이 제곱수를 구하는 로직을 새로 만들지 않아도 되겠죠?

이 함수는 math.c라는 파일 안에 구현되어 있어요. 함수를 갖다 쓰려면 #include <math.c> 이렇게 명시해주면, 가져다가 사용할 수 있습니다.!!

 

그러니까 컴파일하기전에 나 얘가 짠거 갖다가 쓸거니까 알고 있어. 이때 사용하는 함수에 대해 정의되어 있는 파일을 지정하는게 #include명령이고 형식은 #include <stdio.h>이런식으로 꺽새 안에 파일을 지정합니다. 앞으로 우리가 주구장창 쓰게 될 .... ㅎㅎ~~~

 

One of the most important of the preprocessor directives, and one that is used in virtually all programs, is include. The include command tells the preprocessor that we need information from selected libraries known as header files. In today's complex programming environments, it is almost impossible to write even the smallest of programs without at least one system library.

전처기 구간에서 하는 가장 중요한 일은, 사실상 거의 모든 프로그램에서 사용되는 기능은, include입니다. (앞에서 간략히 말했듯이~!) include 명령어는 전처기(컴파일러)한테 "야 우리 어떤 라이브러리(=헤더파일)에 대한 정보가 필요해!" 라고 알려줘요.

사실 오늘날 점점 더 프로그램이 커지고 복잡해지고 있잖아요, 이런 환경에서는 모든걸 일일이 우리가 짤 수 없어요. 아주 작은 프로그램조차도 이러한 시스템 라이브러리 갖다쓰지 않고 만드는건 거의 불가능합니다.

사진을 보니, #include <iostream>이라는 게 "나는 iostream이라고 미리 정의된 라이브러리 파일을 갖다가 사용하고 싶어"라는 뜻이라고 잘 알려주고 있어요 ㅎㅎ iostream은 C++에서 입출력 함수들을 정의해놓은 파일입니다.

 

대략 이런역할입니다..ㅎㅎ 그 외 전처리구간에서는 치환의 역할을 하기도 하고 디버깅에도 도움을 주며 헤더파일 중복 방지도 해주는 컴파일 전 컴파일에 도움되기 위한 여러 일을 수행한답니다. 어떤 일을 수행하는지만 이해하고 넘어가도록 하고, 더더 자세한건 나중에 한 파트로 따로 빼서 자세히 배울거예요.

 

요 맨 앞의 전처리기는 컴파일 하기 직전에 처리하는 컴파일러의 한 부분이예요 무조건 앞에 와있어야 합니다.

전역변수 선언 구간

변수의 개념에 대해서는 전체적으로 해당 포스팅에서 자세히 훑고 있습니다.

 

Every C++ program is made up of a global definitions section and one or more functions.

The global definitions section comes at the beginning of the program.

자 모든 C프로그램은 전역변수구간과 함수들로 이뤄졌다고 말할 수 있어요. (나중에 배우겠지만 메인도 함수거든요) 전역변수 구간은 대게 프로그램의 맨 앞에 나옵니다 (컴파일러 전에 처리되는 전처리기 구간을 제외하고!)

 

The basic idea of global definitions is that they are visible to all parts of the program.

전역변수란 변수는 변수인데 전역! global~ 즉 어디서든 접근 가능하고 정보를 볼 수 있는 변수를 말해요

당연히.... 개인정보 같은 데이터들을 전역 변수로 두면 안되겠죠? 탈탈털리니까ㅎㅎ 그래서 전역변수 선언할 때에는 매우 조심해야 해요. (전역변수는 지양하는 방식으로 코드를 짜는게 옳습니다) 전역변수의 경우 어떻게 저장하는지, 언제 전역변수를 쓰는게 좋은지 등등 자세한 내용은 역시 해당 파트가서 이어나가도록 할게요 오늘은 프로그램의 구조도만! 

 

메인 구간 (Main section)

One and only one, of the functions in a program must be named main.

프로그램에서 단 한개만 존재하는 함수는 바로! Main함수입니다.

main is starting point for the program. 메인은 프로그램의 시작 지점을 뜻해요 여기서부터 프로그램 흐름이 시작됩니다.

그러므로 프로그램의 흐름이나 로직, 순서 등은 어디다 짜야겠어요?

메인 구간에다가 작성하는거예요!

 

사용자 정의 함수 구간(User-defined functions)

포스팅 함수를 간략히 살펴보면서 언급했었어요.

함수에는 두 종류가 있다! 사용자 정의 함수와 라이브러리 함수가 있습니다.

 

라이브러리 함수

Library = 도서관! 라이브러리 함수는 결국 도서관에서 책 빌려서 보듯이, 함수나 필요한 기능을 빌려다가 쓸 수 있는 것! 아까 전처리기에서 꺽새 안에 넣은 파일이 결국 라이브러리 함수들을 모아둔 라이브러리 파일이예요. (내가 만든 것이 아니야~)

 

사용자 정의 함수

사용자 정의 함수는 내가! 필요에 따라 함수를 만들어서 활용하는거!

 

사용자 정의 함수가 없으면 오른쪽 사진처럼 main내부에다가 작성해줘야 하기 때문에 main이 길어져요

그러면 프로그램의 흐름을 딱 보면 이해하기 쉽게 만들기 어렵겠죠? 코드도 길어지고 난잡해지고..

 

만약 10라인으로 구성되어 있는 함수가 있는데 따로 뺄 수가 없다면,,? 그리고 이 함수가 두 번 사용된다고 가정해볼게요

int main() //메인 시작
{
   1. main 내용 
   2. main 내용 
   void func() //함수 
  {
     1. 함수 내용
     2. 함수 내용 
     3. 함수 내용
     4. 함수 내용
     ...
     10. 함수 내용
  }
   3. main 3번째 내용
   4. main 4번째 내용
   void func() //함수 
  {
     1. 함수 내용
     2. 함수 내용 
     3. 함수 내용
     4. 함수 내용
     ...
     10. 함수 내용
  } 
   return 0;
} //메인 끝..

메인함수가 너무 길죠... 근데 만약 함수를 따로 뺄 수 있다면, 

int main() //메인 시작
{
   1. main 내용 
   2. main 내용 
   func(); //단순히 호출로 실행
   3. main 3번째 내용
   4. main 4번째 내용
   func(); 
   return 0;
} //메인 끝..
void func() //함수 
{
     1. 함수 내용
     2. 함수 내용 
     3. 함수 내용
     4. 함수 내용
     ...
}    

메인(main)이 간결해진 것을 확인할 수 있어요!

사용자정의함수 구간이 따로 있는 이유예요 ~

그래서 아래에다가 함수를 작성하는 공간을 따로 빼준 후, 정리해줍니다.

그리고 메인에서는 그 함수를 호출해서 마치 뗏다 붙였다 하는 스티커처럼, 기능을 가져와서 씁니다.

 

★이렇게 작성할 경우, func을 만났을 때 프로그램은 아래에 정의되어 있는 func을 호출하는 법을 모른다

프로그램이 흘러가는 시작 지점은 Main부터지만, 컴파일러는 코드 맨 윗줄부터 해석해서 정보를 가지고 있습니다.

즉 프로그램은 위에서부터 순차적으로 읽기 때문에 sum이라는 함수를 쓰려고 내가 저 맨 밑 구간에 정의를 해놔도 몰라요. main에서 func이라는 사용자 정의 함수를 호출하는 시점이 정의 구간보다 앞서기 때문이죠

 

그래서 전역변수구간 사진으로 올라가서 다시 보면, int sum(int a, int b);이렇게 선언해줬는데

이 문장이 'sum이라는 함수가 저 밑에 정의되어있으니까 메인에서 호출돼도 당황하지마'라고 알려줘서 메인이 sum을 봐도 사용자 정의 함수 구간으로 내려와 sum함수를 차장 실행할 수 있게 됩니다.

< 간단한 예시? >

#include <stdio.h>
/*---------------------------------global variable---------------------------------*/
int globalVariable = 3;
int sum(int a, int b);

/*---------------------------------------main--------------------------------------*/
int main(void)
{
	printf("%d", sum(globalVariable , 5));
    return 0;
}

/*----------------------------------function body----------------------------------*/

/*----------------------------------------------------------------------------------*
* int sum(int a, int b)
* a , b : received value
* returns: added value.
*----------------------------------------------------------------------------------*/
int sum(int a, int b)
{
	return a+b;
}

이런식으로 프로그램을 짜게 될 거예요

정말 개략적인 프로그램 구조와 각각의 역할을 알아봤어요!

모든 코드를 이해하지 않아도 괜찮습니당. 자세한건 추후에 보도록 하고 오늘은 여기까지! 여러분의 피드백과 공감 댓글은 환영입니다.

다음 포스팅에서 또 봐요!

 

반응형