반응형

프로그래밍 언어/C언어 22

C언어 21. 전처리와 분할 컴파일-2

저번 글에 이어서 전처리와 분할 컴파일에 대해 설명해보도록 하겠습니다. 저번 글에서 알아본 define에 대해서 간단하게 복습해봅시다. define은 정수, 실수 또는 문자열 상수(확장 문자열)를 기호화(매크로명)해서 사용할 수 있게 해주는 명령어이며, 사용법은 다음과 같습니다. #define 매크로명 확장문자열 이런 define과 매우 비슷한 것이 C언어에는 존재하고 있는데요, 바로 변수와 상수 글에서 알아보았던 const명령어입니다. const는 데이터를 상수명으로 기호화해서 사용할 수 있게 해 준다고 할 수 있을 것입니다. 이러한 const를 사용해서 정수, 실수, 문자 등등의 상수를 저장할 수 있는데, 일반 자료형만이 아닌 포인터 변수 또한 상수화하여 사용할 수 있습니다. 포인터 변수의 상수화 그..

C언어 20. 전처리와 분할 컴파일-1

이번 글에선 전처리와 분할 컴파일에 대해 알아보도록 하겠습니다. 저희가 지금까지 코드를 작성할 때, 언제나 작성했던 #include 가 무엇인지 드디어 그 의미를 알 수 있을것입니다. 전처리 먼저 전처리에 대해 설명할 텐데, 기억하실지 모르겠지만 개발 툴 설치 때 잠깐 이야기했던 컴파일 과정에서 전처리에 대해서 한번 언급했었습니다. 컴파일러는 컴파일 시 전처리 과정을 거치게 되는데, 이 전처리 과정시에 #으로 시작되는 명령들만 따로 실행하게 됩니다. 이들은 전처리 명령어라고 합니다. 그럼 전처리 명령어엔 어떤 것들이 있는지 알아봅시다. 먼저 우리가 언제나 사용했던 include에 대해 알아봅시다. include는 사전에서 포함시키다 라는 뜻을 가지고 있는데요, 말 그대로 자신이 원하는 파일을 특정 디렉토..

C언어 19. 파일 입출력-2

저번 글에선 파일 입출력이 무엇인지 알아보았습니다. 이어서 이번 글에선 실제로 파일에 데이터를 출력하고, 파일로부터 입력을 받아봅시다. 일단 복습하는 의미로 파일 포인터를 파일과 연결해보도록 합시다. FILE* ifp; ifp = fopen("C:\\asd\\ex.txt", "r"); if (ifp == NULL) { return 1; } 파일에 하나의 문자를 입, 출력하자자 먼저 파일을 개방한 뒤, 하나의 문자를 입출력해보겠습니다. 이때 사용하는 함수는 입력용이 fgetc, 출력용이 fputc인데, 먼저 fgetc부터 알아보겠습니다. fgetc의 함수 원형은 다음과 같습니다. int fgetc(FILE*); 이 함수는 파일 포인터를 통해 파일과 연결한 뒤, 파일로부터 프로그램에 한 개의 문자를 입력받습..

C언어 18. 파일 입출력-1

이번 글에선 C언어의 파일 입출력에 대해서 알아보도록 하겠습니다. 먼저 파일 입출력이란 무엇인가에 대해서 한번 생각해봅시다. 직관적으로 생각하면 데이터를 파일로 출력하거나, 파일로부터 읽는 것이라 할 수 있습니다. 그런데, 이것은 사람의 관점에서 바라볼 때의 이야기입니다. 실제 프로그램 입장에서 파일 입출력은 더 포괄적인 의미를 가지고있습니다. 프로그램 입장에서 파일은 데이터를 입출력하는 모든 대상이란 의미를 가지고 있습니다. 예를 들어 키보드, 마우스, 모니터 등도 프로그램에겐 모두 파일이 되는 것입니다. 어떻게 이 모든 것을 파일이라는 하나의 단어로 말할 수 있는 것일까요? 스트림 파일 사실 프로그램이 입출력을 실행하는 대상은 모두 동일한 대상입니다. 이 대상을 스트림 파일이라고 말하는데, 프로그램은..

C언어 17. 응용자료형

이번 글에선 응용 자료형에 대해서 알아보도록 하겠습니다. 응용 자료형엔 여러 가지 종류가 있는데, 이번 글에선 구조체, 공용체, 열거형에 대해 알아보겠습니다. 여러 자료형을 포함하는 자료형? 먼저 구조체란 여러개의 변수를 묶어서 저장, 처리할 수 있도록 해주는 것을 이야기합니다. 기본적으로 배열과 흡사한데, 서로 어떻게 다른지 알아보도록 하겠습니다. 배열의 경우에는 배열의 타입에 맞는 데이터들을 저장할 때 사용합니다. 반면 구조체의 경우에는 저장할 데이터들의 타입들이 서로 달라도 사용 가능합니다. 예를 들어 배열과 구조체를 각각 컨테이너 박스라고 하고, 변수를 상자라고 생각해봅시다. 배열의 경우에는 과일상자만 담을 수 있는 컨테이너 박스이고, 구조체는 과일, 생선, 야채 등등을 여러가지 종류를 담을 수 ..

C언어 16. 변수의 영역

이번 글에선 변수의 영역에 대해서 알아보도록 하겠습니다. 사실 이와 관련된 이야기는 지금까지도 몇 번씩 이야기했었는데,이번 기회에 더 자세히 알아봅시다. 변수에는 자신의 영역이 존재한다. 우리가 사용하는 변수에는 각각 자신들이 속한 영역이 존재합니다. 변수들은 이 영역 안에 존재하며, 자신의 삶을 이 영역과 함께합니다. 이러한 변수들이 속한 영역의 범위에 따라서 그 변수를 부르는 호칭이 따로 존재합니다. 먼저 이전에도 한번 이야기했던 자동변수라는것이 있습니다. 이는 지역변수라고도 이야기하는데, 보통 하나의 함수에 종속되어 사용되는 변수입니다. 이 자동변수들은 함수 내에서 변수를 선언하면 메모리 공간을 할당받으며, 오직 그 함수 내에서만 해당 변수를 사용할 수 있습니다. 그리고 그 함수가 종료함과 동시에 ..

C언어 15. 메모리 동적 할당

이번 글에선 C언어에서의 메모리 동적 할당에 대해서 알아보도록 하겠습니다. 지금까지 우리는 메모리 공간을 확보할 때 변수나 배열을 선언하는 방법을 사용했습니다. 이러한 방법의 특징은 코드를 작성하는 단계에서 프로그래머가 확보할 메모리 공간의 크기를 미리 예상하고 작성해야 한다는 점입니다. 이를 메모리 정적 할당이라고 합니다. 메모리의 낭비 하지만 다음과 같은 경우가 있다면 어떻게 될까요? 만약 5개의 속담을 사용자로부터 입력받아 배열에 저장하는 프로그램이 있다고 생각해봅시다. 이를 위해선 배열을 다음과 같이 선언할 수 있을 것입니다. char pro[5][80]; 속담의 정확한 길이를 모르기 때문에 이를 저장할 배열의 길이는 충분히 길게 선언해야 합니다. 하지만 이러한 방식은 필연적으로 메모리 공간의 낭..

C언어 14. 포인터 배열, 다중 포인터

우리는 최근 글에서 포인터란 무엇인지, 포인터의 기본적인 사용법에 대해 알아보았습니다. 이번엔 그 포인터를 사용하는 방법을 좀 더 폭넓게 알아보도록 하겠습니다. 포인터 배열 먼저 포인터 배열이란 것에 대해서 알아봅시다. 배열이란 특정한 자료형을 연속된 기억공간에 저장하는 것이라고 이미 알고 계실 겁니다. 그렇다면 물론 포인터도 배열에 저장할 수 있을 것입니다. 이렇게 배열의 요소가 포인터인 것을 포인터 배열이라고 말합니다. char* ch_P[5]; 포인터 배열의 선언방법은 위와같으며, 배열의 요소가 포인터인것을 알려주기위해 *를 사용합니다. 포인터배열의 각 요소는 포인터이기 때문에 ch_P배열에 다음과 같이 값을 입력할 수 있을 것입니다. char* ch_P[5] = { "apple", "banana"..

C언어 13. 문자열

이번 글에선 문자열에 대해서 알아보겠습니다. 지금까지 저희는 printf를 사용해 문자열을 많이 출력해보았습니다. 하지만 반대로 문자열을 입력받고 저장한 적은 없습니다. 그렇다면 이 작업을 어떻게 해야 할까요? 문자열은 어떻게 저장하지? 그러려면 먼저 문자열에 대해 정확히 알고 넘어가야 할 것이 있습니다. 자료형에 대해 설명했을 때도 보셨겠지만, C언어에는 하나의 문자를 저장하는 char형은 있지만 문자열을 저장하는 자료형은 따로 존재하지 않습니다. 눈치채신 분들도 있을지 모르겠는데, 문자열은 char형의 배열에 저장하면 됩니다. 예를 들어 "seoul"이란 문자열은 크기가 6인 char형의 배열의 각 요소에 seoul을 넣은 것입니다. 그런데 왜 5글자인데 배열의 크기가 6이어야 하는 걸까요? 그건 바..

C언어 12. 배열과 포인터

저번 글에서 C언어의 가장 중요한 특징이라고 할 수 있는 포인터에 대해서 알아보았습니다. 이번엔 포인터와 이전에 알아보았던 배열의 관계에 대해서 알아보도록 하겠습니다. 먼저 기억을 한번 더듬어봅시다. 프로그램에서 배열의 모든 요소를 출력해야 한다면 어떻게 해야 할까요? 맞습니다. 반복문을 사용해서 모든 요소를 출력할 수 있죠. 하지만 이 작업을 한 번만 하는 것이 아닌 프로그램 전체에서 여러번 빈번하게 출력한다면 어떨까요? 이에 대한 함수를 새로 정의해서 사용하면 매우 간단하게 사용할 수 있겠죠. 배열을 함수의 인자로 그런데 한번 생각해봅시다. 이 배열을 어떻게 함수에게 인자로 넘겨줘야 할까요? 배열의 모든 요소를 각각 인자로 넘겨주면 이 문제를 해결할 수 있겠죠. #include void printAr..

반응형