[KOCW 한국산업기술대학교 박정민 교수님] C 프로그래밍 회고

MinWoo Park·2021년 9월 2일
0

Retrospect

목록 보기
11/11
post-thumbnail

[KOCW 한국산업기술대학교 박정민 교수님] C 프로그래밍 강의를 모두 수강하였습니다.
회고를 통해 앞으로의 어떤 태도로 무엇을 학습할지 고민하는 시간을 갖도록 하겠습니다.


강의 목차

총 19강

[KOCW 한국산업기술대학교 박정민 교수님] C 프로그래밍 1강
~
[KOCW 한국산업기술대학교 박정민 교수님] C 프로그래밍 19강


해당 강좌를 선택한 이유❓

프로그래밍을 입문하여 첫 언어로 자바스크립트를 선택했었습니다.
스크립트 언어를 선택한 덕분에 배우기 쉽고 별도의 컴파일 과정이 없어 눈에 보이지 않는 부분들을 신경 쓸 필요가 없었습니다.
그러나 전산학을 공부하기 시작하면서 눈에 보이지 않는 부분들이 궁금해 지기 시작했으며 타입 스크립트를 공부할 때 타입을 지정하는 것이 번거롭고 낯설게만 느껴졌습니다.
자바스크립트를 첫 언어로 선택하여 얻은 이점들도 많지만 많은 것이 생략되고 자유로운 자바스크립트를 했던 것이 독이 되었다는 느낌도 들었습니다.
그러나 자바스크립트, 타입스크립트, 파이썬을 공부했을 때 어느 정도의 틀은 비슷하다고 느꼈어서 이러한 프로그래밍 언어들의 초석이 되는 언어는 무엇일까 찾아보았더니 C 언어가 모든 언어의 기본이 된다는 것을 알게 되었습니다.
컴퓨터 과학과 대학교 커리큘럼에서도 공통적으로 1학년 1학기에 C 프로그래밍을 배우는 점 또한 충분히 이유가 있을 것이라고 생각이 들었습니다.
또한 인턴 생활을 하며 메모리 관리와 메모리 주소에 대한 지식이 부족하다고 느꼈기에 C 언어를 통해 프로그래밍 언어의 기초를 다지고 저의 부족한 부분들을 채워 나갈 수 있다고 판단하여 해당 강좌를 선택하게 되었습니다.


무엇을 배웠나 ✍️

  • 컴파일러
  • 소스코드가 실행되기까지의 과정
  • 포인터
  • 구조체
  • 프로세스의 메모리 공간과 동적 메모리 할당

컴파일러(Compiler)

  • 인간이 만든 프로그램을 기계가 이해하도록 기계어로 변환하는 변환기, 해석기의 역할
  • pile: 포개 놓은 것, 더미
  • compile: 엮다, 편집하다, 명령어를 번역하다.

소스코드가 실행되기까지의 과정

소스코드는 컴파일되어 오브젝트 파일이 생성되고, 링커를 통해 실행 파일이 만들어지고, 로더를 통해 메모리에 적재되어 CPU가 연산하여 프로그램이 실행되게 됩니다.

  • Step1: 소스코드 작성

프로그램 작성 시 컴파일되지 않은 코드 그대로의 파일을 소스파일 이라고 함. => .c 파일 코드 작성


  • Step2~3: 컴파일 및 링크
    .c 파일을 가져다 컴파일러가 컴파일하여 기계가 이해할 수 있는 언어로 오브젝트 파일(기계어 파일)을 생성 => .obj 파일
    .obj 파일을 가져다 링커가 링크(연결)하여 .exe 파일(실행 파일) 을 생성 => .exe

GNU 컴파일러 모음(GNU Compiler Collection,GCC), 유닉스/리눅스의 컴파일러를 사용하여 컴파일한다.
터미널에 $ gcc Hello.c 입력 시 a.out(macOS 기준이고, 윈도우는 a.exe) 파일이 생성됨.


  • Step4: 메모리에 적재
    .exe파일을 실행 시 로더가 로딩(읽어들임, 파일을 메모리에 올림)함. 그럼 CPU가 실행. => 로더가 메모리에 로딩하여 CPU가 실행

로딩은 우리 눈에 보이지 않기에 로딩과 실행은 동시에 일어남.
터미널에서 $ ./a.out 입력 시 printf 함수에 작성한 "Hello C world"가 출력됨을 확인할 수 있음.


포인터

  • 주소를 저장하는 변수
  • C언어의 장점 중 하나, 메모리 주소를 참조해서 다양한 자료형 변수들의 접근과 조작 용이
  • 메모리 주소를 참조하여 배열과 같은 연속된 데이터에 접근과 조작 용이
  • 동적 할당된 메모리 영역(힙영역)에 접근과 조작 용이
  • 포인터 변수는 4바이트 크기의 메모리 공간이 할당됨(함수 포인터도 동일)
  • 포인터 변수, 함수 포인터, 배열 포인터 변수, 포인터 배열 등 C 언어의 핵심 개념들과 관련된 중요한 개념

구조체

  • 관련 있는 데이터를 묶어서 하나의 자료형으로 그룹화하면 관리가 쉽고 코드의 가독성과 간결성이 한결 높아지는 장점을 지님
  • 하나 이상의 변수를 묶어 그룹화하는 사용자 정의 자료형
  • 같은 자료형, 다른 자료형 모두 묶을 수 있다
  • 구조체 이름과 구조체 멤버 변수를 만들어 구조체를 정의함

프로세스의 메모리 공간과 동적 메모리 할당

프로그램에서 사용되는 메모리는 정적 메모리동적 메모리가 있습니다.
정적 메모리는 언제 할당되고 해제될지 그리고 크기가 컴파일할 때 결정되는 메모리입니다.
런타임 중에 메모리의 크기를 변경할 수 없어 이러한 문제를 해결하기 위해 동적 메모리가 요구됩니다.

프로세스의 메모리 공간

  • 코드, 스택, 데이터 영역은 컴파일러가 자동으로 메모리 생성 및 해제
  • 힙 영역은 프로그래머가 관리

동적 메모리 할당의 필요성

  • 프로그래머가 필요한 메모리 크기를 예측할 수 없을 때 필요
    ex) 배열 사용 시 배열 요소 수를 5개 지정했는데 3개만 사용하면 낭비가 되고 7개를 사용하면 메모리가 부족해서 에러가 발생함
  • 런타임 중 동적 메모리 할당을 요구해서 할당이 이루어지면 힙 영역에 메모리가 할당됨
  • 동적 메모리는 포인터를 통해 접근할 수 있음

앞으로의 계획 🏃‍♂️

눈에 보이지 않던 부분은 생각조차 하지 못했었는데 C 프로그래밍을 통해 조금 더 많은 것들을 볼 수 있게 되었습니다.
당장의 프로그래밍을 하고 코드를 짜는 것보다 컴퓨터 과학의 기본적인 부분들을 학습할 계획입니다.
또한 C 언어를 기반으로 개발된 C++과 JAVA를 공부하며 객체 지향에 대해 공부할 예정입니다.
그리고 자료 구조를 공부할 때 자바스크립트로 된 자료들이 부족하여 불편함이 있었기에 C 언어로 된 많은 자료들을 찾아보면서 보다 더 깊게 학습할 예정입니다.

profile
물음표를 느낌표로 바꾸는 순간을 사랑하는 개발자입니다.

0개의 댓글