본문으로 바로가기
제품데스크톱 도구TASTECAD도면 확인TASTEFILES파일 관리TASTEFTP파일 전송TASTESSH원격 작업공간TASTEZIP압축과 해제개발 도구TASTECODERust 통합 개발 환경TASTESTUDIO통합 개발·테스트 환경TASTEETL데이터 통합(ETL)서버TASTEREMOTE원격 데스크톱 서버TASTEGEO공간정보 서버TASTEMAIL메일 작업공간시작하기다운로드문서구매모든 제품
마켓플레이스
소식
개발소식오늘의 개발 소식개발 문서프로그래밍 언어RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron알고리즘알고리즘 기초알고리즘 핵심알고리즘 심화실무 알고리즘
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스커뮤니티 안내
협업기술 전수홈페이지 구축데스크톱 앱 구축릴리스·결제 파이프라인판매 파트너문의
서비스원격 데스크톱설치 패키지 커스텀
TASTEDEV
제품

데스크톱 도구

TASTECAD복잡한 도면을 가볍게 열다TASTEFILES필요한 파일만, 가장 빠르게TASTEFTP파일이 오가는 가장 단정한 길TASTESSH서버와 나 사이, 더 단단한 연결TASTEZIP더 빠르게 묶고, 더 안전하게 풀다

개발 도구

TASTECODERust 앱을 편집 · 빌드 · 디버깅 · 테스트까지 한 창에서TASTESTUDIO편집부터 원격 테스트와 승인 기반 AI 수정까지TASTEETL값을 보며 데이터를 옮깁니다

서버

TASTEREMOTE우리 회사 서버로 운영하는 원격 데스크톱TASTEGEOGeoServer 호환 공간정보 서버를 Rust로 다시 세웁니다TASTEMAIL메일의 주도권을 다시 내 손에

시작하기

다운로드모든 제품 최신 판문서제품 사용법구매구독 · 영구 라이선스모든 제품모든 제품 한눈에
모든 제품
마켓플레이스소식
개발

소식

오늘의 개발 소식언어 · 프레임워크 · GitHub · AI 공식 발표개발 문서언어 · 프레임워크 · 알고리즘 안내서

프로그래밍 언어

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

프레임워크

프런트엔드 프레임워크Next.jsReactVue.js · NuxtSvelteKitAngular
서버 프레임워크Spring BootDjangoFastAPIASP.NET CoreNestJS · Express
앱 · 데스크톱 프레임워크TauriFlutterReact NativeElectron

알고리즘

알고리즘 기초복잡도 분석 · 정렬 · 탐색 · 기본 자료구조 · 트리와 힙알고리즘 핵심그래프 탐색 · 최단 경로와 최소 신장 트리 · 동적 계획법 · 탐욕 알고리즘 · 분할 정복 · 백트래킹알고리즘 심화문자열 알고리즘 · 수학과 정수론 · 비트 연산 · 구간 트리 · 유니온 파인드실무 알고리즘코딩 면접 풀이 전략 · LRU 캐시 · 레이트 리미터 · 일관된 해시
개발 문서 전체 보기
커뮤니티
프로젝트빌더와 작업 발견개발 로그결정과 시행착오프롬프트재사용 가능한 지시AI 도구 이슈Claude · Codex · Gemini 문제와 우회법쇼케이스완성된 결과커뮤니티 안내공개하고 함께 만드는 방식
협업
기술 전수Rust·egui 네이티브 앱 만들기홈페이지 구축10개 언어, 계정, 문서·다운로드데스크톱 앱 구축Rust·egui, WebView 없이릴리스·결제 파이프라인서명 · MSI·deb·rpm·AppImage · 해시판매 파트너소개하고 결제액의 30% 받기문의구축 · 제휴 · 투자 문의
서비스
원격 데스크톱브라우저로 내 컴퓨터에 접속설치 패키지 커스텀필요한 기능만, 설정은 미리
구매
KO
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
로그인
로그인
TASTEDEV

작은 도구부터, 더 좋은 개발까지.

support@tastedev.netTASTEDEV 후원하기
제품제품군구매문서다운로드마켓플레이스고객 지원
커뮤니티프로젝트개발 로그프롬프트AI 도구 이슈쇼케이스
정책개인정보처리방침이용약관구독 약관환불 정책커뮤니티 운영 정책
계정로그인가입하기
방문자
오늘
012345678901234567890123456789012345678901234567890123456789
어제
012345678901234567890123456789012345678901234567890123456789
누적 조회
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
상호
지엑스소프트
대표자
최영구
사업자등록번호
853-44-00368
주소
인천광역시 미추홀구 경인로 351 9층 V24
전화
+82-10-4404-1523
이메일
whitecalvin@tastedev.net
개인정보 보호책임자
최영구

© 2026 TASTEDEV제품 정보는 현재 검증된 개발 소스를 기준으로 합니다.출시·고도화 중

C 문서
C
시작하기기본 문법타입과 데이터모듈과 라이브러리오류 처리와 테스트핵심 개념: 포인터와 메모리
토론

C 안내서 · 2/6

기본 문법

C의 문법은 작고 단순합니다. 이 장에서는 프로그램의 시작점인 main, 변수와 연산자, 함수와 프로토타입, 제어 흐름, 그리고 printf와 scanf로 입출력하는 방법을 살펴봅니다.

main 함수

C 프로그램은 main 함수에서 시작합니다. 표준이 보장하는 형태는 두 가지입니다.

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("인수 개수: %d\n", argc);
    for (int i = 0; i < argc; i++) {
        printf("argv[%d] = %s\n", i, argv[i]);
    }
    return 0;
}

명령줄 인수가 필요 없다면 int main(void)로 씁니다. argc는 인수 개수, argv는 각 인수 문자열의 배열이며 argv[0]은 보통 프로그램 이름입니다. main에서 return을 생략하면 0을 돌려준 것으로 처리되지만, 명시적으로 적는 편이 읽기 쉽습니다.

변수와 연산자

변수는 쓰기 전에 타입과 함께 선언합니다. C99부터는 블록 중간이나 for 문 안에서도 선언할 수 있습니다. 지역 변수는 초기화하지 않으면 값이 정해지지 않으므로 선언할 때 바로 초기값을 주는 습관을 들입니다.

int count = 0;
double ratio = 0.75;
const int max_users = 100;   /* 바꿀 수 없는 값 */

int a = 7, b = 2;
int q = a / b;      /* 3: 정수 나눗셈은 0 쪽으로 버림 */
int r = a % b;      /* 1: 나머지 */
double d = (double)a / b;   /* 3.5: 한쪽을 실수로 바꾸면 실수 나눗셈 */

count += 5;         /* count = count + 5 */
count++;            /* 1 증가 */

자주 쓰는 연산자는 다음과 같습니다.

  • 산술: +, -, *, /, %
  • 비교: ==, !=, <, <=, >, >= (결과는 참이면 1, 거짓이면 0인 int)
  • 논리: &&, ||, ! (왼쪽만으로 결과가 정해지면 오른쪽은 평가하지 않습니다)
  • 비트: &, |, ^, ~, <<, >>
  • 대입: =, +=, -=, *=, /= 등

C에서는 0이 거짓이고 0이 아닌 값은 모두 참입니다. <stdbool.h>를 포함하면 bool, true, false를 쓸 수 있습니다(C23에서는 헤더 없이도 키워드입니다). 조건에 =를 잘못 써서 if (x = 0)처럼 대입이 되는 실수가 흔한데, -Wall이 이를 경고해 줍니다.

함수와 프로토타입

함수는 반환 타입, 이름, 매개변수 목록으로 정의합니다. 컴파일러는 파일을 위에서 아래로 읽기 때문에, 함수를 정의보다 먼저 호출하려면 프로토타입(선언)을 앞에 두어야 합니다.

#include <stdio.h>

/* 프로토타입: 이런 함수가 있다고 미리 알림 */
int max_of(int a, int b);
void greet(const char *name);

int main(void) {
    greet("C");
    printf("%d\n", max_of(3, 9));
    return 0;
}

int max_of(int a, int b) {
    return a > b ? a : b;
}

void greet(const char *name) {
    printf("안녕하세요, %s!\n", name);
}

C의 인수는 항상 값으로 전달됩니다. 함수 안에서 매개변수를 바꿔도 호출한 쪽의 변수는 바뀌지 않습니다. 호출한 쪽의 값을 바꾸려면 포인터를 넘겨야 하는데, 이는 6장에서 자세히 다룹니다. 매개변수가 없는 함수는 int f(void)처럼 void를 적어야 "인수를 받지 않는다"는 뜻이 정확히 전달됩니다.

제어 흐름

if/else, switch, while, do-while, for가 있고, 반복을 빠져나가는 break와 다음 반복으로 넘어가는 continue가 있습니다.

for (int i = 1; i <= 15; i++) {
    if (i % 15 == 0) {
        printf("FizzBuzz\n");
    } else if (i % 3 == 0) {
        printf("Fizz\n");
    } else if (i % 5 == 0) {
        printf("Buzz\n");
    } else {
        printf("%d\n", i);
    }
}

int day = 6;
switch (day) {
case 6:
case 7:
    printf("주말\n");
    break;          /* break가 없으면 다음 case로 이어서 실행됨 */
default:
    printf("평일\n");
    break;
}

int n = 0;
do {
    n++;
} while (n < 3);    /* 본문을 최소 한 번 실행 */

switch는 정수 값에만 쓸 수 있고, case 끝에 break를 빠뜨리면 다음 case로 넘어가 실행됩니다. 의도한 경우가 아니라면 항상 break를 적습니다.

printf와 scanf

printf는 형식 문자열의 지정자 자리에 인수를 넣어 출력합니다. 지정자와 인수 타입이 맞지 않으면 정의되지 않은 동작이므로 정확히 맞춰야 합니다.

지정자타입예
%dintprintf("%d", 42)
%ldlongprintf("%ld", 42L)
%uunsigned intprintf("%u", 7u)
%zusize_tprintf("%zu", sizeof(int))
%fdoubleprintf("%.2f", 3.14159)
%c문자printf("%c", 'A')
%s문자열printf("%s", "text")
%p포인터printf("%p", (void *)&x)

scanf는 입력을 읽어 변수에 저장하므로 변수의 주소(&)를 넘깁니다. 반환값은 성공적으로 읽은 항목 수이므로 반드시 확인합니다. scanf에서 double은 %lf로 읽는다는 점이 printf와 다릅니다.

#include <stdio.h>

int main(void) {
    int age;
    double height;

    printf("나이와 키를 입력하세요: ");
    if (scanf("%d %lf", &age, &height) != 2) {
        fprintf(stderr, "입력 형식이 올바르지 않습니다.\n");
        return 1;
    }
    printf("나이 %d, 키 %.1f\n", age, height);
    return 0;
}

문자열 한 줄을 읽을 때는 버퍼 크기를 넘길 수 있는 fgets(buf, sizeof buf, stdin)가 더 안전합니다. 크기 제한 없는 %s는 버퍼를 넘쳐 쓸 수 있으므로 피합니다.

정리

  • 프로그램은 int main(void) 또는 int main(int argc, char *argv[])에서 시작합니다.
  • 변수는 타입과 함께 선언하고 바로 초기화합니다. 정수 나눗셈은 소수점 아래를 버립니다.
  • 함수를 정의보다 먼저 호출하려면 프로토타입을 앞에 둡니다. 인수는 값으로 전달됩니다.
  • switch의 case에는 break를 잊지 않습니다.
  • printf 지정자는 인수 타입과 정확히 맞추고, scanf의 반환값은 항상 확인합니다.
이 장에 대해 질문이 있나요?
이전 장시작하기다음 장타입과 데이터

댓글 0개

인기 댓글순최신순

로그인 · 로그인하면 댓글을 남길 수 있습니다.