[C언어 강좌] #20 강의를 마치며 ~ (완)

프로그래밍 강좌/C 2022. 1. 29. 14:50

안녕하세요 파일입니다. 본 글은 2019년 호기롭게 시작한 C 프로그래밍 강좌의 후기 편입니다. 글을 너무 게을리 쓴 탓에 2년이 넘는 시간 동안 연재를 했습니다만 이 강의도 일종의 프로젝트였기에 완수한 성취도가 매우 높습니다 ㅎㅎ. 이 부분은 제 개인적인 이야기들이니 강의를 다 보신 분들은 궁금하지 않으면 안 보셔도 됩니다. ~BGM https://www.youtube.com/watch?v=jwJfXVwRYW0 이 강의를 쓰게 된 이유 이 강의를 쓰게 된 이유는 박정민님의 저서인 '열혈강의 C언어 본색' 때문이라고 해도 과언이 아닐까 싶습니다. 컴퓨터를 가지고 노는게 너무 재밌었던 저는 초등학교 6학년 때 나만의 프로그램을 만들고 싶어 프로그래밍 카페를 수소문했고, 프로그래밍의 기초가 C언어라는 말을 ..

Article Thumbnail
[C언어 강좌] #19-2 전처리기와 분할 컴파일

프로그래밍 강좌/C 2022. 1. 28. 21:43

조건부 컴파일 C언어는 다양한 운영체제에서 사용되었기 때문에 각 운영체제가 제공하는 표준 함수나 동작, 라이브러리가 조금씩 다를 수 있습니다. 같은 운영체제를 사용한다고 하더라도 사용하는 컴파일러나 라이브러리에 따라서 일부 함수가 없는 경우가 있을 수도 있구요. 예를 들여서 main.c라는 파일을 만들어서 C로 프로그램을 하나 만들었는데 이게 윈도우에서는 제대로 동작하는데, 리눅스에선 함수들 몇개가 제대로 동작하지 않아서 프로그램이 정상적으로 동작하지 않는 경우를 생각해봅시다. 지금까지 배워본 바로는 별다른 해결방법이 없어서 윈도우 용은 main_window.c 로 만들고 리눅스 용은 main_linux.c 로 파일을 만들어서 해결을 했다고 봅시다. 분명 둘다 기능은 동일하게 추가해야 하는데 함수 몇개때..

Article Thumbnail
[C언어 강좌] #19-1 전처리기와 분할 컴파일

프로그래밍 강좌/C 2022. 1. 26. 21:05

모든 일에는 어떤 행동을 처리하기전에 해야할 일이 있습니다. 예를 들어서 밥을 먹기 위해선 밥상을 차리는 것을 먼저해야합니다. 일상에서 먼저 처리해야 하는 일을 '전처리' 라고 가볍게 표현할 수 있습니다. 밥을 먹는 처리를 위해선 밥상을 차리는 '전처리'를 해야한다는 것입니다. 컴퓨팅 세계에서도 전처리를 해야 할 필요가 있습니다. 이때 전처리기를 나타내는 기호로 '#' 을 사용합니다. 전처리기를 사용하면 여러 개의 파일을 분할해서 컴파일 하는것도 가능합니다. 전처리기 프로그램 작성을 한 후 실행까지 과정은 아래와 같습니다 프로그램 작성 -> (전처리) -> 컴파일 -> 링크 -> 실행 컴파일의 경우 고급언어(프로그래밍 언어)로 작성한 프로그램을 기계어(0과 1)로 바꿔주는 작업이였고, 링크는 이 바꿔준 ..

Article Thumbnail
[C언어 강좌] #18 동적 메모리 할당과 가변 인자

프로그래밍 강좌/C 2022. 1. 25. 01:09

안녕하세요? 파일입니다. 어김없이 또 C언어 학습에 있어 새로운 챕터가 시작되었군요. 이번 챕터와 다음 챕터를 마치게 되면 제 C언어 강좌는 끝을 내게 됩니다. 지금 강의는 31편째지만 이 많은 글들을 제가 작성했다는게 참 대단하고 가슴이 웅장해집니다. 마지막에 가까워졌다는게 느껴지실까요? 오늘은 동적 메모리 할당과 가변 인자에 대해 배워봅시다. 프로그램에서 사용되는 메모리에는 정적 메모리와 동적 메모리가 있습니다. 지금부터 본문에서 사용하는 용어인 메모리는 RAM을 지칭하는 것 입니다. 스택 영역, 데이터 영역 같은 정적 메모리는 메모리가 언제 할당되고 해제될지 그리고 요구되는 메모리의 크기가 컴파일할 때 결정되는 메모리 입니다. 그러나 정적 메모리는 프로그램 실행 시간(런타임) 중에 메모리의 크기를 ..

Article Thumbnail
[C언어 강좌] #17-3 콘솔 입출력과 파일 입출력

프로그래밍 강좌/C 2022. 1. 17. 02:16

안녕하세요 파일입니다. 저번에 이어 파일 입출력을 하는 방법에 대해 계속 알아봅시다! 콘솔 입출력과 파일 입출력편은 오늘이 마지막입니다. 달려보아요~ fread() 함수와 fwrite() 함수 3번째 이야기 하는것이지만 파일은 텍스트 파일과 바이너리 파일로 나누어진다고 했습니다. 지금까지 앞에서 학습한 함수들은 전부 텍스트모드에서 작동합니다. 지금까지 배운 함수들론 순수한 이진파일 (0과 1로만 이루어진)을 적어낼 수 없습니다. 텍스트 모드로 적히기 때문에 텍스트만 적을 수 있죠. 그러나 바이너리로 읽기/쓰기를 할 수 있는 함수를 배우면 달라집니다. $cf ) binary : $ 2진법의 이제 바이너리 파일의 파일 입출력을 지원하는 함수를 다뤄봅시다. 이들에는 fread() 함수와 fwrite() 함수가..

Article Thumbnail
[C언어 강좌] #17-2 콘솔 입출력과 파일 입출력

프로그래밍 강좌/C 2022. 1. 13. 01:02

저번 편에선 파일 출력을 하는 소스를 간단하게 실습해보았고 스트림, 파일스트림에 대한 개념 fopen() 을 통해 파일 스트림을 생성 & 파일을 여는것 등을 알아보았습니다. 오늘은 파일 입출력 과정에서 사용되는 함수에 대해 다뤄보겠습니다. fopen() 함수와 fclose() 함수 먼저 파일을 열고 닫는 fopen() 함수와 fclose() 함수에 대해서 공부해보겠습니다. 아래 표는 fopen 함수의 원형입니다. 함수 원형 설명 #include FILE* fopen(const char * filename, const char * mode) 파일 스트림을 생성하고 파일을 연다 실패 : NULL 반환 fopen() 함수는 함수의 인자로 filename(파일 경로)과 mode(파일 열기 모드)를 전달 받아 파..

Article Thumbnail
[C언어 강좌] #17-1 콘솔 입출력과 파일 입출력

프로그래밍 강좌/C 2022. 1. 8. 23:05

안녕하세요 파일입니다. 오늘은 본격적으로 파일 입출력에 대한 이론과 간단한 예제를 다뤄볼겁니다. 참고로 이번편부터 새롭게 알아야할 개념들이 늘어서 포인터 편처럼 머리가 아파질 수 있습니다.. 개인적인 느낌으로는 포인터의 경우 개념은 알만했는데 응용이 어렵다면 여긴 개념은 어려운데 응용하는건 그리 어렵지 않습니다. C언어에 대한 고지가 얼마 남지 않았으니 조금만 힘내봅시다. 화이팅! 콘솔 콘솔(console)은 본래 대형 컴퓨터 시스템과 연결되어 데이터를 입력하는 장치 또는 입력된 데이터를 처리하여 결과를 출력하는 장치를 의미합니다. 여기서의 콘솔은 키보드나 모니터와 같은 표준 입출력 장치를 의미하며, 콘솔 입출력은 키보드에서 데이터를 입력받고 모니터에 데이터를 출력하는것을 말합니다. 그렇다면 파일 입출력..

Article Thumbnail
[C언어 강좌] #16-2 문자열 표준 함수와 기타 표준 함수

프로그래밍 강좌/C 2022. 1. 4. 00:51

sscanf() 함수와 sprintf() 함수 우리가 지금까지 C언어에서 필수적으로 사용해온 함수로 scanf() 함수와 printf() 함수가 있습니다. 이번에 알아볼 함수는 scanf()와, printf() 함수 이름 앞에 s를 붙인 sscanf() 함수와 sprintf() 함수 입니다. 함수 원형 설명 #include int sscanf(const char * s1, const char * s2, ...) 메모리(문자열)에서 데이터를 입력받음 성공 : 데이터의 개수 반환 #include int sprintf(const char * s1, const char * s2, ...) 메모리(문자열)에 데이터를 출력(저장) 성공 : 문자열의 길이 반환 *위 함수의 인자중에 ...은 함수의 인자가 많이 있을 ..

Article Thumbnail
[C언어 강좌] #16-1 문자열 표준 함수와 기타 표준 함수

프로그래밍 강좌/C 2022. 1. 3. 03:35

이전에 문자열에 대해 배운적이 있습니다. 프로그램을 만들면서 문자열을 다루는 상황이 많게 되므로 문자열은 상당히 유용한데요. C언어에서 문자열을 구현하는 방법 2가지 다시 리마인드하고 넘어가자면 "Hello" 라는 문자열이 있다면 1. 배열을 통한 문자열 char string[] = "Hello" 와 같은 형식으로 선언하고 각 배열 요소 string[0] = 'H', string[1] = 'e'.. string[5] = '\0' (널문자)가 문자인 것으로 구현됩니다. 2. 포인터를 통한 문자열 char * string = "Hello" 와 같은 형식으로 선언하고 "Hello"라는 문자열이 메모리 공간에 할당되며 string이라는 char형 포인터 변수가 "Hello"라는 문자열의 시작주소를 가리켜서 1바..

Article Thumbnail
[C언어 강좌] #15 공용체와 열거형

프로그래밍 강좌/C 2021. 12. 28. 19:02

안녕하세요 파일입니다. 저번 구조체편에 이어서 공용체와 열거형입니다. 구조체를 제대로 이해하셨다면 이번에 새로배우는 공용체는 구조체와 사용방법이 거의 동일하기 때문에 어렵지 않게 익힐 수 있습니다. 또한 열거형도 그렇게 어려운 내용은 아니니 걱정하지 않으셔도 됩니다. 그럼 바로 시작해봅시다. 공용체 앞에서 배운 구조체처럼 사용자 정의 자료형에는 또 '공용체' 라는것이 있습니다. 공용체는 선언 형태와 사용 형태가 구조체와 거의 동일합니다. 그럼 공용체는 무엇일까요? 공용체의 의미는 그룹으로 묶여진 여러 개의 멤버 변수들 중에 가장 큰 메모리 공간을 '공유' 해서 사용하는 것 입니다. 밑줄쳐진 저 공유한다는 부분이 구조체와의 매우 큰 차이점이라고 할 수 있겠습니다. 단순히 말로만은 이해가 어려으므로 그림을 ..

Article Thumbnail
[C언어 강좌] #14-2 구조체(Structure Type)

프로그래밍 강좌/C 2021. 12. 28. 02:25

포인터편에서 함수를 호출할때 두가지 방법인 값에 의한 호출(Call by Value), 주소에 의한 호출(Call by Reference) 를 배웠었습니다. 일반 변수의 값, 주소를 매개변수로 넘길 수 있었듯 구조체의 경우에도 구조체 변수의 값, 주소를 매개변수로 넘길 수 있습니다. 그리고 배열의 경우에는 배열을 매개변수로 넘길때 배열의 이름 자체가 주소고, 매개변수로 int a[]와 같이 써줘도 컴파일러에서 int * a와 같은 포인터로 자동변환하기 때문에 어떻게하든 주소에 의한 호출만 가능했었는데요. 과연 구조체는 여기서 어떻게 될까요? 한번 알아보겠습니다. 구조체 변수를 이용한 값에 의한 호출 #include struct pos { int x; int y; }; void CallbyValue(str..

Article Thumbnail
[C언어 강좌] #14-1 구조체(Structure Type)

프로그래밍 강좌/C 2021. 12. 23. 00:44

안녕하세요 파일입니다. 드디어 지겹던 포인터가 끝나고 새로운 강좌명으로 상쾌한 시작을 할 수 있게 되었습니다 ! * 하지만 포인터는 포인터가 끝난뒤에도 항상 어디서나 등장합니다.. 여기서도 나와요 오늘 배워볼것은 구조체(Structure Type)입니다. 만약에 '학생1' 이 있고 이름이 '홍길동' 이라면 이것을 프로그래밍으로 표현할때 어떻게 하면 좋을까요? #include int main(){ char * student1 = "홍길동"; printf("학생 1의 이름은 : %s 입니다.", student1); return 0; } 저번에 배운 포인터 문자열을 활용하면, 대충 이렇게 하면 되겠죠? 근데 학생을 관리하려면 이름만 알아선 부족합니다. 예를 들어서 학번도 있을꺼고, 고등학생이라면 학년, 반도 ..

Article Thumbnail
[C언어 강좌] #13-3 포인터(Pointer)

프로그래밍 강좌/C 2021. 11. 23. 00:58

안녕하세요 파일입니다. 포인터 3편을 시작하겠습니다. 포인터는 기본적으로 배울것도 많고, 어렵고, 힘이 듭니다 ㅠ 저도 작성하는 내내 고역이네요.. 그래도 다행인건 포인터 편은 이번이 마지막입니다! 힘내보자구요 (아 참고로 썸네일은 포인터라고 치면 나오는 개를 사용했습니다. 아무 의미 없고 어그로 용이니 무시해주세요 ㅋㅋ) #include int main(){ int a = 0; scanf("%d", &a); printf("%d", a); return 0; } 지금까지 C언어로 입력을 받으면서 printf로 출력할땐 안그랬는데 scanf로 입력받을때는 항상 &a처럼 앞에 &(앰퍼샌드) 기호를 붙였었습니다. 주소로 값을 넘겨야만 했습니다. 이건 나중에 설명하겠다고만 했지 이유도 몰랐고 그냥 외워서 쓰는 수..

Article Thumbnail
[C언어 강좌] #13-2 포인터(Pointer)

프로그래밍 강좌/C 2021. 11. 7. 22:03

안녕하세요 파일입니다. 저번 강의에 이어서 포인터 2번째 시간입니다. 바로 시작해보겠습니다! 포인터와 2차원 배열 &연산자와 *연산자로 2차원 배열을 공부하던것 기억나시나요? 1차원 배열일때는 &array[0]을 하면 첫번째 주소의 값을 가르켰었습니다. 2차원 배열일때는 조금 달랐죠. *(array + 0) == array[0] 이며 이것은 곧 0행의 대표주소 &array[0][0] 이였습니다. 1행의 대표주소는 *(array + 1) == array[1] 이며 이것은 곧 1행의 첫번째 요소의 주소 &array[1][0] 가 되었습니다. 포인터를 이용한 2차원 배열 탐색 #include int main(){ int arr[3][4] = { //3행 4열 {1,2,3,4}, {5,6,7,8}, {9,10,..

Article Thumbnail
[C언어 강좌] #13-1 포인터(Pointer)

프로그래밍 강좌/C 2021. 6. 28. 20:18

안녕하세요 파일입니다. 앞에서 다차원 배열을 다룬 뒤로 거점 한 달쯤에 뵙네요! 앞의 연도가 바뀐 건 기분 탓입니다 ㅎㅎ.. 가 아니고 저 글을 작성하고 많이 바빠졌는데 까먹고 강의를 강제 동면시켜버렸습니다 죄송합니다 ㅋㅋ.. 그래도 제 강의 봐주시는 분들이 꽤 있었는데 이미 다른 강의로 도망가버린 거 같아요.. 그래도 꽤나 많은 부분을 공부했으니 스스로 잘하시고 계시겠죠 ㅎㅎ? 어쨌든 C언어 개념에 고지가 얼마 남지 않았습니다! 오늘 배울 것은 포인터입니다! C언어가 Low-Level에 가깝다고 표현하는 이유가 바로 C언어에 존재하는 포인터 때문입니다. 포인터는 일종의 흑마법에 가까운데 일단 이해하긴 어렵고 위험하나 완벽히 이해한다면 거의 모든 것을 할 수 있습니다. 사실 이런 설명을 들으면 무슨 개소..

Article Thumbnail
[C언어 강좌] #12-2 [Array] 다차원 배열

프로그래밍 강좌/C 2020. 5. 17. 21:32

안녕하세요. 오늘은 앞에서 배운 1차원 배열에 이어 다차원 배열을 보겠습니다. 저희는 3차원 세계에 살고 있습니다. 그렇기 때문에 4차원을 이해할 수 없죠. 1차원은 선분, 2차원은 면, 3차원은 입체라고 합니다. 배열을 만들땐 1차원을 넘어 2차원, 3차원, 4차원,..., n차원 배열까지 만들 수 있습니다. 사실 4차원부턴 사용할 일이 그렇게 많지 않습니다. (AI 라던가, 테트리스 라던가..) 그렇기에 다차원 배열은 대개 3차원 까지를 가리킵니다. 물론 다차원 배열은 2차원 배열 이상을 가리키므로 4차원, 5차원을 다차원 배열이라고 불러도 무리가 없습니다. '다차원 배열'이라고 이름 붙은 이유는 인간의 논리인 1차원, 2차원, 3차원을 배열에 적용시켜서 이해하기 위함입니다. 다음 사진은 2차원 배열..

Article Thumbnail
[C언어 강좌] #12-1 [Array] 1차원 배열

프로그래밍 강좌/C 2020. 3. 30. 22:04

안녕하세요 파일입니다. C언어 강좌는 굉장히 오랜만이네요.. 제가 학업에 치이기도 했고 귀찮음이 앞서기에 강좌를 너무 늦게 작성했네요 ㅠㅠ 사실 50% 정도 글을 작성하고 임시저장을 해뒀는데 이어서 작성하려고 보니 글이 통째로 날아가서 멘붕을 조금 했습니다;; 티스토리 임시저장은 네이버에 비하면 너무 부족한거같아요 ㅠㅠ 어쨌든 제 강의를 읽어주시는 분들이 있기에 다시 강의를 작성하게 됬습니다. 오늘 배워볼 것은 배열입니다~ 여기까지 오신 분들은 사실 C언어를 60% 정도는 배웠다고 해도 괜찮죠 ㅎㅎ 참고로 배열은 시각적으로 이해하는 것이 좋기 때문에 최대한 그림을 추가해서 설명해보겠습니다. 또한 난이도가 올라가는 부분이기 때문에 편한 마음으로 시청하시길 권장드립니다. (물론 대충 보라는 뜻은 아니고요....

Article Thumbnail
[C언어 강좌] #11 정적변수, 지역변수, 전역변수, 외부변수, 레지스터 변수

프로그래밍 강좌/C 2020. 1. 28. 01:47

물론 변수는 여기서 배웠는데 왜 또배우나요? 라고 할 수 있습니다. 하지만 저번에 배웠던 변수에 대한 내용들은 기초적인 내용이고, 오늘은 그 변수가 메모리에 언제 생성되고, 언제 소멸되는지, 선언되는 위치, 종류에 대해 심화학습을 해볼것입니다. 우선 오늘 알아볼 변수는 총 5가지 입니다. 지역변수 (local) 전역변수 (global) 정적변수 (static) 외부변수 (extern) 레지스터 변수 (cpu) 종류가 많아보이지만 쫄 필요는 없습니다. 그럼 시작해보겠습니다. 지역변수 지역변수(Local Variable)는 중괄호 내부, 함수의 매개변수(Parameter)에서 사용되는 변수를 의미합니다. 중괄호 밖, 함수의 밖에선 그 효력을 발휘할 수 없습니다. 지역변수에서 지역은 중괄호 내부, 함수의 내부..

Article Thumbnail
[C언어 강좌] #10 함수(Function)

프로그래밍 강좌/C 2020. 1. 18. 00:50

안녕하세요 파일입니다. 오늘은 반복 작업을 편하게 해주는 함수에 대해 알아보겠습니다. 시작에 앞서 강의가 벌써 10강까지 제작되었습니다. 끝까지 열심히 따라 해 봅시다. 메인 함수 #include int main(){ //main 함수 정의 printf("Hello C World"); return 0; } #2강에서 main() 함수에 대해 소개한 적이 있습니다. 기억나시나요 ^^ 항상 프로그램 작성할 때마다 int main() 요건 습관처럼 써줬습니다 main 함수는 이름 그대로 프로그램이 실행될 때 가장 먼저 실행되는 "함수"입니다. 그럼 이제 다른 함수를 만들어보겠습니다 함수의 정의 함수는 왜 필요할까요? 아래 코드를 한번 봅시다. #include int main(){ //main 함수 정의 int..

Article Thumbnail
[C언어 강좌] #9 조건문 (If, ElseIf, Switch)

프로그래밍 강좌/C 2020. 1. 8. 19:48

안녕하세요. 파일입니다 오늘 알아볼 것은 조건문입니다. 조건문은 따로 알아보진 않았지만 앞에서 자연스럽게 사용을 했습니다(If문) 오늘은 If문 이외에도 다른 조건문들을 알아보고 사용법을 알아보겠습니다. If문 #include int main(){ if(조건){ 실행식 } return 0; } If라는 영어단어의 뜻은 '만약'입니다. 프로그래밍에서 if 역시 조건을 따지는 데 사용합니다. 위는 if문의 사용예제입니다. if(조건)이고 조건 안의 값이 참이면 중괄호 안의 코드가 실행됩니다. #include int main(){ int n; printf("숫자를 입력해주세요 : "); scanf("%d", &n); if(n % 2 == 0) printf("짝수입니다"); return 0; } >>> 10 1..

Article Thumbnail