일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 자바
- 머신러닝
- 파이썬라이브러리
- 자바 실습
- SQL
- html/css
- numpy/pandas
- 정수와유리수
- 연습문제
- 정보처리기사실기
- 파이썬
- C++
- 운영체제
- 중학1-1
- 텍스트마이닝
- 영어공부
- 컴퓨터비전
- pandas
- 딥러닝
- 컴퓨터구조
- 데이터베이스
- JSP/Servlet
- 정보처리기사필기
- CSS
- 중학수학
- 혼공머신
- CNN
- 데이터분석
- 데이터입출력구현
- 코딩테스트
- Today
- Total
클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지
C 언어 기본 프로그램 만들기 - C 언어 탄생 배경과 역사, 컴파일 과정 본문
그동안 C 언어로 분류되어 있었던 코딩 공부 시리즈를 코딩테스트로 바꾸고 새로 C 언어 시리즈를 만들기로 했다.
코딩 테스트는 문제 풀이 위주로 학습한 내용을, C 언어는 책 위주로 공부한 것을 정리해 볼 것이다. 이번주에는 코딩 테스트 문제 풀이 위주로 공부했더니 개념이 잘 안 잡히는 걸 느꼈다.
깊이 있는 공부를 위해서는 책 학습이 선행되어야 한다는 걸 느끼는 시간이었다.
하지만 책이나 동영상 강의로만 학습하면 문제를 푸는 감이 떨어질 수도 있다. 그러니 이 2가지를 함께 하는 게 좋을 것 같다.
프로그래밍 세계에 입문하다!
프로그래밍 언어는 컴퓨터가 이해할 수 있는 정확한 표현의 규칙을 정의해 놓은 것이다. 프로그래밍 언어는 정말 다양해서 처음 이 언어를 시작하는 사람들은 어떤 것을 해야 할지 고민이 된다.
어떤 언어를 먼저 배우느냐는 정말 중요한 것 같다. 난 유니티 개발 개발을 시작할 때 유니티에서 사용하는 언어가 C#이라 이 언어를 가장 먼저 배웠다.
그리고 유니티를 배우는 중에 나중에 회사에 들어가게 되면 언리얼 엔진을 다루게 되는 경우가 많다는 걸 들었다.
언리얼은 C++로 되어 있어 사실 언리얼을 배우기도 전에 정말 두꺼운 C++ 전공서를 구입했다. 4만 5천 원이 넘었던 걸로 기억한다. 근데 이 언어를 공부하려고 동영상 강의를 듣는데 대부분 C 언어를 알고 있다는 전제 하에 수업을 진행하는 거였다.
할 수 없이 C 언어부터 공부하기로 마음 먹고 책 2권을 구입했다. 공부를 한지 몇 달이 지났지만 아직 난 개념을 잡지 못했다.
아마도 공부하는 방법을 모르고 그냥 하다보니 머릿속에 잘 들어오지 않았던 것 같다.
지금은 프로그래밍 공부를 어떻게 해야 할지 어느 정도 알게 되었다. 이전에 배웠던 건 수박 겉핧기라고 생각하고 다시 처음부터 꼼꼼히 학습해 보기로 했다.
1. 프로그래밍과 C 언어
🌵 컴퓨터 언어의 종류
1. 기계어 : 01011과 같은 0과 0의 조합으로 구성된 2진수로 0일 때는 동작하지 않고 1일 때는 동작하는 컴퓨터가 이해할 수 있는 유일한 언어
2. 어셈블리 언어 : 어셈블러(assembler)라는 프로그램으로 기계어로 변환해서 실행
3. 고급 언어 : C, C++, Java, Python 등 현재 대부분의 언어
🌵 C 언어의 탄생
C 언어
1972년, 유닉스(UNIX, 운영체제의 일종) 시스템에 사용하기 위해 켄 톰슨이 만든 B 언어를 데니스 리치가 발전시켜 만든 언어이다.
ALGOL60 : 구문이 정교한 현대적 프로그래밍 언어였지만 너무나 구문이 정교한 나머지 배우기가 힘들었음
CPS, BCPL : ALGOL을 기초로 개발됨
1969년 개발된 초기 유닉스는 대부분 어셈블리어로 작성되어 컴퓨터 하드웨어가 바뀌면 유닉스를 다시 개발해야 하는 문제가 있었다. 이런 불편을 해결하고자 데니스 리치는 하드웨어에 상관없이 사용할 수 있는 C 언어를 만들었다.
B 언어
1970년 AT&T사의 Bell 연구소에서 만든 언어로 운영체제를 만들기 위해 만든 언어이다. Ken Thompson은 UNIX라는 새로운 OS를 만들게 되었다. 이 유닉스는 초기에 B 언어와 어셈블리 언어로 만들어진 OS이다.
C 언어를 만들게 된 배경
어셈블리어 언어를 되도록 적게 사용하는 유닉스로 만들기 위해 C 언어를 개발
이후 C 컴파일러를 개발하는 히사마다 제각각 C 언어를 만들게 되어 전 세계적인 표준 C 언어 문법의 필요성이 대두되었고, 1983년에 ANSI에서는 표준 c 언어를 만들기 위한 위원회를 조직
C++ 언어
1979년 Bell 연구소의 Bjarne Stroustrup이 “C with Classes”란 이름으로 개발한 언어. C 언어에 클래스 개념을 추가한 언어로 대표적인 객체지향 프로그래밍 언어이다.
캡슐화, 상속성, 다형성을 구현하는 많은 문법을 추가로 가지고 있다. C 언어의 문법을 포함하고 있지만 프로그래밍하는 스타일은 완전히 다르다.
🌵 C 언어의 장점
시스템 프로그래밍이 가능하다
운영체제를 개발할 목적으로 만든 언어
이식성을 갖춘 프로그램을 만들 수 있다
- 이식성이란 기종이 다른 컴퓨터에서도 올바르게 작동하는 성질이다. 표준을 지켜 프로그램을 만들면 이식성을 갖추게 되어 컴퓨터의 종류가 바뀌더라도 그 프로그램을 계속해서 활용 가능하다.
함수를 사용해 개별 프로그래밍이 가능하다
함수를 사용해 기능별로 프로그래밍 할 수 있으므로 개발 과정에서 에러를 수정하기 쉽고, 개발된 후에도 프로그램의 유지보수에 도움이 됨
2. 컴파일과 컴파일 과정
🌸 전처리
전처리 지시자에 따라 소스 파일을 가공하는 과정이다.
#include : 프로그램에 필요한 함수 중 외부에 있는 함수를 불러들이다. 전처리 과정은 소스 파일을 컴퓨터에 맞게 편집하는 일이므로 전처리를 수행해도 파일의 형태는 달라지지 않음
🌸 컴파일
- 원시 프로그래밍(소스 코드) : 프로그래머가 작성한 프로그램. C 언어로 작성한 문서
- 컴파일(compile) : 고급 언어를 기계어로 번역하기 위해 번역가에 해당하는 컴파일러(compiler)나 통역가에 해당하는 인터프리터(interpreter) 프로그램이 필요 <소스파일을 기계어로 바꾸는 과정>
- 번역가 : 처음부터 끝까지 한꺼번에 결과를 번역
- 통역가 : 매 대화마다 번역해주는 것
- C 언어는 컴파일러를 이용하여 한꺼번에 번역. 대표적인 컴파일러는 GCC, Microsoft Visual C++, Clang 등이 있음
🌸 링킹(linking)
컴파일하여 만들어진 각 오브젝트 파일을 연결하거나 사용한 라이브러리(library, 자주 사용하는 모듈을 미리 컴파일해 놓은 것)와 연결하는 작업. 링킹 후에 비로소 실행파일을 얻을 수 있음
🌸 디버깅(debugging)
- 오류(error) 또는 버그 : 컴파일과 링킹 과정에서 소스 코드에 오류가 있는 것
- 디버깅 : 이러한 버그를 수정하여 프로그램이 실행 가능하도록 하는 작업
- 경고(warning) 메시지 : 실행 파일은 만들어지지만 컴파일러가 오류의 가능성이 있다고 하는 메시지이므로 무시하면 안됨
3. 프로그램 만들기
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
printf("Be a Game Developer!");
system("pause");
return 0;
}
C 언어 프로그램은 이렇게 만든다. 비주얼 스튜디오에서 C#으로 프로젝트를 만들었는데, 이걸 C 언어로 바꾸는 작업은 무척 어려웠다.
몇 가지 설정을 해주어야 하나 이 부분은 생략하겠다. 검색을 하면 자세히 설명이 되어 있다.
학습을 마치고
이렇게 C 언어가 만들어진 배경과 역사, 기본적인 개념에 대해서 학습해 보았다. 전에 노션에 만들어놓은 것들이라 다시 정리하는 데는 많은 시간이 걸리지 않았다.
하지만 노션에 있다보니 다시 글을 확인하는 일이 별로 없었다. 2~3주 전에 공부했던 내용인데 공부를 했다는 사실조차 잊고 있었다.
그래서 사람들이 블로그를 이용하는 것 같다. 하지만 원본은 노션이 관리하기에 편리하다. 공부한 내용까지 정리를 마치면 다시 노션에 정리하며 공부를 이어가 볼 생각이다~
다음 포스트에는 상수와 데이터를 출력하는 작성법에 대해서 학습해보려고 한다.
'프로그래밍 언어 > C 언어' 카테고리의 다른 글
연산자 1 - 산술 · 관계 · 논리 연산자 (0) | 2024.07.30 |
---|---|
변수와 데이터 입력 2 - 데이터 입력 (0) | 2024.07.30 |
변수와 데이터 입력 1 - 변수 (0) | 2024.07.30 |
상수와 데이터 출력 2 - 상수와 데이터 표현 방법 (0) | 2024.07.30 |
상수와 데이터 출력 1 - C 언어 프로그램의 구조와 데이터 출력 방법 (0) | 2024.07.30 |