VEDA(한화비전 아카데미) 1기 : 1주차 기록

액상과당·2024년 8월 4일


👍🏻 이번 주 수업에서 좋았던 점 Liked

  • 컴퓨터과학을 전공한 사람으로서 C언어를 배우는 것이 복습하는 느낌이 강할 것이라 생각했는데 전혀 아니었다! 새로 배우는 내용도 많아 수업에 집중할 수 있었다. 또한 저학년에 배웠던 내용을 졸업 후 다시 배우니 이해의 깊이가 다른 것 같다는 느낌도 든다.

📚 이번 주에 새롭게 배운 점 Learned

  • CRT
    C Runtime으로, C 프로그램의 실행 환경을 구성하고, 프로그램이 시작될 때 필요한 초기화를 수행한다. 이는 프로그램의 main 함수가 호출되기 전에 수행되며, 프로그램이 종료될 때는 자원을 정리하고 해제하는 역할도 한다. CRT가 없다면 개발자는 이러한 저수준의 초기화 및 자원 관리 코드를 직접 작성해야 할 것이다! (임베디드에서는 StartUpCode가 있다)
  • 컴파일 과정 [ 출처 | CSAPP ]
    • 전처리
      소스 코드를 컴파일하기 전 주석 제거, 매크로 처리, 파일 포함 등의 작업 수행
    • 컴파일
      전처리된 소스 코드를 어셈블리 코드로 변환하여 기계어로 번역한다
    • 링크
      여러 개의 객체 파일과 라이브러리를 결합하고, start-up 코드를 포함하여 실행 가능한 하나의 프로그램을 생성

      a.c : c-source / ASCII
      (pre-processing by preprocessor)
      gcc -E
      a.i : intermediate file / ASCII
      (compile)
      gcc -S
      a.s : assembly file / ASCII
      gcc -c
      a.o : object file / ELF
      .TEXT (instruction)
      .DATA (초기화O 전역변수)
      .BSS(초기화X 전역변수)
      .RDATA(:const)

      ( localte / link )
      gcc -o
      a.exe : executable file / ELF
      HDD: +CRT, +libc
      RAM: +.heap, +stack
      a.bin : binary file / plat data format

  • 연산자 우선 순위
    [ 출처 | http://codingbank.weebly.com/datatypes.html ]
    기본적으로 1순위와 2순위 정도는 외우고 있으면 포인터 배열이라든지 함수 포인터라든지... 포인터 사용 시 유용하다.
  • 포인터
    다른 변수의 메모리 주소를 저장하는 변수. 포인터로 메모리 관리, 배열, 문자열 처리, 함수 호출, 동적 메모리 할당 등을 할 수 있다. 배열의 경우, 배열명은 상수 포인터로 작동한다! 특히 함수 포인터를 다루며 타입을 정확히하는 게 재미있었다.
  • 데이터의 메모리 적재 [ 출처 | https://mirzafahad.github.io/2021-05-08-text-data-bss/ ]
    #include <stdio.h>
    #include <stdlib.h>
    
    int initialized_global = 10;  // .data 섹션
    int uninitialized_global;  // .bss 섹션
    static int initialized_static = 20;  // .data 섹션
    static int uninitialized_static;  // .bss 섹션
    const char *message = "Hello, World!";  // .rdata 섹션
    
    void function() {
        int local_var = 30;  // 스택 영역
        int *heap_var = (int *)malloc(sizeof(int) * 5);  // 힙 영역
        if (heap_var != NULL) {
            for (int i = 0; i < 5; i++) {
                heap_var[i] = i * 10;
            }
            for (int i = 0; i < 5; i++) {
                printf("%d ", heap_var[i]);
            }
            free(heap_var);  // 할당된 메모리 해제
        }
    }
    
    int main() {
        function();
        return 0;
    }
    • 코드 영역 (.text): 실행 가능한 기계어 코드 저장
    • 데이터 영역:
      • .data: 초기화된 전역 변수와 정적 변수
      • .rdata: 읽기 전용 데이터 (상수)
      • .bss: 초기화되지 않은 전역 변수와 정적 변수 (프로그램 시작 시 0으로 초기화)
    • 힙 영역 (Heap): 동적 메모리 할당
    • 스택 영역 (Stack): 지역 변수, 함수 매개변수, 함수 호출 시의 반환 주소
  • Static
    lifetime 관여: 변수가 .data에 잡히게 함
    scope 관여 : 전역변수의 범위 한정 (여러 파일을 링크했을 시)

🧐 배운 것에 관련해서 내가 부족했던 점 Lacked

  • 여태 내가 얼마나 기계적으로 코딩을 했는지 알 수 있었다. #define _CRT_SECURE_NO_WARNINGS을 사용하며 CRT가 뭐길래 이런 매크로를 작성하나 생각만 했던 지난날이 조금 부끄럽다...
  • 사실 이제까지 포인터를 대충 감으로 이해하고 있었다. 그러나 수업을 통해 asterisk(*)와 ampersand(&), []의 수에 유의하며 코드를 이해하고 작성할 수 있게 됐다! 그러나 아직도 포인터가 어렵다…
  • 소스 코드 내의 데이터가 메모리에 어떻게 잡히는지도 알 수 있었다. 이건 학부 때 대충 이해하고 넘어갔었는데 구체적으로 배우니 재미있다. 괜시리 메모리와 친해진 기분도 든다. 괜시리 메모리와 친해진 기분도 든다.

📝 앞으로 무엇을 더 하면 좋을지 Longed for

  • 앞으로는 머리에 물음표가 생기면 바로 느낌표로 만들어야지! 기계적으로 코드를 작성하는 사람이 되지 말자.
  • 한 발 다가가면 두 발 물러나는 포인터... 🥲 여러 문제 풀어 보거나 미니 프로젝트에서 포인터를 적극 사용해 보면서 포인터와 와 더 친해지는 시간을 가져야 할 것 같다.
  • 소스 코드 내의 데이터가 메모리에 어떻게 잡히는지 배우고 나니 컴퓨터 구조를 개인적으로 복습해 봐야겠다는 생각이 든다.

VEDA 바로가기 : www.vedacademy.co.kr
VEDA(한화비전 아카데미) 영상으로 확인하기 : https://url.kr/zy9afd
본 후기는 VEDA(한화비전 아카데미) 1기 학습 기록으로 작성되었습니다.

0개의 댓글