본문 바로가기
타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js)/TIL

데브코스 11주차 Day4 - 함수포인터, 구조체/공용체/열거형, 동적 메모리

by 슈크림 붕어빵 2024. 1. 28.

함수포인터

  • 함수의 주소값을 저장함.

사용 예시 - 어떤 함수를 실행할 것인지 정할 때 사용됨 ( 0이 입력되면 add 함수, 1이 입력되면 sub 함수)

#include <stdio.h>
int add(int a, int b){
    return a+b;
}
int sub(int a,int b){
    return a-b;
}
int main() {
    int a = 20; int b = 15; int select;
    int (*func)(int pa,int pb);

    scanf("%d",&select);
    switch (select) {
        case 0:
            func=add;
            break;
        case 1:
            func=sub;
            break;
        default:
            printf("default\n");              
    }
    
    printf("%d",func(a,b));    
    return 0;
}

 

궁금증 : 왜 함수 포인터를 사용할까? 그냥 호출하면 되는데

  • 메모리의 크기 및 위치가 결정되는 시점은 컴파일 타임 또는 런타임 시점이다.
  • 컴파일 시점에 결정은 정적 바인딩, 런테임 시점의 결정은 동적 바인딩 되었다고 한다.
  • 함수 포인터의 사용은 프로그램의 유연한 확장성을 제공한다.

예시

  • visual studio code에서 사용되는 extension들은 플러그인 방식으로 동작한다.
  • 새로운 기능을 추가하게 되면 매번 다시 컴파일을 해야하는 불편함이 있으나 플러그인 방식을 사용하면 그럴 필요가 없다.
  • 함수 포인터의 사용은 프로그램의 유연한 확장성을 제공한다.
  • 코드의 규격을 맞춰놓을 수 있다는 장점이 있다. 다시 말하면 extension이 있는 경우 그 것을 받을 준비를 해두고 연결해서 사용할 수 있다는 것이다.

예시

  • 정적 바인딩 => int a = 10 ; in C (컴파일 시점에 4byte로 할당하고 시작)
  • 동적 바인딩 => var a = 10; in JS (10이 정수인 것을 확인하고 할당)

 

구조체

  • 하나 이상의 서로 다른 종류의 변수들을 묶어서 새로운 데이터 타입을 정의하는 것, 사용자 정의 자료형
  • 연관된 변수들을 하나로 묶어서 관리함 = > 데이터 관리에 용이
  • .을 통해 접근하는 것을 직접접근이라고 한다.

 

예시 - 학생 5명의 이름과 나이를 받아 구조체에 저장

#include <stdio.h>
#include <string.h>

struct student {
    int age;
    char name[10];
};

int main() {
    struct student st[5];  

    for (int i = 0; i < 5; i++) {
        scanf("%s", st[i].name); 
        scanf("%d", &st[i].age); 
    }

    for (int i = 0; i < 5; i++) {
        printf("학생 %d - 이름: %s, 나이: %d\n", i + 1, st[i].name, st[i].age);
    }

    return 0;
}

 

공용체

  • 공용체도 사용자 정의 자료형
  • 구조체와의 차이점: 메모리공간을 공유함.
struct st {
    char a;
    int b;
    double c;
};
union nu {
    char a;
    int b;
    double c;
}

 

열거형

  • 사용자 정의 함수
  • enumeration의 약자로 enum이라고 읽는다.
  • 데이터들을 열거한 집합 (주로 연속적인 데이터)
  • 컴파일러는 열거형 멤버들을 정수형 상수로 취급

사용 예시 - 요일을 숫자로 저장하고, 입력받은 숫자에 따라 switch문으로 출력

enum week {
    sun=0,
    mon,
    tue,
    wed,
    thu,
    fri,
    sat,
};
int main() {
    int day;

    scanf("%d",&day);

    switch (day) {
        case sun:
            printf("일요일");
            break;
        case mon:
            printf("월요일");
            break;
        case tue:
            printf("화요일");
            break;
        case wed:
            printf("수요일");
            break;
        case thu:
            printf("목요일");
            break;
        case fri:
            printf("금요일");
            break;
        case sat:
            printf("토요일");
            break;
        default:
            printf("잘못 입력하였습니다.");
            break;
            
    }

    return 0;
}

 

메모리 구조

메모리 영역

  • 코드영역
    • 실행할 명령어들이 순서대로 쌓인다. cpu가 이 영역에서 명령어들을 하나씩 가져다 처리한다.
  • 스택영역
    • 지역변수 매개변수 저장 
    • LIFO로 생성되고 소멸된다.
    • 변수가 생성된 지역이 소멸될 때 함께 소멸
  • 힙 영역
    • 힙은 컴퓨터 메모리의 일부가 할당되었다가 회수되는 일들의 반복
    • 힙은 컴파일시가 아닌 실행시 사용자로부터 할당 메모리를 입력받음
  • 데이터 영역
    • 전역 변수와 static 변수가 저장되는 메모리영역. 이 메모리는 프로그램 종료시 소멸

 

참고 - 콜스택과 메모리힙

https://bsu0404.tistory.com/108

 

데브코스 11주차 Day1 - 컴파일, 변수와 메모리영역 with C

강사님: 이창현 강사님 타입스크립트를 왜 쓸까요? 1. 심심해서 2. 부모님의 권유료 3. 유교적인 관습때문에 차차 알아가볼 것이다. 컴퓨터가 해석하는 방식 1. 컴파일 언어- 코드 전체를 한번에

bsu0404.tistory.com

 

동적 메모리 할당

  • 학생에 대한 정보를 저장할 배열을 만든다고 해보자. 
  • 학생수는 유동적이므로 학생수를 입력받아 배열을 만들 것이다.

 

잘못된 예시

int main() {
    int num;
    scanf("%d",&num);
    int student[num];
    return 0;
}

=> 잘못된 이유 : scanf는 런타임에 실행 , int student[num]은 컴파일 타임에 실행 => 런타임에 받은 num을 컴파일 타임에 실행할 수 없음 => 동적할당

 

동절 메모리 할당과 메모리

#include <stdio.h>
#include <stdlib.h>

int main() {
    int num;
    int *student;

    scanf("%d",&num);
    student = (int*) malloc(sizeof(int) * num);

    printf("할당된 메모리: %ld", sizeof(int) * num);

    free(student);
    
    return 0;
}

 

객체

  • 객체: object, 사물을 나타내는 추상적인 개념
  • 지향: oriented, ~를 향한다.

 

  • 구조적 프로그래밍
    • 순차적, 하향적, 폭포수 방식
    • 기능적인 기본 단위는 함수이다.
  • 객체지향 프로그래밍
    • 기능 단위는 객체이다.
    • 대표적인 예: 이벤트 기반의 모든 프로그램

추상화

  • 추상: 대상에서 특징만을 뽑아낸 것
  • ex ) 진돗개, 삽살개, 치와와 => 개
  • 플라톤의 이데와와 비유
    • 동굴 속 => 불빛 => 본질(ex-개) => 그림자(삽살개, 치와와 등 - 본질에서 파생) 
    • 원형이 다양한 모양으로 나타남.

 

캡슐화

  • 은닉하다. 숨긴다는 의미
  • 캡슐화한다는 것은 외부에서 그 내부를 볼 수 없게한다는 의미
  • 외부로부터 데이터를 조작할 인터페이스가 필요 => 메소드
  • 클래스 = 데이터 + 메소드