프로그래밍의 기본 원리 3

Develop Kim·2024년 10월 25일

programmers

목록 보기
34/40

0 들어가기

0-1 과정 소개

1-5 값에 의한 복사/참조에 의한 복사

1-5-1 함수와 포인터

  • 복사에는 값에 의한 복사와 참조에 의한 복사가 있음

  • 전달인자가 많을 때는 코드가 난잡해질 수 있음
  • 이때 배열을 사용하면 한번에 전달할 수 있음(메모리 주소값을 넘겨주면 되는 것, 받을 때는 포인터 변수로 받음 이 과정에서 주소값이 복사됨(참조에 의한 복사))

#include <stdio.h>

void func(int *pArr){
    for(int i = 0; i <5; i++){
        printf("함수 안의 배열 : %d\n", *(pArr + i));
    }
};

int main()
{
    int arr[] = {1,2,3,4,5};
    
    func(arr);
    
    for(int i = 0; i < 5; i++){
        printf("%d\n", arr[i]);
        printf("%d\n", &arr[i]);
    }

    return 0;
}; /*
함수 안의 배열 : 1
함수 안의 배열 : 2
함수 안의 배열 : 3
함수 안의 배열 : 4
함수 안의 배열 : 5
1
1092842016
2
1092842020
3
1092842024
4
1092842028
5
1092842032
*/ 

1-6 함수 포인터/구조체/공요체/열거형

1-6-1 함수 포인터

  • 함수도 포인터처럼 사용할 수 있음

#include <stdio.h>

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

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

int main(){
    int a =20;
    int b=10;
    
    int(*fptr)(int pa, int pb); // 함수포인터
    
    fptr = plus; // 여기서 형식이 어떻게 들어가느냐에 따라 함수가 달라짐, 여기서 포인터만 바꿔주는 것
    
    int result = fptr(a, b); // 코드를 그대로 사용
    
    printf("결과 : %d\n", result);

    return 0;
}; // 결과 : 30
  • 매개변수를 직접 받아서 해보자
#include <stdio.h>

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

int min(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 = min;
                break;
            case 3:
                return 0;
            default:
                break;
        }
    int result = fptr(a, b);
    printf("결과 : %d\n", result);
    }
    return 0;
}; // 입력값이 1, 2, 3마다 출력이 다름

  • 각각의 코드는 하나의 태생이 아니지만 자연스럽게 합체가 됨(외부모듈이지만 규격이 잘 맞음, 플러그인)
  • 함수포인터는 추후에 추가될 합체로보트의 부품을 쉽게 붙일 수 있음

1-6-2 구조체

  • 구조체는 연관성이 있는 것을 묶기 위해 사용, 변수가 많으면 정리하기 편함

  • 예를 들어 학생의 나이, 성별 등을 구분하여 저장할 수 있음

  • 학생은 구조체 이름이자 사용자인 내가 정의한 새로운 타입
  • 구분하는 이름, 나이, 키는 구조체 맴버

  • 학생이 100명이라면 구조체를 100개를 만들게 됨
  • 여기서 st는 18바이트(10, 4, 4)가 됨

  • 구조체 맴버에 직접 접근하는 경우 .을 사용, 자바스크립트의 객체 직접접근이랑 비슷

#include <stdio.h>

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

int main() 
{
    strcpy(st1.name, "김개발"); // 문자열 복사할 때 사용
    st1.age = 24;
    st1.height = 174;
    
    printf("이름: %s, 나이 : %d, 키 : %d\n", st1.name, st1.age, st1.height);
    return 0;
} // 이름: 김개발, 나이 : 24, 키 : 174

1-6-3 공용체, enum(열거형)

  • 구조체와 공용체의 차이는 메모리를 각 타입마다 가지고 있는 구조체와 달리 공용체는 메모리를 같이 사용한다는 차이가 있음(겹치는 메모리는 교집합과 같음)
  • 공용체에서 메모리를 공유하는 것 처럼 타입스크립트에서도 유니온의 타입을 공유하게 됨

  • 열거형도 구조체와 공용체처럼 사용자가 직접만드는 타입임
  • 열거형은 성격이 좀 다름, 연속된 데이터를 정의할 때 사용(요일, 날짜 등)

1-6-4 동적 메모리 할당

  • 동적 메모리는 수시로 바뀌는 데이터를 관리하기에 좋음, 런타임에 결정

#include <stdio.h>

int main() 
{
	int num;
    int *student;
    
    printf("학생 수를 입력하세요 : ");
    scanf("%d", &num);
    
    student = (int*)
    return 0;
}


  • 동적 메모리의 구조는 객체지향의 new연산자와 같은 동작을 하게됨
  • 메모리 할당이 일어나면 메모리 해제를 해줘야된다는 점을 잊지 말자

2 객체지향 철학의 이해

2-1 객체지향 철학에 대한 이해

2-1-1 객체지향 프로그래밍 방식

2-1-2 추상화

2-1-3 캡슐화

2-2 클래스의 사용 이유와 구조 이해

2-2-1 클래스의 기본

2-2-2 생성자

2-2-3 상속성

2-2-4 오버로딩

2-2-5 오버라이딩

2-2-6 인터페이스

2-2-7 람다

2-3 자바스크립트 기반의 클래스 구조와 사용방법

3 타입스크립트 기초

3-1

profile
김개발의 개발여정

0개의 댓글