본문 바로가기
프로그래밍/C

C의 기본 구조와 데이터 출력

by 길냥이 2025. 4. 7.
728x90

목차

  1. main 함수
  2. 출력의 printf 함수
  3. 이스케이프 문자
  4. 정수와 실수 출력
  5. 주석

 

1. main 함수

기본 구조

C 프로그램은 함수로 만듭니다.

그럼 함수는 뭐에요?

함수는 일정한 기능을 수행하는 코드 묶음입니다.

프로그램이 커질수록 많은 함수를 사용하지만, 일단 우리는 간단한 프로그램을 만들 것이니 main 함수 하나로만 만들어보죠.

 

main 함수는 C 프로그램의 시작을 의미하며, 프로그램에 반드시 들어있어야 합니다.

일단, 가장 간단한 프로그램을 만들어볼까요?

#include <stdio.h>

int main()
{
	return 0;
}


짜잔. 완성입니다.

 

간단해요! 이렇게 짠 코드를 VSC나 DEV C에 넣고 컴파일링하면 돌아갑니다.

잠깐 들어가기에 앞서서, 각 코드들이 무슨 일을 하는지 알아보자면..

 

#include <stdio.h>

#은 해시 마크(hash mark)입니다. 

파이썬같은거에서는 주석을 나타내지만, C에서는 전처리기(Preprocessor)지시문을 나타내는 데 사용됩니다.

 

그러면 전처리기는 뭐냐? 하는데 그건 좀 나중에 배우고.. 

#include 는 전처리기에 들어가는 지시문 중 하나로, 다른 파일을 현재 파일에 사용하도록 불러오는겁니다.

여기서는 <stdio.h> 를 불러왔네요.

 

그러면 <stdio.h> 는 또 뭐냐, 표준입출력(Standard input output)의 약자 뒤에 헤더 파일(header file)이라는 확장자가 붙은 겁니다.

저 표준입출력 <stdio.h> 에는 printf()라던가, scanf()라던가, getchar()등등의 함수가 들어있습니다.

 

라이브러리

그래서 왜 쓰냐고요? 하하, 한번 지우고 돌려보시죠. printf()문이 버그로 취급될겁니다.

왜냐하면.. 좀 복잡한데 간단하게 설명해보자면

C는 컴파일 언어에요, 사람이 입력해둔 문자열을 컴파일러와 전처리기를 통해 기계어로 번역해서 돌리죠.

근데, 사람이 입력하는 문자열이 너무 많다 보니 이런걸 다 컴파일러로 하나하나 찾으려니 느려요!

 

그래서 라이브러리라는걸 만들어서, 특정 목적의 문자열들을 따로 모으자! 해서 최적화를 시키고..

맨 위에 전처리기에 "이런 라이브러리를 사용할거야" 라고 말하면, 

이제 전처리기는 "그럼 이 라이브러리에 해당하는 문자열을 기계어로 번역하겠습니다" 하는거죠.

 

뭐, 표준입출력 라이브러리 말고 시스템 호출 라이브러리만으로 문자열을 출력할 수 있기는 하지만..

이건 너무 귀찮고 복잡해요, 안그래도 어렵고 거지같은 프로그램인데 굳이 난이도를 더 올리지는 말도록 합시다.

 

잠깐, 이제야 한줄 처리한건가..

빠르게 다음 줄로 넘어갑시다. 2번째 줄 공백은 가독성을 위해서 분리해둔거니 패스!

 

int main()

그러면 드디어 main 함수가 있는 3번째 줄에 도착합니다.

int main()이 들어 있습니다. 흠?

3번째 줄부터 6번째 줄까지가 main 함수이며, 머리(int main())와 몸통(중괄호로 묶인 부분)으로 구성됩니다.

 

머리는 함수 원형(function prototype)이라고 하며 함수의 이름과 데이터 등을 표시하고(int main(), void main(), int main(void) 등..)

함수가 할 일은 몸통의 { } 부분에 작성합니다. 여기서도 가독성을 위해 

int main() { return 0; } 대신

 

int main()
{
    return 0;
}

 

이라고 해 줍시다.

위쪽이 더 보기 좋다고요? 코드 수백줄 넘어가면 그런 생각 안 드실걸요...

 

아무튼 보면 중괄호 사이에 return 0; 이 껴 있는데, 이건 int main함수의 종료 결과값으로 0을 반환한다는거에요.

원래 return은 C에서 반복문을 종료하는 일을 하는데, int main문을 종료하니 프로그램을 종료하고 0을 반환하는겁니다.

 

그러니까 마지막에 들어가야겠죠?

한번 return 0; 뒤에 뭐라도 넣어 보세요, 그거 실행이 되나..

 

그러니까 실질적으로는

int main()
{

                      

                      
    return 0;
}

부분에만 실행문이 들어간다는거죠

 

작성 규칙

하지만! 이 main문에는 몇가지 규칙이 있으니...

일단 필수적인 규칙으로, 세미콜론(;)을 활용해서 문장의 끝을 표시해야 해요. 

C에서의 ; 는 문장의 마침표와도 같으므로 항상 표시해 줍시다.

여담으로 ; 를 안 달면 그 다음줄에 빨간줄이 그인다는 소문이...

 

그리고 지켜주면 좋은 규칙으로, 한 줄에 한 문장씩 쓰는거랑 일정한 간격으로 들여쓰기가 있어요.

그러니까, int main() { return 0; } 같이 쓰지 말라는거에요.

들여쓰기는 사실 안해도 되요, C에서는 중괄호 { } 와 세미콜론 ; 으로 문장을 구별하지, 들여쓰기는 문법에 영향이 없거든요.

하지만 파이썬같은걸 하다오면 들여쓰기가 문법에 상당히 중요한데, 그거처럼 들여쓰기를 잘 지키도록 합시다.

이유는 당연히 가독성 때문..

그리고 통합개발환경(ide)에서도 기본적으로 들여쓰기를 지원하므로, 있는걸 없엘 필요는 없겠죠?

 

함수는 분명 어렵지만, 일단 지금은 main 함수의 구조만 알아둔걸로 충분해요, 나머지는 다음에 다시 배우도록 합시다.

 

2. 출력의 printf 함수

흠, 근데 저걸 실행하면 나오는건 까만화면밖에 없어요!

하하, 당연하죠. 안에 아무것도 안넣었는걸요.

가장 만만한 printf() 함수를 소개합니다!

 

화면에 데이터를 출력하는 방법은 여러가지가 있는데, 그 중 하나인 printf (print formatted)를 써 보죠.

#include <stdio.h>

int main()
{
    printf("Hello");
    printf("World!");
    return 0;
}

이 기능 하자가 꽤 있는데...

 

아무튼 이렇게 입력해줍시다. 문자열 출력을 위해 큰따옴표("")로 감싸고, 문장의 마지막 줄에 세미콜론(;)을 추가하는 걸 잊지 마세요.

근데 이러면 실행결과는 어떻게 될까요?

Hello
World!

우리가 원한 결과는 이거인데..

 

HelloWorld!

어라, 이렇게 되어 버렸네요..

 

흠, 맞아요. printf는 그냥 문자열을 출력하지, 문자열을 띄우거나 줄을 벌리는 등의 기능은 할 줄 모르거든요.

이럴 때 필요한 것이 이스케이프 문자(혹은 제어 문자)입니다.

 

여담으로, Hello world! 는 프로그래밍을 배우는 가장 첫 번째 단계로, 일종의 규칙이에요. 들여쓰기같은거죠..

일종의 국룰 단어랄까.. 물론 나중에 가면 지겨워져서 다른걸 배우기는 하는데..

 

3. 이스케이프 문자

자! 기본적으로 문자열로 표현하기는 뭔가 어려운 것들을 위해 우리는 이스케이프 문자를 사용합니다.

몇 가지에 대해 알아보죠,

이스케이프 문자 의미  기능
\n 개행 (new line) 줄바꿈
\t 탭 (tab) 출력 위치를 다음 텝(스페이스 4칸)으로 바꿈
\v 세로 탭 (vertical tab) 세로로 텝 이동(콘솔 지원 X)
\b 백스페이스 (backspace) 출력 위치를 한 칸 왼쪽으로 이동
\r 캐리지 리턴 (Carriage Return) 출력 위치를 줄의 맨 앞으로 이동
\f 폼 피드 (form feed) 프린터 제어 시 다음 페이지로 이동(콘솔 지원 X)
\a 알럿 (alert) 경고벨 출력
\' ' 작은따옴표 출력
\" " 큰따옴표 출력
\\ \ 백슬래시 출력
\? ? 물음표 출력

뭐, 저거 말고도 여러 종류가 있어요.

 

아무튼, 이걸 이용해서 위 문장을 수정하면..

#include <stdio.h>

int main()
{
    printf("Hello\n");
    printf("World!\n");
    return 0;
}

흐음, 드디어 마음에 드는 결과가 나오네요.

Hello
World!

 

4. 정수와 실수 출력

변환 문자

printf 함수는 기본적으로 문자열을 출력해요. 아.. 물론 숫자도 출력이 되기는 한데, 함수 밖에 입력된 숫자를 가져올 수는 없어요.

그러기 위해서 우리는 변환 문자를 사용하는데, 변환 문자는 전부 뒤에 %가 붙어요.

 

몇 가지 변환 문자를 알아보자면..

변환 문자 자료형 의미
%d 10진수 정수형 decimal integer
%f 실수형 long floating point
%lf 긴 실수형 floating point
%s 문자열 string
%e 지수형 exponential
%o 8진수 출력 octal
%x 16진수 출력 hexadecimal
%u 부호 없는 10진수 정수형 unsigned
%g 자동 실수형 출력 general
%p 포인터 주소 출력 pointer
%c 문자형 character

정도가 있네요. 

 

사실 %d %f %s를 많이 써요.

이번에도 사용을 위한 엄격한 규칙이 있으니, 

printf("문자열%d문자열", 숫자); 입니다.

문자열은 문자열이에요, 필요하다면 뭘 넣어도 좋아요. %d나 %f가 콤마 뒤에(큰따옴표를 벗어나 있음에 주의)위치한 숫자를 받아와요.

여기서 숫자는 상수(12,3541,123)이 될 수도 있고, 수식(123+21,12/3)이 될 수도, 변수(x,y,z) 가 될 수도 있고, 변수식(x++, y+z)가 될 수도 있죠.

 

한번 써볼까요?

#include <stdio.h>

int main()
{
    printf("올해 연도 : %d\n", 2025);
    printf("이번 달 : %d\n", 4);
    printf("올해 연도/이번 달 : %f\n", 2025/4);
    return 0;
}

엄.. 근데 출력이 뭔가 이상해요.

 

올해 연도 : 2025
이번 달 : 4
올해 연도/이번 달 : 0.000000

얼라레, 이거 왜이런담..

 

사실 이유는 간단해요, 우리는 부동소수점 출력(%f)로 받았는데, 보내준거는 정수형(%d)이기 때문이에요.

이건 나중에 연산 파트에 가서 배울텐데, 일단 C에서는 정수/정수 연산은 소수점을 제거해서 정수 출력으로 바꾼다는 것을 알아두세요.

 

해결책으로는, 두 숫자 중 하나를 실수로 바꾸면 되요.

#include <stdio.h>

int main()
{
    printf("올해 연도 : %d\n", 2025);
    printf("이번 달 : %d\n", 4);
    printf("올해 연도/이번 달 : %f\n", 2025/4.0);
    return 0;
}

이렇게 수정하면..

올해 연도 : 2025
이번 달 : 4
올해 연도/이번 달 : 506.250000

원하는대로 나오네요!

 

여러개의 변환 문자

흠, 그런데 printf 문 안에 변환 문자를 여러개 넣을 수는 없을까요?

printf문 여러개는 좀 그렇고..

 

물론 가능합니다! 한번 해보죠.

구조는 다음과 같아요.

printf("%d + %d = %d", x, y, x+y)

아, 물론 뒤쪽 숫자 부분에는 아무거나 들어가도 상관없어요.

근데 보시면 제가 색칠을 해 두었는데, 저건 장식용이 아니라 변환 문자에 해당하는 값이에요.

 

순차적이죠? 이걸 잘 기억하도록 합시다.

그럼 바로 한번 써보죠!

#include <stdio.h>

int main()
{
    printf("올해 연도(%d) / 이번 달(%d) = %f\n", 2025, 4, 2025 / 4.0);
    return 0;
}

이렇게 만들면..

 

올해 연도(2025) / 이번 달(4) = 506.250000

좋네요!

 

근데 출력에 소수점이 너무 붙어요. 저럴 필요는 없는데 말이죠.

이번에도 방법이 있습니다!

 

소수점 자리수 지정

%f로 실수를 출력하면 소수점 이하 6자리까지 출력합니다.

하지만 이정도까지 자세한건 필요없어요. 2자리정도까지 줄여볼까요..

 

그러기 위해서는 %f 안에 .n(n은 자연수)를 넣으시면 됩니다. 

%.3f, %.2f같이요..

 

그럼, 바로 수정해보죠!

#include <stdio.h>

int main()
{
    printf("올해 연도(%d) / 이번 달(%d) = %.2f\n", 2025, 4, 2025 / 4.0);
    return 0;
}

이렇게 수정하면..

올해 연도(2025) / 이번 달(4) = 506.25

좋아요! 드디어 편안해졌습니다.

 

물론 printf 함수에는 더 많은 기능이 있지만, 일단은 이 정도면 충분해요.

나머지는 필요한데서 설명하죠!

 

5. 주석

흠, 프로그래밍은 나 혼자 하는게 아니에요.

몇백줄, 몇천줄 정도의 프로그램은 혼자서 어떻게든 굴려보겠지만, 수백만줄의 코드 뭉텅이로 이루어져있는 대형 파일들은 혼자서는 불가능하죠.

 

프로그래밍의 본질은 협동이고, 협동을 위해서는 소통이 필요해요.

하지만 프로그램 파일을 보내줄 때 메모장으로 수백줄의 설명문을 적어가거나, 아니면 공식 석상에서 만날 때 

"이 코드는 이거고요, 이 코드는 여기로 이어지고, 이건 파일 저거랑 연결되서 그거를 돌리는데.."

엄, 좋지못해요..

 

이러한 문제를 해결하기 위해 파일 하나만 보내도 파일의 목적을 알 수 있게 하는 것을 만드니, 바로 주석입니다.

 

C에서의 주석은 간단해요.

한 줄 짜리 주석은 //을 치고, 여러줄짜리 주석은

/* 

 

*/로 묶는거죠.

#include <stdio.h>
int main()
{
    /*
    나는 큰 주석이다!
    */

    return 0; // 나는 주석이다!
}

뭐, 이렇게 활용할 수 있어요.

 

주석은 컴파일러에서 제거되니 필요할때마다 많이많이 쓰도록 합시다.

물론 너무 많은 주석은 좋지 않지만, 요소요소 필요한곳에라도 써주도록 해요.

 

적은 주석보다는 많은 주석이 좋다!

728x90

'프로그래밍 > C' 카테고리의 다른 글

데이터 입력  (0) 2025.04.15
변수  (0) 2025.04.14
상수와 데이터 표현  (1) 2025.04.14
C언어 개관  (0) 2025.03.08
C  (0) 2025.03.06