흥달쌤 C언어 특강 1~4

이윤설·2024년 6월 8일

흥달쌤 C언어 특강

목록 보기
1/10
post-thumbnail

1. 프로그래밍이란?

Q. 입력 안내에 따라 두 사람의 나이를 입력받고, 그 합을 구하는 C 프로그램을 작성하려고 한다.

ㄱ. scanf("%d%d", &age1, &age2);
ㄴ. result = age1 + age2;
ㄷ. int age1, age2, result
ㄹ. printf("나이의 합은 %d살입니다. \n", result);
ㅁ. printf("철수와 영희의 나이를 입력하세요.");

ㄷ -> ㅁ -> ㄱ -> ㄴ -> ㄹ

프로그램 동작 과정: 선언 -> 입력 -> 처리 -> 출력


2. 컴파일러, 인터프리터

  • 컴파일: 인간이 만든 고급언어를 컴퓨터가 해석할 수 있는 저급언어로 번역하는 것

  • c언어 컴파일 과정: .c -> 전처리기 -> .i -> 컴파일러 -> .s -> 어셈블러 -> .o -> 링커 -> .EXE

  • 컴파일러

    • 고급 언어로 작성된 프로그램을 컴퓨터에서 실행하기 위해 컴퓨터가 이해할 수 있는 언어로 번역.
    • 전체를 번역하므로, 번역 시간이 오래 걸리지만, 한 번 번역한 후에는 다시 번역하지 않으므로 실행 속도가 빠르다.
    • 언어: C, C++, java(compiler + interpreter)
  • 인터프리터
    - 고급언어로 작성된 프로그램을 한줄씩 읽어들여서 실행하는 프로그램

    • 번역과 실행이 동시에 이루어지므로, 별도의 실행파일이 없다.
    • 언어: ruby, php, javascript, basic

Q. C 프로그램을 컴파일 하면 아래와 같은 것들이 실행된다. 수행 순서를 올바르게 나열하시오.

ㄱ. 링커(linker)
ㄴ. 어셈브러(assembler)
ㄷ. 전처리기(preprocessor)
ㄹ. 컴파일러(compiler)
A)
ㄷ -> ㄹ -> ㄴ -> ㄱ

해설)
전처리기 -> 컴파일러 -> 어셈블러 -> 링커


3. 변수

  • 변수: 데이터를 저장할 수 있는 메모리의 기억공간

  • 변수를 사용할 때는, 항상 효율적(메모리 낭비 피하는 것)으로 사용해야 한다.

  • 변수생성 규칙 및 특징

    • 예약어(키워드)는 사용할 수 없다
    • 공백을 포함할 수 없다
    • 첫 글자는 영문과 언더바(_)만 사용이 가능하다
    • 언더바(_) 이외의 특수문자는 사용할 수 없다
    • 대소문자를 구분한다
  • 변수 선언

  1. int 변수명; : 변수명이 A라면, A라는 공간이 메모리 어딘가에 생긴다. 이상한 쓰레기 값이 들어간다.
  2. int 변수명 = 초기값; : B=10이라면, B라는 공간이 메모리에 어딘가에 생긴다. 10이 B에 들어간다.

4. 변수의 종류와 유효범위

변수 종류

  1. 지역변수
  • 함수 또는 블록 안에서 선언하는 변수
  • 함수 또는 블록의 종료와 함께 메모리상에서 소멸한다.
  • 초기값이 없으면 쓰레기값이 들어간다.
  • 스택 영역에 들어간다.
#include <stdio.h>

void add(int i) {
    int sum = 0;  // 지역 변수 sum 선언 및 초기화
    sum += i;
    printf("sum: %d\n", sum);
}

void main() {
    add(10);
    add(5);
    add(3);
}

출력:
sum: 10
sum: 5
sum: 3


  1. 전역변수
  • 함수 블록 밖에서 선언하며, 전체 함수에 영향을 미친다.
  • 프로그램이 종료될 때 메모리상에서 소멸한다.
  • 초기값이 없으면 0이 들어간다.
  • 데이터 영역에 저장된다.
#include <stdio.h>

// 전역 변수 선언 및 초기화
int global_sum = 0;

void add(int i) {
    global_sum += i;
    printf("global_sum: %d\n", global_sum);
}

int main() {
    add(10);
    add(5);
    add(3);

    return 0;
}

출력:
global_sum: 10
global_sum: 15
global_sum: 18

  1. 정적변수
  • static으로 선언하며, 선언된 블록 안에서만 사용할 수 있다.
  • 함수가 종료되어도 값이 그대로 유지된다.
  • 프로그램이 종료될 때 메모리상에서 소멸한다.
  • 초기값이 없으면 0이 들어가고, 한번만 초기화 된다.
  • 데이터 영역에 저장된다.
#include <stdio.h>

int add(int i) {
    static int sum = 0;  // 정적 변수 sum 선언 및 초기화
    sum += i;
    printf("sum: %d\n", sum);
    return sum; // 반환값 추가
}

void main() {
    add(10);
    add(5);
    add(3);
}

출력:
sum: 10
sum: 15
sum: 18

전역변수 vs 정적변수

전역 변수 (Global Variable)

스코프(유효 범위):
전역 변수는 프로그램의 모든 함수에서 접근할 수 있다.
즉, 전역 변수는 프로그램 전체에서 유효합니다.

수명(생존 기간):
전역 변수는 프로그램 시작 시 생성되고, 프로그램 종료 시 소멸된다.
프로그램이 실행되는 동안 메모리에 유지된다.

메모리 영역:
전역 변수는 데이터 영역에 저장된다.

정적 변수 (Static Variable)

스코프(유효 범위):
정적 변수는 선언된 함수나 블록 내부에서만 유효하다.
즉, 정적 변수는 해당 함수나 블록 내에서만 접근할 수 있다.
다른 함수나 블록에서는 해당 변수를 참조할 수 없다.

수명(생존 기간):
전역 변수는 프로그램 시작 시 생성되고, 프로그램 종료 시 소멸된다.
프로그램이 실행되는 동안 메모리에 유지된다.

메모리 영역:
정적 변수도 데이터 영역에 저장된다.


  1. 동적변수
  • 메모리 동적할당으로 생성되는 변수
  • run time 시간에 메모리를 할당
  • 동적 기억장소에 할당하여 메모라 낭비를 피하려는 목적
  • 무조건 포인터를 사용해야함
  • 힙 영역에 저장됨
#include <stdio.h>
#include <stdlib.h>

void demonstrateDynamicVariable() {
    // 동적 변수 선언 및 메모리 할당
    int *dynamic_var = (int*)malloc(sizeof(int));
    if (dynamic_var == NULL) {
        printf("Memory allocation failed\n");
        return;
    }

    // 동적 변수 초기화
    *dynamic_var = 20;

    // 동적 변수 값 출력
    printf("Value of dynamic_var: %d\n", *dynamic_var);

    // 메모리 해제
    free(dynamic_var);
}

int main() {
    // demonstrateDynamicVariable 함수 호출
    demonstrateDynamicVariable();

    return 0;
}

demonstrateDynamicVariable 함수 내에서 dynamic_var이라는 동적 변수를 선언하고 malloc을 사용하여 메모리를 할당.
메모리 할당 실패 시 오류 메시지를 출력하고 함수 종료.
동적 변수에 값 20을 할당.
동적 변수의 값을 출력.
함수가 종료되기 전에 free를 사용하여 동적 메모리를 해제.

Value of dynamic_var: 20

profile
화려한 외면이 아닌 단단한 내면

0개의 댓글