C 언어로 프로그램을 생성하는 과정을 먼저 알아보려 합니다.
//Helloworld.c #include <stdio.h> int main() { printf("Hello, world!\n"); }
Helloworld.c
(Compile)
Helloworld.obj -> (Conversion) Helloworld.lib
(Link) |
Helloworld.exe <- (Link)
(Build)
Resource compile
exe 파일을 만들기 까지 많은 과정을 거친다는 것을 알 수 있습니다.
lib 파일이나 obj 파일을 상대에게 제공하면 원본 소스를 감출 수 있어 본인의 노력을 허무하게 뺏기는 일을 예방할 수 있습니다.
전처리기는 컴파일러에게 명령을 지시하는 것으로 앞서 보신 Helloworld.c 파일에서 #include <stdio.h>와 같이 해쉬태그(#)로 시작하며, 세미콜론(;)을 사용하지 않습니다.
여기서 <꺽쇠>로 감싸면 시스템이 제공하는 헤더파일을 뜻하며, "큰 따옴표"로 감싸면 사용자가 만든 프로젝트의 경로에서 검색한 뒤 시스템 경로를 탐색하는 두번의 과정을 거치게 됩니다.
컴파일러 제조회사가 라이브러리 파일을 제공하며 사용자가 함수를 호출하면 운영체제에 관계없이 동일하게 동작할 수 있도록 합니다.
표준입출력함수
표준입출력 함수는 출력시스템에 상관없이 표준화된 함수를 뜻합니다.
데이터를 모니터에 입출력할 수 있는 기능을 제공해주는 표준 함수 및 라이브러리 함수 입니다.
printf, scanf( 여기서 f는 format을 뜻함)
printf( const char *format(출력형식), [argument](출력할 변수]..)
%d(decimal) %f(float) %lf(double) %c/%C(char) %s/%S(string (char[](char*)))
%u(unsigned int) %x/%X(hexadecial) %o(octa) %e(exponential) %p(메모리주소)
*문자c 와 문자열s 는 소문자일 경우 단일바이트를, 대문자일 경우 와이드문자(8비트보다 큰 문자)를 출력하거나 받습니다. 16진수 x는 소문자일 때 ffffff를, 대문자일때 FFFFFF를 입력하거나 출력합니다.
표준출력함수
모니터에 출력하기 위해 라이브러리 파일에서 제공하는 함수들의 모음입니다.
일반적으로 돈이라고 불리는 \ 표시의 뒤에 붙으며, 종류는 다음과 같습니다.
\n: 개행(printf에서 \n == \n\r)
\r: 라인의 앞으로 커서(Caret)를 옮깁니다. 여기서 커서는 cmd.exe를 실행했을 때 깜박이는 그것입니다. 정확히는 캐럿이라고 부르셔야 합니다.
\a: 비프음
\b: 백스페이스
\t: 탭
\': 작은따옴표
\": 큰따옴표
\\: 원표시(\)출력
예외상황에서 적용될 키워드는 반복해주시면 극복하실 수 있습니다.("100%%" -> 100%)
출력형식화(Formatted IO)
%(-) "자리수" : 왼쪽정렬
%(+) "자리수" : 오른쪽정렬
%(0) "자리수": 0으로 공백을 매꿉니다. 0이 뒤에 있을 경우, 값 오류를 불러올 수 있어 앞에 붙습니다.
ex)
int data = 23; printf("[%-5d], [%05d]",data,data);
결과 -> [23 ], [00023]
실수형 출력 형식화는 다음과 같습니다.
%(-)"전체자리수"."소수부자리수"
만약 실수가 자리수를 넘어가는 경우 무조건 소수점 마지막 자리에서 반올림을 실시합니다.
ex)
double data = 2.175678; printf("[%-7.2f], [%07.2lf], [%.0lf]", data, data, data);
결과 -> [2.18 ], [0002.18], [2]
scanf
scanf는 사용자가 입력한 정보들을 변수에 저장하기 위한 변수입니다.
visual studio에서 scanf만 쓰시면 간혹 혹은 자주 에러가 날 수 있습니다. 보안이슈로 인해 scanf_s를 강권하고 있습니다만 무시하고 싶으시다면 프로젝트 생성과정에서 SDL(Security Development Lifecycle) 검사(C)를 체크해제하시면 사용 가능합니다.
scanf(const char *format(입력형식) [,argument](입력받을 변수));
포인터형으로 입력받을 변수의 자료형 설정을 확실하게 해야 합니다.
scanf 사용시 스페이스를 사용하면 문제가 생길 수 잇어 gets()함수를 이용하여 공백까지 모두 읽습니다.
스캔에 실패하면 0을 반환합니다.
잘못된 입력을 방지하기 위해 fflush(stdin) 을 통해 키보드 버퍼를 초기화하면 생각치 못한 스캔 오류들을 방지할 수 있습니다.
변수(Variable)
변수는 상수(Constant)와 달리 프로그램의 실행주기 동안 값을 변경하면서 사용할 수 있는 정보입니다. 어떤 데이터 혹은 연산결과들을 메모리에 저장하고 이를 사용할 때 사용합니다. RAM에 할당하는 만큼 이 변수가 얼마의 자리를 차지하는 지를 알려줘야 합니다. 이를 위해 자료형을 변수의 앞에 씀으로써 컴퓨터에 선언할 수 있는 것입니다.
지역변수(Local Variable): 지역변수는 지역변수 선언을 포함하는 method 본문에 제어가 들어가면 나타나고, method 밖을 벗어나면 소멸하는 변수입니다. method와 생명주기를 같이하며, stack에 저장됩니다. 초기화 하지 않을경우 알 수 없는 값이 들어있으며, 다른 함수에서 참조하기 위해서는 포인터를 사용해야 합니다. 즉, 사용하기 전 원하는 값으로 초기화를 해줘야 합니다.
전역변수(Global Variable): 전역변수는 지역변수와 달리 프로그램이 끝날 때 까지 프로그램 어디서든 사용 가능한 변수를 말합니다. Data segment에 저장되며, 초기화를 하지 않으면 0으로 자동 초기화되는 성질을 가지고 있습니다. 전역변수는 함수를 가져갈 때 전역변수 또한 모두 데리고 가야하므로 함수의 독립성이 약화됩니다.
정적변수(Static Variable): 특정함수에서만 사용할 수 있는 전역변수를 말합니다. 지역변수 처럼 특정 영역에서만 사용하지만 전역변수처럼 메모리에 할당된 공간을 유지하고, 변수를 반환해도 소멸하지 않는 특징을 가지고 있습니다.
외부변수(External Variable): 외부변수는 extern이라는 키워드를 사용하여 다른 소스파일에서 참조할 수 있도록 한 변수입니다. extern 키워드를 사용하더라도 static이 있을 경우 해당 함수는 허상이 아닌 실상이 됩니다.
상수변수(Constant Variable): Const라는 키워드를 사용하여 변수 값을 변경할 수 없도록 합니다. 주로 에러 검출과 실수 방지를 위해 사용하며, 상수 변수가 가진 값에 영향을 미치지 않습니다.
에러체크를 하면서 변수 값이 바뀐다면 const를 넣어 컴파일 하면서 에러검출이 가능해집니다.
//Variable.c #include <stdio.h> extern int e; void Extfunc(){ e = 76; } ... //Variable2.c #include <stdio.h> //static variable void StaticFunc(void) { static int S_var = 0; int var = 0; S_var = S_var + 1; var = var + 1; printf("static variable: %d, Local variable: %d\n", S_var, var); } //global variable int g; //external variable int e; extern void Extfunc(); int main() { //local variable int l = 3; { int l = 45; printf("Local variable: %d\n", l); } printf("variable l: %d\n", l); //global variable printf("global variable: %d\n", g); g = 99; printf("g: %d\n", g); //static variable int i; for(i=0;i<4;i++){ StaticFunc(); } //external variable printf("e: %d\n", e); Extfunc(); printf("external variable: %d\n", e); return 0; }
'Tech > C/C++/C#' 카테고리의 다른 글
Microsoft Tech Camp Day 3 C++의 역사부터 함수포인터까지 (0) | 2015.12.26 |
---|---|
Microsoft Tech Camp Day 2 (3) 메모리 동적할당 (0) | 2015.12.23 |
Microsoft Tech Camp Day 2 (2) C 배열과 (악마의) 포인터 (0) | 2015.12.23 |
Microsoft Tech Camp Day 1 (2) C의 구성요소와 함수들 (0) | 2015.12.08 |
Microsoft Tech Camp Day 1 (1) C의 역사와 자료형 (0) | 2015.12.07 |