티스토리 뷰

반응형

 

이것이 C언어다: Chapter 01~03 완전 정복


Chapter 01. C 언어와 C 프로그램의 큰 그림

01-1. C 언어, 왜 배울까?

  • 임베디드, 운영체제, 네트워크, 게임 엔진까지 폭넓게 쓰이는 로우 레벨 언어
  • 빠른 실행 속도, 메모리 제어(포인터), 이식성이 강점
  • 파이썬·자바 같은 고수준 언어를 이해하는 데도 큰 도움

01-2. C 프로그램의 전체 구조

C 소스 하나에 보통 아래 4요소가 들어갑니다.

  1. 전처리 지시문: #include <stdio.h> 처럼 컴파일 전에 처리
  2. 전역 선언: 전역 변수, 다른 파일에서 쓸 함수 원형 등
  3. 함수 정의: main 포함 모든 함수
  4. 문(statement): 세미콜론으로 끝나는 실행 단위

가장 작은 실행 예:

#include <stdio.h>

int main(void) {
    printf("Hello, C!\n");
    return 0;  // 운영체제에 정상 종료 알림
}
  • main은 프로그램의 시작점
  • \n은 줄바꿈(개행)
  • return 0;은 관례적인 "정상 종료" 표시

01-3. 컴파일과 실행 흐름

  • 컴파일: 사람이 쓴 .c → 기계어
  • 링크: 표준 라이브러리 같은 외부 코드 결합
  • 실행 파일 생성 → 실행

작은 팁 ✅

  • 파일명, 한글 경로 문제를 줄이려면 영문 경로 사용 추천
  • 경고(warning)도 가볍게 넘기지 말기

Chapter 02. 프로그램의 기본 구성

02-1. Hello world! 돌아보기

printf 한 줄에도 기본 개념이 모두 숨어 있어요.

#include <stdio.h>

int main(void) {
    printf("Hello world!\n");  // 화면으로 문자열 출력
    return 0;
}

핵심 포인트

  • 큰따옴표로 감싼 문자열 상수
  • 이스케이프 시퀀스: \n(줄바꿈), \t(탭), \"(큰따옴표 출력) 등
  • 함수 호출은 함수이름(인자들); 형태

연습 ✍️

  1. Hello 다음 줄에 C를 출력해 보세요.
  2. 큰따옴표가 포함된 He said "Hi"를 정확히 출력해 보세요.

정답 예시

printf("Hello\n");
printf("C\n");
printf("He said \"Hi\"\n");

02-2. “주소가 들어가야 완성된다”의 의미: & 연산자와 입력

C에서 주소(address) 는 매우 중요합니다. 대표적인 예가 scanf입니다.

#include <stdio.h>

int main(void) {
    int age;
    printf("나이를 입력하세요: ");
    scanf("%d", &age);  // 변수 age의 '주소'를 전달해야 함
    printf("내 나이는 %d살\n", age);
    return 0;
}

왜 &age일까?

  • scanf는 입력한 값을 어디에 저장할지 알아야 합니다.
  • 변수의 주소를 넘기면 그 위치에 값을 써 넣을 수 있어요.
  • 주소를 담는 변수를 포인터라고 부르며, C의 핵심 개념입니다.

자주 하는 실수 ⚠️

  • scanf("%d", age); 처럼 &를 빼먹으면 런타임 오류 또는 엉뚱한 값이 들어갑니다.

문자와 문자열 입력 기본형

char ch;
char name[20];

scanf(" %c", &ch);     // 앞 공백은 이전 개행 제거용 팁
scanf("%19s", name);   // 공백 전까지 읽음, 버퍼 오버플로 방지

02-3. printf 정확히 이해하기 (형식 지정자)

자주 쓰는 형식 지정자 요약:

  • %d 정수(int)
  • %u 부호 없는 정수(unsigned)
  • %ld, %lld 더 큰 정수(long, long long)
  • %f 실수(float는 자동 승격으로 double로 출력)
  • %lf 실수 입력에서 double, 출력은 %f 사용
  • %c 문자
  • %s 문자열(문자 배열의 시작 주소)
  • %p 포인터(주소)

폭과 정밀도

printf("[%10d]\n", 123);     // 오른쪽 정렬, 총 폭 10
printf("[%-10d]\n", 123);    // 왼쪽 정렬
printf("[%.2f]\n", 3.14159); // 소수 둘째 자리까지
printf("[%10.2f]\n", 3.14159);

형식/인자 불일치 주의 ⚠️

  • printf("%d", 3.14); 같은 코드는 정의되지 않은 동작
  • 형식 지정자와 인자 타입을 반드시 맞추세요.

02-4. C의 기본 문법 포인트 정리

  • 세미콜론(;) 으로 문(statement) 종료
  • 블록: {와 }로 범위 묶기
  • 주석: // 한 줄, /* 여러 줄 */
  • 식과 대입: a = b + c;
  • 헤더 포함: 표준 입출력은 #include <stdio.h>

작은 습관 팁 ✅

  • 한 줄에 하나의 문만 쓰기
  • 들여쓰기와 공백을 일정하게 유지하기
  • 경고를 0개로 만드는 습관

Chapter 03. 변수와 연산자

03-1. 변수 선언과 초기화

대표 타입

  • int 정수
  • double 실수(정밀함)
  • float 실수(가벼움)
  • char 문자 1개(작은따옴표)
  • long, long long, unsigned는 범위 확장

예:

int a = 10;              // 선언과 동시에 초기화
double pi = 3.141592;
char c = 'A';

스코프와 수명

  • 블록 스코프: { } 내부에서만 유효
  • 전역 변수: 파일 전체에서 사용(필요할 때만!)
  • const: 수정 불가 상수
const int MAX = 100;  // 바뀌면 안 되는 값

문자와 문자열

char ch = 'a';         // 문자 하나
char str[6] = "hello"; // 마지막에 자동으로 '\0' (널 문자)

03-2. 연산자 한눈에

산술: + - * / %
대입: = += -= *= /= %=
증감: ++ -- (전위/후위 차이 주의)
비교: == != > < >= <= (결과는 0 또는 1)
논리: && || ! (단락 평가)
비트: & | ^ ~ << >> (정수에서만)

우선순위와 결합 규칙

  • 단항(! ++ --) → 곱셈/나눗셈 → 덧셈/뺄셈 → 비교 → 논리 → 대입
  • 헷갈리면 괄호로 명확히 하기

정수 나눗셈 주의 ⚠️

printf("%d\n", 5/2);    // 2 (정수 나눗셈)
printf("%.1f\n", 5/2.0);// 2.5 (실수 나눗셈)

형변환(cast)

int a = 5, b = 2;
double r1 = a / b;            // 2.0 (둘 다 int라 정수 나눗셈 후 실수 저장)
double r2 = (double)a / b;    // 2.5 (하나라도 실수면 실수 나눗셈)

03-3. 작은 프로그램으로 정리하기

  1. 입력 받은 두 정수의 합과 평균
#include <stdio.h>

int main(void) {
    int x, y;
    printf("두 정수를 입력하세요: ");
    scanf("%d %d", &x, &y);
    int sum = x + y;
    double avg = (x + y) / 2.0;   // 2.0으로 나눠 실수 평균
    printf("합: %d\n", sum);
    printf("평균: %.2f\n", avg);
    return 0;
}
  1. 문자와 문자열 다루기
#include <stdio.h>

int main(void) {
    char initial;
    char name[20];

    printf("이니셜(한 글자): ");
    scanf(" %c", &initial);     // 공백 제거를 위해 앞에 공백
    printf("이름(공백 없는 단어): ");
    scanf("%19s", name);

    printf("안녕하세요 %c. %s님!\n", initial, name);
    return 0;
}
  1. 서식 지정자 종합 테스트
#include <stdio.h>

int main(void) {
    int a = 123;
    double d = 3.14159;
    printf("[%10d]\n", a);
    printf("[%-10d]\n", a);
    printf("[%.3f]\n", d);
    printf("[%10.2f]\n", d);
    return 0;
}

흔한 오류 모음과 해결 팁

  1. scanf에서 & 빠짐
  • 증상: 이상한 값, 충돌
  • 해결: 정수·실수·문자 입력은 주소 전달(&변수), 문자열은 배열 이름 자체가 주소
  1. 형식 지정자 불일치
  • 예: printf("%d", 3.14);
  • 해결: 타입과 형식을 정확히 매칭
  1. 개행 처리 문제
  • 여러 번 scanf 쓸 때 이전 입력의 개행이 남아 char 입력을 건너뛰는 현상
  • 해결: 문자 입력 전 " %c"처럼 앞에 공백 넣어 개행 흡수
  1. 초기화하지 않은 변수 사용
  • 컴파일은 되지만 예측 불가 값
  • 해결: 항상 초기화하고 쓰기

미니 연습 문제 (직접 풀어보기)

  1. 사용자에게 섭씨 온도를 입력받아 화씨로 변환해 출력하세요.
    • 공식: F = C * 9 / 5 + 32
    • 소수 둘째 자리까지 출력
  2. 세 정수의 최댓값을 구해보세요.
    • if문 또는 삼항 연산자 사용
  3. 문자열 배열 char word[50]; 에 단어를 읽어 와서
    • 길이(문자 개수)를 계산해 출력하세요.
    • 힌트: 반복문으로 '\0' 까지 센다.

정답 아이디어

    1. 형변환 또는 실수 리터럴 사용
    1. if (a > b) max = a; else max = b; 식으로 누적 비교
    1. 인덱스를 0부터 증가시키며 word[i] == '\0' 이면 종료

마무리 핵심 정리 ✅

  • C의 최소 골격: #include + int main(void) + return 0;
  • 입력은 주소가 핵심(&), 출력은 형식 지정자가 핵심
  • 변수 타입과 형식 지정자 매칭이 안전의 시작
  • 연산자 우선순위는 괄호로 명확히
  • 경고 0개를 목표로 깔끔한 코딩 습관 들이기

 

반응형