==개요== 이 문서는 도서 <윤성우 저 열혈 C 프로그래밍>을 각색한 것... 이었는데 솔직히 저 책 틀린 내용과 오개념이 너무 많아서 수정하였다. 본 문서를 수정한 필자는 개인적으로 저 책을 추천하지 않는다. 저 책은 쓰여진 기준이 너무 과거이고, 아래는 현대에 맞도록 내용이 변경되었다. ===C언어의 개론적인 내용=== {{{+1 '''C언어는 프로그래밍 언어(Programming language)이다.'''}}} 프로그래밍 언어란, 컴퓨터와의 대화에 사용되는 '대화수단'이다. 그런데 컴퓨터는 사람의 말을 이해하지 못하고, 사람 역시 컴퓨터의 언어를 이해하지 못한다. 물론 사람은 컴퓨터의 언어를 공부할 수 있지만, 기계어를 직접 공부하는건 너무 어렵다. ~~그런데 17기엔 어셈블리어를 구사할 수 있는 능력자가 있지~~ 그래서 컴퓨터와 인간 사이에는 통역가가 존재하고, 그 이름은 ''' '컴파일러(Compiler)' '''이다. 그러나 통역가 컴파일러도 한국어를 구사하진 못한다. 하지만 컴파일러는 프로그래밍 언어를 이해할 수 있고, C언어는 이러한 프로그래밍 언어의 일종이다. * '''프로그래밍 언어란?'''[br]사람과 컴퓨터가 이해할 수 있는 약속된 형태의 언어로, C언어, Python, JAVA, kotlin 등이 있다. * '''컴파일러의 역할은?'''[br]어떤 프로그래밍 언어로 작성된 프로그램을 다른 언어로 번역하는 역할을 한다. 또한 이러한 일을 ''' '컴파일(compile)' '''이라 한다. C언어 컴파일러의 경우에는, GCC 등의 컴파일러가 C언어를 컴퓨터가 이해할 수 있는 언어인 기계어로 번역한다. {{{+1 '''C언어의 역사와 특징'''}}} C언어는 1971년에 개발된 고급(high-level)언어로, '어셈블리(assembly) 언어' 라는 저급(low-level)언어를 대체하기 위해 만들어졌다. 이 이유는 여러가지가 있지만, 결과적으로는 어셈블리어가 우선 사람이 배우기 어렵고, 또 배운다고 하여도 활용에 여러가지 제약이 따르기 때문이다. (어셈블리어는 하드웨어 의존도가 높고, 이를 '이식성이 낮다.'라고 표현한다.) 이 어셈블리어를 대체하기 위해 어셈블리어의 저급 언어적인 특징을 지니면서 이식성이 좋고, 동시에 사람이 배우기도 쉬운 언어를 만들었는데, 그게 C언어이다. (여담으로, C언어의 이름이 'C'언어인 이유는 B언어 다음에 만들어졌기 때문이다. Computer 언어가 아니다.) 참고로 여기서 말하는 저급(low-level)언어와 고급(high-level)언어는 컴퓨터가 이해하기 쉬울수록 저급, 사람이 이해하기 쉬울수록 고급으로 구분한다. 질이 낮은 언어와 질이 높은 언어가 아니다. 또한 두 언어에 모두 장단점이 있으니 무조건적으로 고급언어가 저급언어보다 좋다고 생각하는건 옳지 않다. {{{+1 '''C언어의 특징'''}}} * '''C언어는 절차적 프로그래밍(Procedural programming)언어 이다.'''[br]C언어는 절차적 프로그래밍 언어로, 순차적 프로그래밍 언어와 대비해서 여러 함수(프로시저의 일종이다.)를 구성하고, 실행중에는 호출하고 재사용하는 방식으로 프로그래밍 한다. 또한 객체지향 언어와 비교하면 C언어는 객체 자체를 사용하지 않는다. (C언어를 개량한 C++은 객체를 사용한다.) 책에는 C언어가 절차적 프로그래밍 언어이기 때문에 배우기 쉽다고 기술하였지만, 오히려 다른 고급 언어로 넘어가기 상당히, 상당히 어려운 언어에 속한다. 이는 [[Python]]과 [[Kotlin]] 등 다른 고급 언어를 배우게 되면 체감할 수 있다. C언어를 처음으로 배우는 이유는 배우기 쉬워서가 아니라, 컴퓨터의 구조를 깨우치기 쉬운, 컴퓨터와 가까운 언어이기 때문이다. (프로시저 프로그래밍이 무조건적으로 좋은 방식은 아니며, 같은 코드인데 인라인 형식으로 구성된 코드와 비교하면 훨씬 많은 메모리 접근을 요구해서 이론적으로는 실행시간, 메모리 부분에서 오히려 손해이다. --근데 요즘엔 컴파일러가 워낙 좋아서 딱히 상관 없다.--) * '''C언어로 짜여진 프로그램은 이식성이 좋다.'''[br]이 부분은 약간 애매한데, C언어가 이식성이 좋다는건 어셈블리어에 비교해서이다. 현재는 다른 어떤 언어에 비교해도 C언어가 이식성이 객관적으로 좋지는 않다.[* 가상머신(JVM) 위에서 돌아가는 [[Java]], [[Kotlin]], 인터프리터 위에서 돌아가는 [[Python]]과 비교하면...] 그나마 C언어의 이식성은 오버헤드가 거의 없다는 독보적인 장점이 있었지만, 그마저도 [[Rust]]의 등장으로 희석되었다. C언어가 개발될 당시인 과거에는 원래 사용하던 어셈블리어 보다 장점이 많았었지만, 현재는 C언어로부터 만들어지거나, 혹은 새로 개발되어진 많은 언어가 존재하고, 그들은 C언어보다 다방면에서 좋은 성능을 자랑한다. * '''C언어로 짜여진 프로그램은 좋은 성능을 보인다.'''[br]이것은 절대적인 장점은 아닌데, 물론 만드는 방법에 따라 달라지겠지만, 성능을 중심으로 하는 소프트웨어의 경우, C언어로 개발하면 메모리도 상대적으로 적게 사용하고, 속도도 빠르게 할 수 있다. --속도만 놓고 보자면, 가장 최적화된 알고리즘을 짰다고 가정할 때 [[포트란]]이 제일 빠르다.-- 이 밖에도 C언어는 많은 장점을 가지지만, C언어는 저급 언어의 특성도 가져서 고급 언어에 비해 사용할 때 더 주의해야 한다. ==예제== ===Hello, world!=== {{{#!syntax c #include <\<stdio.h> int main(void) { printf("Hello, world!"); return 0; } }}} ==재밌는거== ===와! 포인터!=== {{{#!syntax c #include <\<stdio.h> signed main() { int a = 12; short* p1 = (short*)((char*)a + 1); *p1 = 12; printf("%c", *(((char*)p1) + 1)); } }}} -- union을 이해하고 있다면, 이 코드를 이해할 수 있을 것이다 -- [[분류:프로그래밍 언어]]