2024.01.28 TIL

Oneik·2024년 1월 29일
0

함수란?

특정 작업을 수행하는 코드의 집합

함수의 기본 형식

  • 데이터 타입은 return 값의 타입 void > return 값 없음을 의미한다
  • 매개 변수 또한 타입 지정해줘야한다 ex) (int a, int b)
/*
데이터 타입 함수이름(매개 변수) {
	함수 내용
}
*/
int Plus(int a, int b) {
	return a + b;
}

함수를 사용하는 이유

  • 가독성 향상
  • 코드의 중복을 줄이고 재사용성을 높인다
  • 수정과 확장이 용이하도록 만든다

함수의 종류

표준 함수

프로그래밍 언어가 제공하는 기본 함수

  • 생산성을 높여준다
  • ex) printf

사용자 정의 함수

사용자가 직접 정의한 함수

  • 사용자가 원하는 기능을 만들 수 있다

변수의 범위

지역 변수란?

선언한 함수 블록{} 안에서만 사용 가능한 변수

  • 스택(stack) 메모리에 할당되며, 해당 함수가 종료되면 소멸한다
  • 매개 변수도 지역 변수이다

전역 변수란?

함수 밖에 선언된 변수

  • 전역 변수는 어디서든 접근 가능하다
  • 편리하지만, 치명적인 위험 존재
  • 전역 변수가 100개라면, 모든 전역 변수의 수행 순서를 알기 어렵다
  • 즉, 디버깅하기 어려워진다
  • 사용이 불가피한 경우에만 사용한다
  • 데이터 영역에 할당되며, 프로그램이 시작할 때 선언되고 종료될 때 소멸한다

스태틱(static) 변수란?

함수 블록 {}안과 밖 모두 선언 할 수 있는 변수

  • 한번 생성되면 전역 변수가 소멸될 때 같이 소멸된다(프로그램 종료 시)
  • 데이터 영역에 할당된다

배열이란?

같은 타입을 가진 변수들을 나열한 것

  • 다른 타입이 섞여 있다면, 배열이 아니다

배열을 사용하는 이유

  • 같은 타입의 변수를 선언해야하는 수가 수천개라면, 일일이 선언하기 어렵다
  • 배열을 사용하면, 같은 타입의 여러개의 변수를 간단히 선언 가능하다
  • ex) int arr[100] > 타입이 정수인 변수 100개 선언

배열의 구조

  • 인덱스는 0부터 시작한다 arr[0], arr[1] ...
// 배열의 타입 배열의 이름[길이]
int arr[100]

배열의 초기화

  • 중괄호{}를 이용하여 쉽게 초기화할 수 있다
  • int arr[5] = {1, 2, 3, 4, 5}
  • 실제 데이터의 양은 알 수 없기 때문에, 보통 배열을 만들 때, 길이를 생략한다

배열의 복사

  • 배열의 이름은 상수
  • 변수처럼 arr2[5] = arr1[5]와 같은 방식으로 복사할 수 없다
  • 배열은 요소끼리 복사해야 한다
#include <studio.h>

int main()
{
	int arr1[5] = {1, 2, 3, 4, 5};
    int arr2[5];
    
    for(int i = 0; int < 5; int++) {
    	arr2[i] = arr1[i];
    }
    
    return 0;
}

문자열과 배열

  • 문자열에 이름을 붙여주면 변수로 사용할 수 있다
  • char str[100] = "Beautiful";
  • 문자열의 끝에는 null값을 추가해줘야한다

문자열의 끝에 null값을 추가해줘야 하는 이유

  • 위 그림의 str이라는 문자열은 100바이트의 크기를 가지고 있지만, 9바이트 만큼만 차지하고 있다
  • 나머지 공간은 쓰레기 값으로 채워질 것인데, 컴퓨터는 문자열과 쓰레기 값을 구분할 수 없다
  • 컴퓨터가 문자열과 쓰레기 값을 구분하도록 문자열 끝에 null 값을 넣어준다

포인터 변수란?

특정 변수의 주소값만을 가리키는 변수

  • 4바이트의 크기를 가지고 있다
  • 포인터 변수는 특정 변수를 장악하여 제어할 수 있다
  • 크롬 원격 데스크톱을 이용하여 집에서 회사 컴퓨터를 제어하는 것과 같다
  • 간접 참조라고 한다

포인터 변수 예시

int main()
{
	int b = 100;
	int *pB = &b; // 포인터 선언(*)
	
	printf("b = %d\n", b);
	printf("b = %p\n" &b); // 주소연산자(&)
	// printf 안의 * : 포인터 변수가 가리키는 변수의 메모리에 저장된 값을 가져온다
    printf("*pB = %d\n", *pB); 

	return 0;
}

/* 출력값
b = 100
&b = 0x7ffffde8950c
pB = 0x7ffffde8950c
*pB = 100
*/

포인터와 배열

  • 배열의 이름도 포인터이다
  • 배열의 첫번째 주소값을 배열의 이름이 가리킨다
  • 일반 포인터와 다르게 배열의 이름은 상수이다
  • 즉, 배열의 이름은 포인터이지만, 상수이기 때문에 변경할 수 없다

예시

int main()
{
    int arr[] = {1,2,3,4,5};
    for(int i = 0; i < 5; i++) {
        printf("%p\n", &arr[i]);
    }
    
    printf("배열의 이름 : %p\n", arr);
    
    return 0;
}
/* 출력값
0x7ffef92f3a60
0x7ffef92f3a64
0x7ffef92f3a68
0x7ffef92f3a6c
0x7ffef92f3a70
배열의 이름 : 0x7ffef92f3a60
*/

값에 의한 복사

  • 전달하는 변수는 실인수, 전달 받는 변수를 형식 인수라 한다
  • 변수를 전달한다는 것은 메모리를 공유한다는 것이 아니다
  • 전달하는 변수를 새로운 메모리 공간에 복사하는 것이다

참조에 의한 복사

  • 함수의 전달 인자가 여러개일 때, 일일이 적는 것은 비효율적이다
  • 함수의 인자로 배열의 이름을 전달한다면, 배열의 이름을 통해 배열에 접근할 수 있다

함수 포인터

  • 함수를 포인터처럼 사용할 수 있다
  • 함수 포인터는 함수의 주소값만을 가리킨다
  • 함수 포인터 또한 타입과 형식이 같아야한다

작성 방식

// 타입(*함수 포인터 이름)(인자 목록)
int (*func)(int a);

예시

#include <stdio.h>

int Plus(int a, int b) {
    return a + b;
}

int Minus(int a, int b) {
    return a - b;
}

int main()
{
    int a = 20;
    int b = 10;
    int select = 0;
    
    int (*fPtr)(int pa, int pb);
    
    while(1) 
    {
        scanf("%d", &select);
        // 어떤 함수의 주소를 가리키느냐에 따라 
        // 결과값이 달라짐
        switch(select) {
            case 1:
                fPtr = Plus;
                break;
            case 2:
                fPtr = Minus;
                break;
            case 3:
                return 0;
            default:
                break;
        }
        // 코드는 바꾸지않고 포인터만 바꿔줌으로써 
        // 결과가 달라짐
        int result = fPtr(a, b);
        printf("결과값 : %d\n", result);
    }
    return 0;
}

함수 포인터를 사용하는 이유

  • 메모리의 크기 및 위치가 결정되는 시점은 컴파일 시점 또는 런타임 시점이다
  • 정적 바인딩은 컴파일 시점에 결정되고, 동적 바인딩은 런타임 시점에 결정된다
  • 함수 포인터를 이용하면, 동적 바인딩이 가능해서 프로그램의 유연한 확장이 가능해진다
  • 예시로 Visual Studio Code의 extension기능이 있다
  • extension기능 들은 플러그인 방식으로 동작하는데, 새로운 기능을 추가할 때 마다 다시 컴파일 해야하는 불편함을 없앨 수 있다
profile
초보 개발자의 블로그입니다

0개의 댓글

관련 채용 정보