이전 Chapter에서 Visual Studio를 설치하고 사용하는 방법에 대해 알아봤다.
거기에서 사용한 코드가
#include <stdio.h>
int main(void)
{
printf("Hello world! \n");
return 0;
}
이번에는 한문장씩 짚어가면서 의미하는 바가 뭔지 알아보려한다.
"C언어는 함수로 시작해서 함수로 끝난다."라는 말이 있다.
C언어로 프로그램을 작성한다는 것은 '함수를 만들고, 만든 함수들의 실행순서를 결정하는 것'이기 때문이다.
함수에 대한 완벽하고 구체적인 이해는 Chapter 09를 공부할 때까지 하면 되고, 이번 Chapter에서는 함수를 만드는 방법과 만든 함수를 실행하는 방법에 대해서 알아보자.
예를 들어 라는 수식이 있다. 에 삽입되는 값을 입력
이라하고, 그 결과로 얻게 되는 값을 출력
이라 한다. 그리고 적절한 입력과 그에 따른 출력이 존재하는 것을 가리켜 함수(function)
라 한다.
즉, 저 수식 자체가 함수의 정의
이고 이 함수의 호출
을 위해서 에 전달되는 값이 인자
가 된다.
그럼 맨 처음 본 예제에서 함수는 어디에 있을까?
C언어는 정해진 순서에 의해서 진행되는 함수의 호출이 바로 프로그램의 흐름이 되는 것이다.
#include <stdio.h>
int main(void)
{
printf("Hello world! \n");
return 0;
}
이 예제에서 가장 먼저 호출되는 함수는 main이라는 이름의 함수다.
※함수의 시작 형태
int출력형태
main함수이름
(void입력형태
)
int와 void는 각각 출력과 입력의 형태를 설명하는 것이다.
따라서 풀이해보자면 "출력의 형태가 int고 입력의 형태가 void인 main이라는 이름의 함수"가 된다.
이것만으로 함수가 되진 않고 안에 기능을 지녀야 한다.
main함수의 기능은 중괄호 안에 있는 것이 된다.
중괄호 내에 존재하는 문장은 위에서 아래로 순차적으로 실행이 되며, 이렇게 함수의 기능을 정의하고 있는 영역을 가리켜 함수의 몸체(body)
라 한다.
※함수 정의의 전체적인 구조
출력 형태
함수이름
(입력형태
)
{
함수의 몸체
}
그리고 '출력의 형태'라는 표현은 함수임을 강조할 때 사용되며, 실제로는 반환형(return type)
이라고 주로 사용된다.
C언어에서는 문장의 끝을 표현할 때 세미콜론(;)
을 사용한다. 조건문이나 반복문과 같은 컨트롤 문장에는 세미콜론이 붙지 않는다.
printf("Hello world! \n");
위 문장을 보면 printf라는 함수를 이용했는데 printf 함수는 함수호출 시 전달되는 문자열을 모니터에 출력하는 기능을 지닌다. 이 함수는 직접 만들지 않아도 호출이 가능한, 기본적으로 제공되는 함수다.
누구나 가져다 쓸 수 있도록 이미 만들어져 있는 함수, 기본적으로 제공되는 함수를 가리켜 표준함수
라 한다.
그리고 표준 함수들의 모임을 가리켜 표준 라이브러리
라고 한다.
printf와 같은 표준함수의 호출을 위해서는 해당 함수와 관련이 있는 헤더파일 선언
이라는 것을 해야한다.
이 예제의 헤더파일 선언은 아래와 같다.
#include <stdio.h>
이는 stdio.h라는 확장자가 .h로 끝나는 헤더파일을 포함하라는 의미의 선언인데 쉽게 이해하면 다음과 같다.
"헤더파일 stdio.h에는 printf 함수의 호출에 필요한 정보가 존재한다. 따라서 이 파일의 정보를 포함하는 헤더파일 선언문이 삽입되어야 한다."
헤더파일 선언 관련하여 다음 두 가지 내용을 정리했다.
1. printf 함수의 호출을 위해서는 stdio.h를 대상으로 헤더파일 선언을 해야한다.
2. 헤더파일의 선언은 소스파일의 맨 앞부분, main 함수 정의 이전에 와야한다.⭐
+) 문자열에 삽입된 \n
은 줄 바꿈을 의미한다.
함수 내 마지막 문장으로 아래와 같은 문장이 있었다.
return 0;
이를 가리켜 return문이라 하는데 이 문장이 지니는 두 가지 의미는 다음과 같다.
1. 함수를 호출한 영역으로 값을 전달 (반환)
2. 현재 실행중인 함수의 종료
따라서 저 문장으로 인해 main 함수를 호출한 영역으로 0을 전달하고 빠져나온다.
주석은 프로그램 내에 삽입된 메모를 뜻한다.
서로 같은 코드를 공유할 때, 또는 이전에 작성했던 코드를 다시 볼 때 코드를 해석할 때 적지 않은 노력과 시간을 요한다.
따라서 주석은 선택이 아닌 필수다!!
주석을 다는 방식은 두 가지가 있다.
주석의 시작/*
과 끝*/
을 명시하여 한 줄 또는 여러 줄의 주석을 처리하는데 사용 된다.
//
뒤에 등장하는 문장이 주석 처리 되는 방법으로 한 주석을 처리하는데 사용 된다.
앞서 보인 예제 Hello.c에 주석을 달면 아래와 같아진다.
// HelloComment.c
/*
제 목: Hello world 출력하기
기 능: 문자열의 출력
파일이름 : HelloComment.c
수정날짜 : 2024. 07. 17
작성자 : mingmingeee
*/
#include <stdio.h> // 헤더파일 선언
int main(void) // main 함수의 시작
{
/*
이 함수 내에서는 하나의 문자열을 출력한다.
문자열은 모니터로 출력된다.
*/
printf("Hello world! \n"); // 문자열의 출력
return 0; // 0의 반환
} // main 함수의 끝
이 예제에서는 주석 사용을 위해 과하게 달았다.😉
블록 단위 주석은 중첩될 수 없다. 단, 행 단위 주석은 블록 단위 주석의 내부에 포함될 수 있다.
printf 함수는 문자열 출력 이외에도 많은 기능을 제공한다.
printf 함수를 이용하면 문자열 이외의 데이터를 다양한 형태로 출력하는 것이 가능하다.
// PrintfOne.c
#include <stdio.h>
int main(void)
{
printf("Hello Everybody\n");
printf("%d\n", 1234);
printf("%d %d\n\n", 10, 20);
return 0;
}
printf 함수는 첫 번째 인자로 전달된 문자열을 출력한다.
"%d\n"
에서 보면 문자열에서 첫 번째로 등장한 것이 %d다.
이러한 문자를 가리켜 서식문자(conversion specifier)
라고 하는데 출력의 형태를 지정하는 용도로 사용된다. %d가 의미하는 건 '10진수 정수형태의 출력'을 의미한다.
따라서 %d
자리에 그 다음 들어간 인자인 1234
가 대입되서 출력이 된다.
그 다음 줄 문장도 동일하게 %d %d
자리에 10
, 20
이 차례대로 대입되어 출력되었다.
printf(서식문자, 인자); → 인자 출력
printf(서식문자, 인자1, 인자2, 인자3) → 인자1 인자2 인자3 출력
출력의 형태를 다양하게 조합하는 것도 가능하다.
// PrintfTwo.c
#include <stdio.h>
int main(void)
{
printf("My age: %d \n", 20);
printf("%d is my point \n", 100);
printf("Good \nmorning \neverybody\n\n");
return 0;
}
서식문자의 삽입위치에는 제한이 없기 때문에, 다양하게 문자열을 조합해서 출력하는 것이 가능하다.
인지로 들어가는 부분에는 꼭 문자나 정수가 아닌 연산문이 들어갈 수도 있다.
#include <stdio.h>
int main(void)
{
printf("My age: %d \n", 4*5);
printf("%d is my point \n", 10**2);
printf("Good \nmorning \neverybody\n\n");
return 0;
}
<Review>
오늘은 함수의 구성, printf 함수에 대해 배웠다.
다시 해보니 python만 쓰다가 자료형을 명확하게 쓰는 c언어를 사용하니 조금 귀찮기도 하고 자료형이 딱 보여 속이 시원하기도 하고 ㅎㅎㅎ 아무튼 아직도 오랜만인 느낌 재밌다~
계속해서 가보자구~
p.s python으로 자료구조 및 알고리즘 하는 것도 같이 병행하고 있다! 같이 병행하다보니 속도가 안나는 것이지 정리는 계속 하고 있으므로 조만간 정렬에 대한 글이 올라갈 예정😉 많관부 부탁드립니다~✨