함수포인터
- 함수의 주소값을 저장함.
사용 예시 - 어떤 함수를 실행할 것인지 정할 때 사용됨 ( 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-개) => 그림자(삽살개, 치와와 등 - 본질에서 파생)
- 원형이 다양한 모양으로 나타남.
캡슐화
- 은닉하다. 숨긴다는 의미
- 캡슐화한다는 것은 외부에서 그 내부를 볼 수 없게한다는 의미
- 외부로부터 데이터를 조작할 인터페이스가 필요 => 메소드
- 클래스 = 데이터 + 메소드
'타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) > TIL' 카테고리의 다른 글
데브코스 12주차 Day 1 - 타입스크립트, 환경설정 (0) | 2024.02.02 |
---|---|
데브코스 11주차 Day5 - 클래스, 인터페이스, (상속성, 다형성 - 오버로딩 오버라이딩) (0) | 2024.01.29 |
데브코스 11주차 Day 3 - 변수와 메모리 생명주기, 배열과 포인터 with C (0) | 2024.01.27 |
데브코스 11주차 Day 2 - 연산자 / 조건문 with C (0) | 2024.01.25 |
데브코스 11주차 Day1 - 컴파일, 변수와 메모리영역 with C (3) | 2024.01.25 |