안녕하세요. YKK입니다.
오늘부터 12일까지 학교에서 진행하는 C언어 워크숍에 참가하게 되어 공부 내용을 기록하고자 합니다.
파이썬 이외 다른 프로그래밍 언어를 학습하는 것이 처음이기 때문에, C언어를 처음 공부하시는 분들도 이 글 읽고 같이 저를 따라오시면 좋을 거 같습니다. 같은 이유로 파이썬과의 비교를 통한 이해가 다수 존재할 예정이니 이해해 주시기 바랍니다.
프로그래밍 언어란 무엇일까요?
사람과 기계(컴파일러)가 이해할 수 있는 약속된 형태의 언어입니다. C언어, 파이썬, 자바 등이 모두 프로그래밍 언어입니다. 프로그래밍 언어는 크게 절차적 프로그래밍 언어와 객체 지향형 프로그래밍 언어, 두 가지로 나뉩니다. 그중에서 C언어는 절차적 프로그래밍 언어에 속하는데요.
'절차적 프로그래밍'이라는 한국어 번역은 오해의 여지가 있습니다. Procedural Programming에서 Procedural를 '절차적'으로 번역해 버려서 마치 절차적으로 실행하는 것이 중점이 되는 것처럼 보이기 때문입니다. 하지만 절차적이지 않은 프로그래밍이란 건 애초에 존재하지 않습니다. 그렇기 때문에 Procedural의 Procedure는 '절차'라는 의미가 아니라 '프로시저(C언어를 포함, 대부분의 프로그래밍 언어에서의 함수)'의 의미입니다. 이 부분 인지하고 학습하게 되면 좀 더 쉽게 이해가 가능할 것 같습니다.
또한 컴파일(compile)러 란 프로그래밍 언어로 작성된 프로그램을 기계(컴퓨터)가 이해할 수 있도록 기계어로 번역해 주는 역할을 수행하는 번역기라고 생각하시면 될 거 같습니다. 그 외에 프로그램에 존재하는 문법 오류를 찾는 역할도 합니다.
*개발 환경 구축
본격적으로 C언어 프로그래밍을 진행하기 위해선 몇 가지 준비가 필요한데요.
1. MinGW 설치 -Minimalist GNU for Windows, C 프로그램 컴파일(compile)
2. Visual Studio Code 설치
3. 기타 환경 설정
아래 링크에 친절히 설명되어 있어, 읽으시면서 그대로 따라가신다면 좀 더 쉽게 개발환경을 조성하실 수 있습니다.
https://ellielee.tistory.com/477
Visual Studio Code에서 C언어 사용하기
1. MinGW64 설치 (C언어를 사용하기 위함) 1-1. 다운로드 및 설치 1-2. 환경변수 설정 1-3. 재부팅 1-4. 컴파일러가 제대로 동작하는지 확인 2. Visual Studio Code 다운로드 및 설치 2-1. 다운로드 및 설치 2-2.
ellielee.tistory.com
MinGW는 C 프로그램 컴파일을 하기 위함이고 Visual Studio Code는 C코드 작성 및 실행을 위한 프로그램입니다.
위는 윈도우 환경을 위한 안내이고, Mac OS는 아래 링크를 참조해 주세요.
https://songacoding.tistory.com/49
[C언어] 맥북 Mac 개발 툴 (Visual Studio Code) 설치
안녕하세요, 송코딩입니다. 맥북 또는 맥(Mac)에 C언어 개발 툴로 유명한 Visual Studio Code를 설치하는 방법을 한번에 정리해보았습니다. Windows는 그냥 Visual Studio 를 설치해서 바로 사용하시면 되는
songacoding.tistory.com
https://justdoitproject.tistory.com/31
[VSCode] Macbook에서 C/C++ 개발환경 구축하기
Mac OS에서 C/C++ 개발하기 윈도우 운영체제를 쓰는 분들이라면 C/C++ 개발시 Visual Studio를 많이 사용하실텐데요. 저도 Windows를 주로 쓰다가 최근에 맥북프로를 사용하게 되면서 C/C++ 개발환경을 새롭
justdoitproject.tistory.com
기타 환경 설정은 다음 링크를 참조하시면 될 거 같습니다. https://gonghakjoa.tistory.com/84
Visual Studio Code에서 C언어 기본 개발환경 구축하기
https://velog.io/@youhyeoneee/%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95-VS-Code-%EC%97%90%EC%84%9C-CC-%EC%BD%94%EB%94%A9-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-Windows [환경 설정] VS Code 에서 C/C++ 코딩 환경 구축하기 (Windows)
gonghakjoa.tistory.com
파이썬에 비해서 뭐가 많다고 느껴지시나요? 그렇다면 정상입니다 :)
저는 기존에 Visual Studio Code를 이용해서 파이썬 개발을 하고 있었기 때문에 좀 더 수월하게 할 수 있었는데요.
저처럼 VS Code를 기존에 사용하시던 분들은 MinGW 설치와 VS Code 내 extension에서 C언어를 위한 확장을 설치해 주시면 됩니다.
설치하는 과정에서 몇몇 오류를 겪으시는 경우가 있을 텐데요. 제가 직접 겪었던 오류들 2가지와 해결방법을 소개하고 본격적으로 C언어 프로그래밍을 다뤄보겠습니다.
첫 번째로 MinGw64 폴더의 주소 지정인데요. MinGW를 다운로드하시고 압축을 해제하시면 mingw64라는 폴더가 생길 텐데요. 이 폴더를 무조건 C 드라이브 하단에 copy 하여 주소가 C:\mingw64 이런 식으로 되도록 설정해주셔야 합니다.
두 번째로는 개발 환경을 어느 정도 구축하고 코드를 실행할 때 아래와 같이 실행(디버깅) 오류가 뜨는 것이었는데요.
https://jech-jose.tistory.com/85 https://blog.naver.com/wlvkddlwkd/222316450174
[C/C++] VS Code 디버깅 오류, 중단점 안됨
Visual Studio Code 실행(디버깅) 오류 1. Unable to start debugging. Program path ~ 2. Unable to...
blog.naver.com
저 같은 경우는 경로에 한글이 포함되어 있어서 발생한 오류였습니다. 그래서 C드라이브 바로 밑에 새 폴더를 만들어 그곳으로 주소를 지정했더니 다행히 해결되었습니다. 제가 올려드린 링크를 보시게 되면, 다양한 원인들로 위 같은 문제들이 발생하는 것으로 보이네요. 위 링크 이외에도 구글링을 하시다 보면 해답을 꼭 찾으실 수 있으니 포기하지 말고 끝까지 해답을 찾아보시길! 이제 진짜로 C언어 프로그래밍을 위한 준비는 끝입니다.
C언어 프로그래밍
C언어를 이용한 프로그램의 완성 과정은 크게 7가지로 나뉩니다.
1. 프로그램 작성 tool(VS Code) 실행
2. VS Code 설치과정에서 만든 작업자 폴더 하위에 새로운 작업 폴더 생성-소스(프로그램) 파일을 저장하는 폴더
3. 새 파일 생성-소스 코드를 입력하는 파일
4. 프로그램 작성
5. 컴파일- 문법 오류 출력 및 기계어 번역
6. 솔루션 또는 프로젝트 빌드 - 프로젝트 내의 모든 파일(소스, 헤더 등)을 일괄적으로 컴파일
7. 프로그램 실행 - 단축키 또는 실행 버튼(6번 과정 생략하고 바로 실행 가능)
*"Hello, World!" 출력을 통한 C언어 기본 문법 알아보기
먼저 함수에 대해 간략히 설명해 보겠습니다. 다른 언어들과 동일하게 함수란, 간단히 말하면 적절한 입력과 그에 따른 출력이 존재하는 것, 특정 작업을 수행하는 단위라고 볼 수 있겠습니다.
인자 전달(parameter)은 입력에 해당하는 값을 전달하는 행위이고, 함수 호출(argument)은 인자를 전달하면서 함수의 실행을 요구하는 행위입니다.
C언어 함수의 특성은 입력과 출력이 존재하나 반드시 필요하지 않고, 순차적으로 실행되며 함수의 기능을 정의하는 몸체(body)가 존재합니다. 이 몸체를 중괄호({}) 내부에서 정의합니다. 아래 코드블록을 자세히 봐주시기 바랍니다. 기본적인 C언어의 문법을 한 블록으로 표현해 봤습니다.
/* Hello.c에서의 함수 */
#include <stdio.h>
//stio: standard input & output, 기본 입출력을 담당하는 함수들을 모아놓은 라이브러리.
int main(void) //int는 출력의 형태(여기선 정수), main은 함수 이름, (void)는 입력의 형태
{ //main 함수의 몸체 시작
printf("Hello, World! \n");//line 5, 6은 함수의 몸체
return 0; //return은 함수를 종료(빠져 나옴), 함수를 호출한 영역으로 값을 반환
} //main 함수의 몸체 종료
각 문장이 끝나는 위치에 세미콜론(;)을 사용합니다. 컴퓨터에게 이러한 일을 해라라고 명령을 내리는 문장이라고 생각하시면 쉽게 이해할 수 있습니다.
//#include <헤더파일 이름> 형식으로 작성
#include <stdio.h> /*stdio.h is inputed*/
#include <stdlib.h> /*stdlib.h is inputed*/
C언어의 특이점은 바로 라이브러리 명시인데요. 코드의 맨 첫 번째 라인에 #include <stdio.h> 이 부분이 바로 라이브러리를 호출(헤더 파일을 호출)하는 부분입니다. 밑에 main 함수 내에서 사용하는 printf()는 stdio.h라는 stdio 라이브러리의 헤더 파일에 정의되어 있기 때문에, 첫 번째 라인에서 해당 라이브러리를 호출하여 사용하는 것입니다.
C와 C++ 프로그래밍 언어에서 표준 라이브러리 함수는 전통적으로 헤더 파일 안에서 선언되어 있습니다. C와 C++ 표준 라이브러리에는 많은 함수들이 존재합니다. 라이브러리 오브젝트 코드는 파일로 존재하고 헤더 파일에 함수나 변수의 형이 선언되어 있으므로 사용자 측에서 붙여 사용하면 됩니다. 사용자 측에서 사용한 라이브러리는 라이브러리 파일의 코드를 링커가 응용 프로그램에 붙여 전체 실행 코드가 완성됩니다. 결국 헤더 파일의 형을 사용하여 라이브러리 사용자의 인클루드에 의해 함수 호출이 방식이 결정됩니다.
파이썬과 마찬가지로 이스케이프 시퀀스가 존재합니다.
#include <stdio.h>
int main(void)
{
printf("세미콜론의 사용\n");
printf("\t-각 문장 끝에서 사용\n");
printf("\t-컴퓨터에게 명령을 하는 문장\n");
printf("\n");
printf("표준 라이브러리에 대한 이해\n");
printf("\t-표준화된 함수들의 집합");
return 0;
}
아래와 같이 출력됩니다.
주석 처리는 파이썬과 차이가 좀 있는데요. 먼저 주석이란 쉽게 생각하면 일종의 포스트잇이라고 보시면 될 거 같습니다. 프로그래머에게 메모의 기능을 부여합니다. 이러한 이유로 주석을 삽임하면 프로그램을 더욱 쉽게 해독(이해)할 수 있습니다. 컴파일러는 주석을 없는 것으로 간주합니다. 아래는 C언어의 주석 방법 예시입니다.
/* 여러 줄에 걸친 주석*/
/*
여러 줄에
걸친
주석
*/
//단일 행 주석 처리
//주석 하나
//주석 둘
주석과 이스케이프 시퀀스 사용의 예입니다.
#include <stdio.h> //stdio.h 헤더 파일 포함
int main(void) //main 함수의 시작
{
/*
printf 함수는 모니터로 출력을 하는 경우에 사용한다.
인자로 문자열을 전달하면 문자열을 출력한다.
*/
printf("Hello World!\n"); //모니터로 문자열 출력
return 0; //0을 반환
} //main 함수의 끝
*변수
-변수: 데이터(값)를 저장할 수 있는 메모리의 한 공간
-종류: char(문자열), int/long(정수형), float/double(실수형)
int는 정수 (-21억 ~ +21억),
unsigned int는 자연수 (1 ~ 42억),
float는 실수 (-21억 ~ +21억, 소수점 6자리까지만 가능),
char는 문자 한 개(ASCII, 문자의 번호를 얘기합니다),
string은 문자열(문자 여러 개)을 의미합니다.
그 외에도, double(실수와 비슷한데, 한계가 소수점 14자리까지. 하지만 저장공간이 큼), long(double과 비슷하게 더 큰 수를 쓸 수 있지만, 저장공간이 큼. long 다음 int나 float 같은 형태를 쓰면 21억보다 더 큰 값을 저장 가능), FILE(연결리스트를 만드는 데 사용하는 형태) 등 형태가 많지만, 이 정도만 알고 있으면 충분합니다.
int a; // a는 정수형 변수이고, 값은 미정입니다.
float f = 0.123456; // f는 실수형 변수이고, 값은 0.123456입니다.
char c = 'A'; // c는 문자형 변수이고, 값은 A입니다.
메모리에 값을 저장하기 위한 공간을 만드는 것을 '변수의 선언', 대입 연산자(=)를 사용하여 선언된 변수에 특정한 값을 저장하는 것을 '변수의 대입'이라고 합니다.
#include <stdio.h>
int main(void)
{
int val; // int형 변수 val의 선언
val = 20; // 변수 val에 20을 저장
return 0;
}
위 코드의 정수형 변수를 출력하기 위해선 어떻게 해야 할까요? 파이썬의 문자열 % 포맷팅과 같은 방식입니다!
#include <stdio.h>
int main(void)
{
int val; // int형 변수 val의 선언
val = 20; // 변수 val에 20을 저장
printf("val에는 %d가 저장되어 있습니다.", val);
return 0;
}
//그 외에 문자열 하나 출력은 %c(파이썬과 다름주의)를 사용합니다.
변수를 이용한 예시를 한번 보겠습니다.
#include <stdio.h>
int main(void)
{
int a, b;
int c = 30, d = 40;
a=10;
b=20;
/*
int a;
a = 10;
int b;
b = 20;
//변수의 선언 위치는 자유임
*/
printf("a = %d, b = %d", a, b);
printf("c = %d, d = %d", c, d);
return 0;
}
위 코드에선 정수형 변수 a, b, c, d를 선언했습니다. 이처럼 변수를 사용할 땐 변수를 선언하는 문장은 꼭 존재해야 합니다. 하지만 그 위치가 엄격하게 정해진 것은 아니고 변수의 선언 위치는 자유롭게 작성 가능합니다.
변수 선언 시 몇 가지 주의사항이 있습니다.
1. 변수의 이름은 알파벳, 숫자, 언더바(_)로 구성
2. 대, 소문자를 구분해야 하며, 변수의 이름은 숫자로 시작불가능
3. 특수문자(~!@# 등) 또는 공백이 포함될 수 없음($, 달러표시는 사용가능)
4. 키워드(int, chr 등) 사용 불가
//적절치 않은 변수의 예시
int 7th_val//변수의 이름이 숫자로 시작
int live_inthe#//#과 같은 특수 문자 사용 불가
int kor year//변수 이름에 공백 삽입 불가
위에서 학습한 내용들을 가지고 덧셈의 결과를 출력하는 프로그램을 만들어 보겠습니다.
/*simple_add.c*/
#include <stdio.h>
int main(void)
{
int result;
result = 3 + 4;
printf("덧셈 결과: %d \n", result);
printf("%d 더하기 %d는 %d 입니다. \n", 3, 4, result);
printf("변수 result에 저장된 값: %d \n", result);
return 0;
}
※상수
상수(constant)는 변수와는 다릅니다. 변수와 같이 상수 또한 메모리 공간을 할당 받고 값을 저장하는데요. 하지만 변수와는 달리 한번 값이 할당되면 변경이 불가능합니다.
int main(void)
{
const int val1 = 3;
val1 = 4; //오류 발생
const int val2;
val2 = 5; //오류 발생
}//상수로 변경된 후엔 값의 변경이 불가능
*연산자
-연산을 요구할 때 사용되는 기호, 예: =(대입) +(덧셈) -(뺄셈) *(곱셈) /(나눗셈) %(나눗셈한 후의 나머지)
기본적으로 파이썬과 연산하는 방식은 같습니다. 하지만 나눗셈의 경우 예외적인 상황이 있어 아래 코드로 나타내봤습니다.
//나눗셈 연산자(/)의 주의점
#include <stdio.h>
int main(void){
int a = 3;
int b = 6;
int c = 2;
printf("b/a = %d, a/c = %d", b/a, a/c);
}
/*
b/a연산은 문제 없으나 a/c는 1.5가 아닌 1만 나온다.
이는 정수와 정수 간의 연산 결과는 무조건 정수이기 때문이다.
1.5 라는 결과를 얻기 위해선 이는 실수이고 연산 결과 자체를 실수로 바꿔서 출력해야 한다.
printf("b/a = %d, a/c = %f\n", b/a, (float)a/c);
위와 같이 수정하면 1.5라는 값도 출력 가능
*/
대입 연산자와 산술 연산자를 축약하는 방법
(같은 의미, 표현법만 다를 뿐임)
a = a + b; -> a += b;
a = a - b; -> a -= b;
a = a * b; -> a *= b;
a = a / b; -> a /= b;
a = a % b; -> a %= b;
-증가 감소 연산자: ++. -- 예: int a = 3; a++, a--, --a;
증가 감소 연산자는 연산자가 변수의 앞에 오는지, 뒤에 오는지에 따라 의미가 달라지기 때문에 이를 주의하여 사용해야 합니다. 아래는 증가 감소 연사자의 위치에 따른 의미를 정리한 표 입니다.
//증가 감소 연산자 예시
#include <stdio.h>
int main(void)
{
int a = 3;
int b = ++a;
int c = a++;
printf("a=%d, b=%d, c=%d". a--, --b, --c);
}
오늘 분량은 여기까지 입니다. 내일 또 새로운 내용으로 찾아 오겠습니다.
'C' 카테고리의 다른 글
C언어 시작하기(기초4)-포인터와 구조체 (0) | 2024.01.12 |
---|---|
C언어 시작하기(기초3)-함수와 배열 (0) | 2024.01.10 |
C언어 시작하기(기초2)-다양한 연산자들, scanf 함수, 상수와 기본 자료형, 제어문 (1) | 2024.01.10 |