[C] 1. C의 기본 구성, 표준입출력함수

Wonder_Land🛕·2022년 6월 29일
0

[C]

목록 보기
1/18
post-thumbnail
  1. C의 기본 구성
  2. 표준입출력 함수
  3. Q&A
  4. 마치며

1. C의 기본 구성

  • C의 기본 구성
    : 1개 이상의 함수로 구성되어 있습니다.
    : 함수는 1개 이상의 명령문(Statement)를 포함합니다.

1) C의 함수 형식

(반환 자료형) (함수이름)(매개변수 목록)
{
	명령문;
    ...
}

(1) 반환 자료형

  • 반환 자료형(Return Type)
    : 함수에서 반환하는 값의 자료형입니다.

(2) 함수 이름

  • 함수 이름은 다음과 같은 규칙이 있습니다.
  1. 영어 대∙소문자, 숫자, _(underscore)만 사용할 수 있습니다.

  2. 첫 글자는 숫자로 시작할 수 없습니다.

  3. 영어의 대∙소문자는 구분됩니다.

(3) 매개변수 목록

  • 매개변수 목록(Parameter)
    : 함수를 호출할 때 전달되는 값들을 받아올 변수입니다.
    : 만약 호출 시 받아올 값이 없는 경우에는 생략할 수 잇습니다.

(4) {} (중괄호)

  • {} (중괄호)
    : 함수의 시작과 끝을 나타냅니다.
    : 함수의 블록(Block)이라고 표현합니다.

(5) 명령문 (Statement)

  • 명령문 (Statement)
    : 함수가 호출할 때, 수행해야 할 명령들의 목록입니다.
    : 각 명령문 끝에는 반드시 ;(semicolon)을 붙여주어야 합니다.

2) main() 함수

  • main() 함수
    : C프로그램 실행 시 최초로 호출되는 함수입니다.
int main(void)
{
	명령문;
    ...
    return 0;
}
  • main()함수는 정상적으로 작동할 경우에는 0, 그렇지 않을 경우는 0이 아닌 값을 반환합니다.

프로그램이 실행될 때,
main()함수에 포함된 명령문들을 제일 먼저 수행합니다.

따라서, 프로그램을 작성할 때는
반드시 구성해야 할 함수입니다.

하지만, 프로그램 내에 main()함수는 반드시 1개만 존재해야 합니다.


3) 주석 (Comment)

  • 주석(Comment)
    : 프로그램 작성 시 주석을 작성할 경우, 시간이 지난 후 다시 볼 때나 다른 사람이 분석할 때 많은 도움이 됩니다.
  • 여러 줄을 주석 처리 할 경우 : /* ~ */
/*
여러 줄 주석 처리
*/
  • 한 줄을 주석 처리 할 경우 : //
// 한 줄 주석 처리

2. 표준입출력 함수

  • 표준입출력
    : C언어의 입출력은 모두 스트림(Stream)을 통해서 이루어집니다.

    • Stream
      : 일련의 바이트로 구성된 데이터의 흐름으로, 장치의 종류와 관계없이 동일한 방법(입출력함수)으로 입출력을 수행합니다.

즉, 프로그램 작성 시,
표준입출력함수를 이용할 때는 헤더 파일을 반드시 포함시켜야 합니다.
ex) #include <stdio.h>

왜냐 하면,
표준입출력 함수에 대한 정보가 헤더 파일에 저장되어 있기 때문이죠.

1) printf() 함수

  • printf() 함수
    : 사용자가 원하는 내용을 출력할 때 사용하는 표준 출력 함수입니다.
    : 형식 지정자를 이용하면 문자열 뿐만 아니라 다양한 type을 출력할 수 있습니다.
printf("형식지정자 / 제어문자", 인수1, ..., 인수N);

프로그램 결과를 출력할 때는

  1. 형식지정자를 "" 사이에 입력하고, 값들을 인수 목록에 차례대로 나열합니다.
  2. 형식지정자와 인수의 개수를 일치시켜야 합니다.
  3. 형식지정자와 자료형이 맞지 않으면 오작동하거나 강제종료 됩니다.

다음 표는 자주 사용하는 형식지정자를 정리한 표입니다.

코드의미
%s문자열(String)
%c문자, 정수를 유니코드 문자로 변환
%d10진 정수(Integer)
%o8진 정수
%x16진 정수
%f부동소수점 숫자형(Float)
%p포인터, 메모리 주소
%%'%' 문자 자체 출력

다음 표는 자주 사용하는 제어문자를 정리한 표입니다.

코드의미
\n줄 바꿈
\t'Tab' 만큼 뛰움
\b이전 문자 지우기
\r줄 맨 앞으로 이동
\'\' 문자 출력
\''(작은 따옴표) 출력
\""(큰 따옴표) 출력

다음은 printf()함수를 이용한 예시입니다.

#include <stdio.h>

int main(void) {
	printf("%d, %f, %c, %s", 10, 10.5, 'C', "C++");
    return 0;
}

[Result]
10, 10.500000, C, C++

(1) Float의 소수점 자리 표현

: "%.(자릿수)f"의 형태로 표현합니다.

#include <stdio.h>

int main(void) {
	printf("%.3f", 3.141592);	// 소수점 이하 3자리까지만 표현합니다.
	return 0;
}	

[Result]
3.142

(2) 정렬 방향출력 길이(폭) 지정

: "%(정렬)(길이)(자료형)"의 형태로 지정가능합니다.
: 정렬 방향은 +오른쪽 정렬, -왼쪽 정렬이 됩니다. ( +는 생략 가능)
: 정렬을 하고 남은 자리는 공백으로 채워집니다.

#include <stdio.h>

int main(void) {
	printf("%10d\n", 1234);	// 오른쪽 정렬
	printf("%-10d", 1234);	// 왼쪽 정렬
	return 0;
}

[Result]
______1234
1234______

(3) Float의 정렬 방향출력 길이(폭) 지정

#include <stdio.h>

int main(void) {
	printf("%.2f\n", 3.141592); // 소수점 이하 2자리까지 표현
	printf("%10.2f\n", 3.141592); // 오른쪽 정렬, 10의 길이, 소수점 이하 2자리까지 표현
	printf("%-10.2f\n", 3.141592); // 왼쪽 정렬, 10의 길이, 소수점 이하 2자리까지 표현
	printf("%010.2f", 3.141592); // 공백을 0으로 채움
	return 0;
}

[Result]
3.14______
______3.14
3.14______
0000003.14
마지막 예시에서 알 수 있듯이 공백이 아닌 0을 채우고 싶다면
"%0(정렬)(길이).(소수점)(자료형)"을 사용하면 됩니다.

이 때, 정렬은 무조건 오른쪽 정렬만 가능합니다.
소수점이 지정된 상태에서 소수점의 나머지를 0으로 채운다면 소수점 지정이 의미가 없기 때문이죠.

만약, %-010.2f", 3.141592라고 한다면, 소수점 이하 2자리까지 표시하므로 3.14가 되지만, 공백0으로 채우기 위해 3.14000000이 된다면 소수점을 지정한 의미가 없기 때문에 안되겠죠??
그래서 실제로 출력을 해봐도 0이 아닌 공백으로 채워지죠.

#include <stdio.h>

int main(void) {
	printf("%-010.2f", 3.141592);
	return 0;
}

[Result]
3.14______ 띠용(⊙_⊙)?


2) scanf() 함수

  • printf() 함수
    : 사용자가 원하는 내용을 입력받을 때 사용하는 표준 입력 함수입니다.
    : 형식 지정자를 이용하면 문자열 뿐만 아니라 다양한 type을 입력받을 수 있습니다.
    : 공백 문자나 'Enter'키를 구분자로 입력 받습니다.
scanf("형식지정자", &변수1, ..., &변수N);

이 때, 입력을 받기 위한 임의의 공간으로 '변수(Variable)'를 사용합니다.

프로그램 결과를 입력받을 때는

  1. 형식지정자를 "" 사이에 입력하고, 값들을 변수 목록에 차례대로 나열합니다.
  2. 형식지정자와 변수의 개수를 일치시켜야 합니다.
  3. 형식지정자와 자료형이 맞지 않으면 오작동하거나 강제종료 됩니다.
  4. 변수 앞에 &를 붙여야 합니다.

다음 표는 자주 사용하는 형식지정자를 정리한 표입니다.

코드의미
%s문자열(String)
%c문자, 정수를 유니코드 문자로 변환
%d10진 정수(Integer)
%o8진 정수
%x16진 정수
%f부동소수점 숫자형(Float)
%lf부동소수점 숫자형(Double)
%p포인터, 메모리 주소
%%'%' 문자 자체 출력

다음은 scanf()함수를 이용한 예시입니다.

#include <stdio.h>

int main(void) {
	int a;
	float b;

	scanf("%d %f", &a, &b);
	printf("%d, %f", a, b);
	return 0;
}

[Input]
10 10.5
[Result]
10 10.500000


3. Q&A

1) 컴파일

  • 컴파일(Compile)
    : C언어로 작성한 소스코드를 CPU가 실행할 수 있는 기계어 코드로 변환하는 것입니다.

1단계. 소스코드를 컴파일 하여 '오브젝트코드(Object Code)'로 만듭니다.

  • 전처리문(ex) #include, #define)을 먼저 처리합니다.
  • 문법 체크 후 소스코드 중 일부는 속도 향상을 위한 최적화 코드로 변경합니다.
  • 이 과정에서 완성된 파일이, '오브젝트코드'입니다.

2단계. 링크 과정을 통해 '실행파일(Executable File)'로 만듭니다.

  • 소스코드에서 라이브러리함수를 호출합니다.
  • 함수의 오브젝트 코드를 함께 결합하여 실행파일을 완성합니다.

만약 통합개발환경(IDE)를 이용한다면,
단축키나 실행 버튼으로 자동으로 컴파일러를 실행하기 때문에,
간편하게 실행할 수 있습니다.

하지만 직접 컴파일러를 이용한다면,
실행파일을 만들어서 실행해야 합니다.
(조금 번거롭죠 🤔)

(1) C 컴파일러

C 컴파일러는
Unix에서는 cc
Linux에서는 gcc

사용할 수 있습니다.

C 컴파일러에서 자주 사용하는 주요 옵션으로는

옵션의미
-o (fileame)컴파일 결과를 (fileName)에 저장합니다.
-c오브젝트 파일까지만 생성합니다.
여러 개의 소스파일로 나누어 개발할 때 사용합니다.
-g실행 파일에 디버깅에 필요한 정보가 포함됩니다.
디버깅이 필요할 때 컴파일을 할 시에는, 이 옵션을 함께 컴파일해야합니다.
Visual Studio에서는 디버깅모드로 빌드하는 방법이 이 옵션에 해당합니다.

다음은 C 컴파일러에서 옵션을 활용한 예시입니다.

  1. gcc -o test test.c
    : 소스파일 test.c를 컴파일 하여 실행파일 test로 저장

  2. gcc -c test.c
    : 소스파일 test.c를 컴파일 해서 오브젝트 파일 test.o를 생성

  3. gcc -o test test.c -lm
    : 소스파일 test.c를 컴파일하고 라이브러리 libm.a를 링크하여 실행파일 test를 생성


4. 마치며

파이썬에 이어 C를 공부하게 됐습니다!

사실 C는 써 본 경험이 많아서 기억이 엄청 잘 나네요 😁

이제 앞으로 C의 기초에 대해서 배워볼텐데 열심히 공부해보겠습니다.!

[Reference] : 위 글은 다음 내용을 참고, 인용하여 만들어졌습니다.

  • 전반적 내용 : 삼성 SW Expert Academy
profile
아무것도 모르는 컴공 학생의 Wonder_Land

0개의 댓글