카테고리 없음

C프로그래밍 12주차 수업 후 복습 과제

블로그 관리용 계정 2026. 5. 20. 12:53

출처: Smile Han의 C언어 프로그래밍

 

중요 개념

 

 

 

 

 

파란색: 많이 사용되는 함수

 

예제: time 함수 사용
lower camel case를 가장 많이 사용

 

 

#include <stdio.h>
void display(void) //정의
{
	printf("Hi~\n");
}
int main()
{
	display(); //호출, call
	display();
	return 0;
}

//함수 만들기 (1) : 전광판 함수-기말고사 1번!!!

 

#include <stdio.h>
void display(void) //정의
{
	printf("Hi~\n");
}
void doubleNumber(int x)
{
	printf("%d\n", x * 2);
}
int main()
{
	display(); //호출, call
	doubleNumber(5);
	doubleNumber(3);
	return 0;
}

//함수를 만드는 것: 함수를 정의하는 것, 함수 호출해야 함(함수이름, 매개변수 있으면()), 매개변수 x의
//자료형도 함께 써야 함, 함수 만들기(2)

 

#include <stdio.h>

// 1. 매개변수(입력)와 반환값(출력)이 모두 없는 함수
void display(void)
{
    // void는 '비어있다'는 뜻으로, 입력받는 값도 없고 반환하는 값도 없음을 의미합니다.
    printf("Hi~\n");
}

// 2. 매개변수는 있고 반환값은 없는 함수
void doubleNumber(int x)
{
    // 정수 하나(x)를 입력받아서, 함수 내부에서 바로 2를 곱해 출력합니다.
    // 반환타입이 void이므로 값을 호출한 곳으로 돌려주지(return) 않습니다.
    printf("%d\n", x * 2);
}

// 3. 매개변수와 반환값이 모두 있는 함수
int doubleNumber1(int x)
{
    // 정수 하나(x)를 입력받아서, 2를 곱한 결과값을 호출한 곳으로 돌려줍니다.
    // 값을 돌려주기 때문에 함수의 맨 앞에 반환할 데이터 타입인 'int'를 적어줍니다.
    return x * 2;
}

int main()
{
    int a; // 정수형 변수 a 선언 (현재 초기화되지 않아 쓰레기 값이 들어있음)

    // [함수 호출 1] display 함수를 실행합니다. "Hi~"가 출력됩니다.
    display();

    // [함수 호출 2] doubleNumber 함수에 인자값 5를 전달합니다.
    // 함수 내부에서 5 * 2가 계산되어 "10"이 출력됩니다.
    doubleNumber(5);

    // [함수 호출 3] doubleNumber1 함수에 인자값 3을 전달합니다.
    // 함수가 계산 결과인 6을 'return(반환)'하므로, printf("%d\n", 6); 과 같은 효과가 되어 "6"이 출력됩니다.
    printf("%d\n", doubleNumber1(3));

    // [중요] printf 함수의 반환값 활용
    // 1단계: 먼저 printf("%d\n", a)가 실행됩니다. (a는 초기화되지 않은 임의의 숫자가 출력됨)
    // 2단계: printf 함수는 '화면에 출력한 문자열의 총 개수(글자 수)'를 반환(return)하는 특징이 있습니다.
    // 3단계: 출력된 글자 수가 변수 a에 저장됩니다. (출력된 숫자 길이 + 줄바꿈 문자'\n' 1글자 포함)
    a = printf("%d\n", a);

    return 0; // 프로그램이 성공적으로 종료되었음을 운영체제에 알림
}
//함수 만들기(3)

 

#include <stdio.h>void display(void) //정의
{
	printf("Hi~\n");
}void doubleNumber(int x)
{
	printf("%d\n", x * 2);
}int doubleNumber1(int x)
{
	return x * 2;
}
int add(int x,int y)
{
	return x + y;
}
int main()
{
	int a;
	a = add(7, 3);
	printf("%d\n", a);
	display(); //호출, call
	doubleNumber(5);
	printf("%d\n", doubleNumber1(3));
	a = doubleNumber1(4);
	printf("%d\n", a);
	return 0;
} 
//함수 만들기(4)

 

#include <stdio.h>
int add(int x, int y, int z)
{
	return x + y + z;
}
int main(void)
{
	int x;
	x = add(2, 3, 4);
	printf("%d", x);
	return 0;
}

 

#include <stdio.h>

int add(int x, int y, int z)
{
	return x + y + z;
}

int main(void)
{
	int x;
	double avg3;
	x = add(8, 3, 2);
	avg3 = (double)x / 3;
	printf("%f\n", avg3);
	return 0;
}

//시험 가능성 있음

 

#include <stdio.h>
void display(void)
{
    printf("Hi~\n");
}
void doubleNumber(int x)
{
    printf("%d\n", x * 2);
}
int doubleNumber1(int x)
{
    return x * 2;
}
int add(int x, int y)
{
    return x + y;
}
char vending(int x)
{
    if (x == 1) return 'A';
    else return 'B'; 
}
int main()
{
    int a;
    char c; 
    printf("%c\n", vending(2));
    c = vending(1);
    printf("%c\n", c);
    a = add(7, 3);
    printf("%d\n", a);
    display();
    doubleNumber(5);
    printf("%d\n", doubleNumber1(3));
    a = doubleNumber1(4);
    printf("%d\n", a);
    return 0;
} //함수 만들기(5)-자판기 함수

 

#include <stdio.h>
void display(void)
{
    printf("Hi~\n");
}
void doubleNumber(int x)
{
    printf("%d\n", x * 2);
}
int doubleNumber1(int x)
{
    return x * 2;
}
int add(int x, int y)
{
    return x + y;
}
const char* vending(int x)
{
        if (x == 1) return "커피";
        else return "유자차";
}
int main()
{
    int a;
    char c; 
    printf("%s\n", vending(1));
    //c = vending(1);
    //printf("%c\n", c);
    a = add(7, 3);
    printf("%d\n", a);
    display();
    doubleNumber(5);
    printf("%d\n", doubleNumber1(3));
    a = doubleNumber1(4);
    printf("%d\n", a);
    return 0;
} //함수 만들기(6)-자판기 함수 2, 문자열의 경우 %s를 사용, const char* 시험 가능성 있음

 

#include <stdio.h>
void display(void);//선언
int main()
{
    display(); //호출, call
    return 0;
}
void display(void) //정의
{
    printf("Hi~\n");
}

//진짜 시험 1번 문제

 

원형(prototype) 기억해두기

 

 

왼쪽 -> 오룬

 

 

 

 

 

 

함수가 함수 내에서 자기 자신을 호출
실매개변수: 5, 10 / 형식매개변수: x, y - 시험!!

 

 

값에 의한 호출 (call by value) 실매개변수의 값을 형식매개변수로 전달

 

 

#include <stdio.h>
int sum(int a, int b); //함수 선언
int main(void)
{
	int a = 2, b = 5, c = 0; 
	printf("sum()호출 전 a=%d b=%d c=%d\n", a, b, c);
	c = sum(a, b); //함수 호출
	printf("sum()호출 후 a=%d b=%d c=%d\n", a, b, c); //2,5,14
	return 0;
}
int sum(int a, int b) //함수 정의, 형식매개변수(paramenter)
{
	a += 2;
	b=b+5
	printf("sum()함수 내 a=%d b=%d a+b=%d\n", a, b, a + b);
	return(a + b);
}

-위에서 call by value(값에 의한 호출)에 대한 설

제시해주신 C언어 코드는 값에 의한 호출(Call by Value)의 특징을 아주 잘 보여주는 예시입니다.

코드에 누락된 세미콜론(`;`) 등 오타를 수정하고, **Call by Value의 핵심 개념 설명**과 함께 각 라인별로 상세한 **설명 주석**을 추가했습니다.

---

## 1. Call by Value(값에 의한 호출)란?

C언어에서 함수를 호출할 때 인자(Argument)를 전달하는 기본 방식입니다.

* **핵심 개념:** 함수를 호출할 때 원래 변수가 가진 **'값'만 복사**해서 함수의 매개변수에 전달합니다.
* **특징:** 함수 내부에서 매개변수의 값을 아무리 변경해도, 함수 외부(호출한 곳)의 **원래 변수(실제 인자)에는 아무런 영향을 주지 않습니다.** 복사본을 수정했을 뿐, 원본은 그대로 유지되기 때문입니다.

---

## 2. 주석을 포함한 코드 분석

실행이 가능하도록 `b=b+5` 뒤에 세미콜론(`;`)을 추가하고, 실행 흐름과 Call by Value의 특징을 주석으로 상세히 적었습니다.

```c
#include <stdio.h>

int sum(int a, int b); // 함수 선언 (컴파일러에게 sum 함수의 형태를 알림)

int main(void)
{
    // [main 함수 영역의 지역 변수]
    int a = 2, b = 5, c = 0; 
    
    // 출력 결과: a=2 b=5 c=0
    printf("sum()호출 전 a=%d b=%d c=%d\n", a, b, c);
    
    // [함수 호출: Call by Value]
    // main의 변수 a(2)와 b(5)의 '값'만 복사해서 sum 함수로 보냅니다.
    // main의 a, b와 sum의 a, b는 이름만 같을 뿐 메모리 상에서 전혀 다른 변수입니다.
    c = sum(a, b); 
    
    // [출력 결과 확인]
    // sum 함수 안에서 a와 b를 변경했음에도, main의 a와 b는 그대로 2와 5 유지!
    // c는 sum 함수가 리턴한 결과값(14)을 받았습니다.
    // 출력 결과: a=2 b=5 c=14
    printf("sum()호출 후 a=%d b=%d c=%d\n", a, b, c); 
    
    return 0;
}

// 함수 정의 (형식 매개변수 a, b)
// 호출될 때 main으로부터 2와 5라는 값만 복사받아 새로운 메모리 공간에 저장합니다.
int sum(int a, int b) 
{
    a += 2; // sum 함수의 지역변수 a가 4가 됨 (main의 a는 영향 없음)
    b = b + 5; // sum 함수의 지역변수 b가 10이 됨 (main의 b는 영향 없음)
    
    // 출력 결과: a=4 b=10 a+b=14
    printf("sum()함수 내 a=%d b=%d a+b=%d\n", a, b, a + b);
    
    return (a + b); // 4 + 10 = 14를 반환하고 함수 종료 (이때 sum의 a, b는 메모리에서 소멸)
}

```

---

## 3. 실행 결과 흐름 한눈에 보기

코드가 실행되면 콘솔 창에는 다음과 같이 출력됩니다.

```text
sum()호출 전 a=2 b=5 c=0
sum()함수 내 a=4 b=10 a+b=14
sum()호출 후 a=2 b=5 c=14

```

> **요약하자면!**
> `sum()` 함수 내부에서 `a`와 `b`를 아무리 더하고 바꾸어도, 그것은 `sum()` 함수가 가졌던 **복사본 변수**일 뿐입니다. 따라서 함수가 끝난 후 `main()` 함수로 돌아왔을 때 원본 `a`와 `b`는 변함없이 `2`와 `5`로 유지되는 것, 이것이 바로 **Call by Value**의 성질입니다.

 

#include <stdio.h>

int sum(int a, int b); //함수 선언

int main(void)
{
	int a = 2, b = 5, c = 0;
	printf("sum()호출 전 a=%d b=%d c=%d\n", a, b, c);

	// [Call by Value] main의 a(2), b(5) 변수 자체가 아니라, 그 '값'만 복사해서 전달합니다.
	c = sum(a, b); //함수 호출

	// [Call by Value 결과] sum 함수 내부에서 값이 변경되었어도 원본 a, b는 그대로 유지됩니다.
	printf("sum()호출 후 a=%d b=%d c=%d\n", a, b, c); //2,5,14
	return 0;
}

// 형식매개변수 a, b는 main의 변수와 이름만 같을 뿐, 값을 복사받은 전혀 다른 메모리 공간입니다.
int sum(int a, int b) //함수 정의, 형식매개변수(parameter)
{
	a += 2;   // 복사본 a의 값이 변경됨 (main의 a에는 영향 없음)
	b = b + 5; // 복사본 b의 값이 변경됨 (main의 b에는 영향 없음)
	printf("sum()함수 내 a=%d b=%d a+b=%d\n", a, b, a + b);
	return(a + b);
}