C언어 기초교육(3/10)

2024. 5. 16. 17:04코딩과 프로그래밍/C언어

728x90

오늘은 변수와 데이터 타입, 그리고 초기화와 형식지정자에 대해서 배울 것이다.

 

먼저 변수는 데이터를 저장하는 공간을 의미한다.

C언어에서 변수를 선언할 때 데이터 타입을 명시해야 한다.

 

[데이터 타입의 종류]

대표적인 데이터 타입의 종류에는 정수형, 실수형, 문자형 등이 있다.

int : 정수형으로 ex) 10이나 -5 같은 숫자를 떠올리면 된다.

float : 실수형으로 ex) 3.14, -0.01 같은 숫자를 떠올리면 된다.

double : 배정밀도 실수형으로 ex) 2.71828 같은 더 높은 정밀도의 실수를 떠올리면 된다.

char : 문자형으로 ex) a나 A 같은 문자를 떠올리면 된다.

 

잊지 말자. 변수는 데이터를 저장하는 공간을 의미하며 C언어에서 변수를 선언할 땐 데이터 타입을 명시해야 한다.

 

[변수 선언과 초기화]

이번엔 2장에서 배웠던 것처럼 간단한 코딩을 해보려고 한다. 비주얼 스튜디오 같은 컴파일러를 실행하고 프로젝트를 아무거나 만들거나 2장에서 써먹었던 거 그대로 다시 재활용을 해도 된다.

 

맨 위에는 항상 #include <stdio.h>를 쓰도록 하자. 여기서 다시 한번 복습 가자. stdio.h가 뭐였는지 기억하는가? 헤더 파일이다. 헤더 파일은 무엇이었는가? 프로그램에서 사용할 변수, 함수, 상수 등이 선언을 포함한 것이다. 그중 stdio.h는 표준 입력/출력 함수들을 포함한 헤더 파일이다.

 

이후 아래와 같이 작성해 보도록 하자.

 

int main() {
int a = 10; // 정수형 변수 a를 선언하고 10으로 초기화
float b = 3.14; // 실수형 변수 b를 선언하고 3.14로 초기화
double c = 2.71828; // 배정밀도 실수형 변수 c를 선언하고 2.71828로 초기화
char d = 'A'; // 문자형 변수 d를 선언하고 A로 초기화

 

return 0;
}

 

위 코드를 해석해 주겠다. 맨 위에 int main에서 int는 반환 타입이다. main 함수가 종료될 때 정수 값을 반환하는 걸 의미하는데. 반환에 대해서는 어렵게 생각하지 말자. 나중에 차차 알게 된다. 또, main은 함수의 이름이다. C언어 프로그램에서 main은 프로그램의 실행이 시작되는 함수이다.

 

그 아래 int a = 10;은 이렇게 해석하면 된다. 정수형 데이터 타입을 가진 a라는 변수를 선언하고 a에 정수형 값인 10을 초기화하였다는 뜻이다. 이때 변수 선언은 다음과 같은 형태로 이루어진다.

 

int a; // 정수형 변수 a를 선언, 단 초기화는 없음.

int a = 10; // 정수형 변수 a를 선언하고 a에 정수형 값인 10을 초기화.

 

그렇다면 초기화란 무엇일까? 위의 설명에서 이미 눈치챈 사람들은 알겠지만, 초기화는 프로그래밍에서 변수를 선언할 때 처음으로 값을 할당하는 것을 의미한다. 이 부분이 아직 이해가 되지 않은 사람은 나중에 차차 이해하게 만들어줄 테니 걱정하지 말자.

 

어쨌든 초기화를 통해 변수가 사용할 준비가 되며, 초기값이 지정되지 않은 변수는 메모리에 할당된 임의의 값을 가질 수 있다. 이로 인해 프로그램이 예기치 않은 동작을 할 수 있으므로, 변수를 사용하기 전에 반드시 초기화하는 것이 중요하다는 걸 잊지 말자.

 

[초기화에 대한 요약]

초기화를 통해 변수가 예측 가능한 값을 가지게 되어 프로그램의 동작이 안정적이게 된다. 반대로 초기화되지 않은 변수는 임의의 값을 가질 수 있어 발생한 버그를 해결하는 일이 어렵고 예기치 않은 버그를 초래할 수 있다. 또, 코드 작성에 있어 가독성이 올라가 코드의 유지보수가 용이해진다.

 

다시 코드를 확인해 보자.

 

int main() {
int a = 10; // 정수형 변수 a를 선언하고 10으로 초기화
float b = 3.14; // 실수형 변수 b를 선언하고 3.14로 초기화
double c = 2.71828; // 배정밀도 실수형 변수 c를 선언하고 2.71828로 초기화
char d = 'A'; // 문자형 변수 d를 선언하고 A로 초기화

return 0;
}

 

두 번째 줄의 int a = 10;은 정수형 변수 a를 선언하고 10이라는 정수형 값을 초기화했다는 뜻이다.

세 번째 줄의 float b = 3.14;는 실수형 데이터를 가진 변수 b를 선언하고 b에 3.14이라는 실수형 값을 초기화 했다는 뜻이다. 더 아래로 내려가서 배정밀도 실수형에는 double이라는 배정밀도 실수형 데이터 타입을 사용하며 문자열엔 char를 사용하는 걸 알 수 있다. 

 

여기서 float와 double에 대해서 추가 설명하자면 float는 단정밀도 실수형이라 하여 32비트를 사용한다. 소수점 이하 약 7자리의 정밀도를 가진다. double은 배정밀도 실수형이라 하여 64비트를 사용하며 소수점 이하 약 15자리의 정밀도를 가진다. double은 고정 소수점 연산에서 높은 정밀도가 필요한 경우 유용하게 사용한다.

 

이번엔 이 초기화에 대해 좀 더 이해할 수 있도록 기존에 썼던 코드에 몇 가지 코드를 추가적으로 입력해 보자. 

 

int main() {
int a = 10; // 정수형 변수 a를 선언하고 10으로 초기화
float b = 3.14; // 실수형 변수 b를 선언하고 3.14로 초기화
double c = 2.71828; // 배정밀도 실수형 변수 c를 선언하고 2.71828로 초기화
char d = 'A'; // 문자형 변수 d를 선언하고 A로 초기화

printf("a = %d\n", a); // %d는 정수형 변수의 데이터를 화면에 출력할 때 사용
printf("b = %f\n", b); // %f는 실수형 변수의 데이터를 화면에 출력할 때 사용
printf("c = %lf\n", c); // %lf는 배정밀도 실수형 변수의 데이터를 화면에 출력할 때 사용
printf("d = %c\n", d); // %c는 문자형 변수의 데이터를 화면에 출력할 때 사용

return 0;
}

위 코드를 입력한 뒤  컨트롤 키와 F5를 눌러보자.

정상적으로 입력했다면 위와 같이 나올 것이다. 여기서 코드 설명을 하겠다.

 

printf("a = %d\n", a); // %d는 정수형 변수의 데이터를 화면에 출력할 때 사용
printf("b = %f\n", b); // %f는 실수형 변수의 데이터를 화면에 출력할 때 사용
printf("c = %lf\n", c); // %lf는 배정밀도 실수형 변수의 데이터를 화면에 출력할 때 사용
printf("d = %c\n", d); // %c는 문자형 변수의 데이터를 화면에 출력할 때 사용

 

위 코드에서 printf("a = %d\n", a); 에 대해 자세히 설명해 주겠다.

필자가 이해를 쉽게하기 위해서 %d는 정수형 변수의 데이터를 화면에 출력할 때 사용한다고 적어놨는데.

그렇게 이해해도 문제가 되진 않지만, 정확히 말하면 '출력할 위치를 지정'한 것이다. 결국 출력할 때 사용하는 것이니 문제는 되진 않지만, 좀 더 정확하게 설명하면 '출력할 위치를 지정한 것'이라고 이해하는 게 좀 더 옳다.

 

printf 함수는 보통 다음과 같이 작성된다. printf("형식 문자열", 데이터1, 데이터2, ...);

여기서 형식 문자열이란 printf나 scanf와 같은 함수에서 출력이나 입력의 형식을 지정하기 위해 사용되는 문자열로 리터럴 문자열과 형식 지정자가 형식 문자열을 구성하게 된다. 즉, 형식 문자열은 특정 데이터를 어떤 형식으로 출력하거나 입력할지를 정의하는 역할을 말한다.

 

형식 지정자는 %d, %f, %lf, %c, %p와 같은 것들을 형식 지정자라고 부른다.

 

리터럴 문자열은

printf("d = %c\n", d); 

위의 코드에서 "d = %c\n" 부분이 리터럴 문자열이다. 한 마디로 큰 따옴표(" ") 안에 있는 것들이 모두 리터럴 문자열이다.

예시) "hello, world!"

예시2) "뭘 봐 팍씨"

예시3) "d = %c\n"

 

즉, printf("d = %c\n", d); 라는 코드는 리터럴 문자열 "d = %c\n"을 사용하여 d의 값을 출력하는 것이다.

그리고 우리는 d라는 문자형 변수에 A라는 값을 초기화한 상태이니 코드 실행 시 d = A라고 나오는 것이다.

 

만약 printf("d = %d\n", a); 라고 입력 했을 시 a라는 변수에 10이라는 값을 초기화하였으니 d = 10 라는 결과물이 출력될 것이다.

 

추가로 변수를 double(배정밀도 실수형)으로 선언했다면 printf 함수에선 %f라고 해도되고 %lf라고 해도되지만, scanf에선 %f는 안되며 %lf를 사용해야한다.

 

오늘의 주요 복습

 

1. 변수는 데이터를 저장하는 공간을 의미

2. C언어에서 변수를 선언할 때 데이터 타입을 명시해야 한다.

3. 데이터 타입의 종류엔 정수형(int), 실수형(float), 문자형(char) 등이 있다.

4. 초기화란 변수를 선언할 때 변수에 값을 할당하는 것

5. 변수에 값을 초기화를 꼭 하진 않아도 된다. 다만, 필수적으로 하는 것이 좋다.

6. 변수에 값을 초기화하지 않을 시 임의의 값이 부여되며 문제가 발생할 수도 있다.

7. 형식 문자열 안에는 리터럴 문자열과 형식 지정자가 모두 포함된다.

8. 리터럴 문자열은 큰 따옴표 " " 안에 있는 것들을 일컫는 말이다.

9. 형식 지정자는 %d, %f, %c, %p 같은걸 의미한다.

 

[그 외]

글을 끝 마치기 전 장문의 글을 쓰고 넘어가겠다. 바로 프로그래머가 되기 위해선 수학을 잘해야 하는 가?에 대해서 이다.

 

가장 많은 고졸, 수포자, 비전공자들이 고민 하는 문제 중 하나가 프로그래머가 되기 위해선 수학을 잘해야 하는 가? 같은 문제이다.

 

위 내용만 봐도 알겠지만. 프로그래머가 되기 위해선 수학적 지식이 어느 정도 필요한데, 그 수준은 보통 대학 수준을 요구하는 경우까진 없으며 고등학교 때 수학 시간에 잠만 안 자고 공부 제대로 했어도 충분한 지식을 요구한다. 물론, 꼭 수포자여도 프로그래머가 될 순 있지만.

 

프로그래머에게 수학이 요구되는 이유는 단순히 정수, 실수, 배정밀도 실수 이런 걸 알아야 하기 때문이 아니라.

당신이 높게 성장하기 위해선 수학적 사고가 필요하기 때문이다. 멀리 갈 필요도 없이 세계 최초의 프로그래머라 불리는 에이다 러브레이스부터 수학자였다. 프로그래머가 되기 위해선 수학으로 생각하라 라는 말이 괜히 있는 것이 아니다.

 

가끔 유튜브에서 전, 현직 프로그래머들 엔지니어들이 동영상에서 '나는 수학을 못한다. 그래도 프로그래머로서 대기업에 입사했다.' 이런 말 등을 하는데. 이런 겸손한 말에 안심하고 절대 넘어가지 마라. 그 사람들 기준에서 본인이 수학을 엄청나게 잘하지 않는다는 것이지, 대부분 일반인들 평균 이상이며 학력도 대부분 높은 수준의 사람들인 경우가 많다. 물론 이 업계에 고졸에 비전공자가 없는 건 아니지만. 업계에서 저명하다 싶은 사람들은 대부분이 고학력자 출신에 수학적 사고가 뛰어난 사람들이 많다. 당연한 거라면 당연한 거지만, 그런 사람일수록 성공할 가능성이 높은 것은 그만큼 그 사람이 노력한 것에 보상을 받은 것이라고 생각된다.

 

즉, 고졸 혹은 비전공자에 수학도 못하는 사람이 프로그래머가 되기 마음먹었다면 이 업계에선 대졸에 수학도 평균 이상으로 하는 이들이 많은 만큼 당신은 그들보다 공부를 안 한 만큼 뼈를 깎을 준비를 해야 한다. 프로그래머가 되고 싶은 수포자라면 당장 유튜브에 초등학교/중학교 수학부터 검색해서 못해도 고등학교 과정까진 배우는 것이 좋다.

728x90

'코딩과 프로그래밍 > C언어' 카테고리의 다른 글

C언어 기초 퀴즈  (0) 2024.05.24
C언어 기초교육(5/10)  (0) 2024.05.18
C언어 기초교육(4/10)  (0) 2024.05.17
C언어 기초교육(2/10)  (0) 2024.05.16
C언어 기초교육(1/10)  (0) 2024.05.15