햄깅이의 C언어

[햄깅이의 C언어] Chapter3/ 자료형과 변수

chohaeminn 2024. 7. 9. 22:01

본 포스팅은 Perfect C, C언어로 배우는 프로그래밍 기초책을 기반으로 공부한 자료입니다.
다른 포스팅을 참고한 자료는 모두 출처를 남겨놓았습니다.
 


3.1 C프로그램 구조와 프로그램 실행

 

C 프로그램과 Visual Studio의 기본 구조

 

C 프로그램은 하나 이상의 여러 함수가 모여 한 프로그램이 구성된다.

 

비주얼 스튜디오에서 솔루션은 여러 개의 프로젝트를 가지며,

다시 프로젝트는 여러 소스파일을 포함한 여러 리소스로 나우어진다. 

 

즉 하나의 프로젝트는 단 하나의 main()과 다른 여러 함수로 구현되며,
최종적으로 프로젝트 이름과 같은 하나의 실행파일이 만들어진다. 

 

C프로그램은 적어도 main() 함수 하나는 구현되어야 응용 프로그램으로 실행할 수 있다.

 

함수의 구현은 여러 문장으로 구성되는데,

이러한 문장에서 프로그래머가 만든 사용자정의함수 또는 시스템이 만든 표준 라이브러리 함수 호출이 실행될 수 있다. 

 

프로그램의 시작과 종료

 

main() 하무가 프로그램이 실행되면 가장 먼저 시작되는 부분이다.

프로그램이 시작되면 운영체제는 main() 함수를 호출해서 프로그램을 시작하는데, 

 

main() 내부에서 위에서 아래로, 좌에서 우로, 문장이 위치한 순서대로 실행된다.

 

키워드와 식별자

 

키워드란?
프로그래밍 언어에서 문법적으로 고유한 의미를 갖는 예약된 단어가 있다.

"예약"되었다는 의미는 프로그램 코드를 작성하는 사람이 이 단어들을 다른 용도로 사용해서는 안된다는 뜻이다.

 

이러한 키워드들이 있다.

비주얼 스투디오 편집기에서 키워드는 기본적으로 파란색으로 표시되어있다.

 

식별자란?
프로그래머가 자기 스스로 정의해 사용하는 단어를 말한다. 

 

 

예를 들어 변수 이름  age, year나 함수 이름으로 puts, main, printf() 등이 있다. 

 

식별자는 예약자인 키워드와 비교하여 철자라든지, 대문자, 소문자 등 무엇이라도 달라야한다.

식별자는 영문자, 숫자, 밑줄로 구성되며, 식별자의 첫 문자로 숫자가 나올 수 없다. 

 

아래와 같은 규칙을 따른다. 

 

 

문장과 주석

 

문장이란?
프로그래밍 언어에서 컴퓨터에게 명령을 내리는 최소단위를 문장이라고 하며,
문장은 마지막에 세미콜론 ;으로 종료된다. 

 

한국어나 영어 등의 일반 언어의 문장에도 어법이 있듯이 프로그래밍 언어에도 문법이 있어,

문장 마지막에 ;을 빠뜨리는 등 문법에 맞지 않는 문장을 컴파일을 할 때문법 오류가 발생한다. 

 

여러개의 문장을 묶으면 블록이라고 하고 중괄호로 열고 닫는다.

 

또한 단락에 들여쓰기가 있듯이 블록에도 들여쓰기를 하는데, 블록 내부에서 문장들을 탭 키로 한 스텝만큼

오른쪽으로 들여쓰는 소스작성방식이다. 소스에서 줄 구분과 들여쓰기를 하지 않고도 프로그램을 작성해도 오류가 나지 않는다. 그러나 프로그램의 이해력을 돕는데는 매우 중요한 요소이다.

 

주석의 정의와 중요성

 

주석이란?
일반 문장과 달리 프로그램 내용에는 전혀 영향을 끼치지 않는 설명문을 주석이라고 한다. 

주석은 타인은 물론이거니와 자신을 위해서라도 반드시 필요하며,

주석에는 자신을 비롯한 이 소스를 보는 모든 사람이 이해할 수 있도록 도움이 되는 설명을 담고 있다. 

 

잘 정리된 주석이란, 시각적으로 정돈된 느낌을 주어야하며, 프로그램의 내용을 적절히 설명해주어야한다. 

 

1. 한 줄 주석 (//) : //은 // 이후부터 그 줄 마지막까지 주석으로 인식한다.

2. /* ... */은 여러 줄에 걸쳐 설명을 사용할 때 이용하는데, 주석 시작은 /*로  ... 주석의 종료는  */로 표시한다. 

 

1) 프로그램의 처음 부분--> 작성자소스의 목적 또는 프로그램의 전체적 구조저작권 정보 등 파일 관련 정보

2) 함수의 시작 부분--> 프로그램의 기능과 함께 함수에서 사용되는 변수인 매개변수

3) 소스의 중간 부분--> 한 줄 주석으로 구현 방법이나 작동 방식을 설명하는 주석

 

 

이렇게 예제까지 작성해보았다.


3.2 자료형과 변수 개요

 

자료형 분류

자료형이란?
프로그래밍 언어에서 자료를 식별하는 종류를 말한다. 

 

저장공간인 변수

 

요리에서 프라이팬이나 조리용 그릇처럼 프로그래밍에도 정수와 실수. 문자 등의 자료값을 중간중간에 저장할 공간이 필요하다. 

변수란?
자료값을 저장할 공간이며, 고유한 이름이 붙여지며 물리적으로 기억장치인 메모리에 위치한다.  

 

 

변수는 선언된 자료형에 따라서 변수의 저장공간 크기와 저장되는 자료 값의 종류가 결정된다. 

저장되는 값에 따라 변수 값은 바뀔 수 있으며, 마지막에 저장된 하나의 값만 저장.유지된다.  

 

 

변수선언과 초기와

 

변수선언은 컴파일러에게 프로그램에 사용할 저장공간인 변수를 알리는 역할이며,

프로그래머 자신에게도 선언한 변수를 사용하겠다는 약속의 의미이다.  

 

변수는 고유한 이름이 있는 자료 값이 저장되는 영역이므로,

변수를 사용하려면 원칙적으로 변수선언 과정이 반드시 필요하다.

 

1. 변수 선언은 자료형을 지정한 후, 고유한 이름인 변수이름을 나열하여 표시한다.

2. 자료형은 int, double, float 와 같이 원하는 자료형 키워드를 사용하며,
변수이름은 관습적으로 소문자를 이용하며, 사용 목적에 알맞은 이름으로 특정한 영역에서 중복되지 않게 붙이도록 한다. 

3. 변수선언도 하나의 문장으로 세미콜론으로 종료한다.

4. 변수선언 이후에는 지정한 변수이름으로 저장하거나 값을 참조할 수 있다. 

 

자료형이 같은 경우에 여러 변수를 하나의 문장으로 선언할 수도 있다. 

 

변수에 저장 값 대입하기

 

대입연산자 '=' 은 오른쪽에 위치한 값을 이미 선언된 왼쪽 변수에 저장한다.

라는 의미의 화살표로 이해하자. 그리고 이 대입연산이 있는 문장을 '대입문'이라고 한다. 

또 이 대입연산이 있는 문장을 "대입문"이라고 한다. 

 

프로그램에서 변수는 수시로 값을 저장할 수 있는데, 하나의 값만 저장되며 가장 마지막에 저장된 값만이 남는다. 다음 소스에서 변수 age는 마지막에 저장된 21만이 저장된다. 

 

 

변수 초기화

 

변수를 선언만 하고 자료 값에 아무것도 저장하지 않으면 저장되고 오류가 발생할 수 있다.

그러므로 변수를 선언한 이후에는 반드시 값을 저장하도록 한다. 이를 변수의 초기화라고 한다. 

 

** 초기화하지 않은 지역변수는 그 저장 값에 정의되지 않으며 다른 연산에 참조될 수 없다. 

 

아래 처럼 변수를 선언하고 초기화했다.

 

아래처럼 l-value에는 r-value의 값을 저장할 수 있는 변수나 변수를 표현하는 표현식이 들어가야한다. 

 


변수의 3요소와 이용

 

변수에서 주요정보인 변수이름, 변수의 자료형, 변수 저장값을 
변수의 3요소라고 한다. 

 

즉 변수선언 이후에 저장 값이 대입이 되면 변수의 3요소가 결정된다. 

 

변수 선언 이후에 변수의 3요소 중에 변수이름과 변수형은 바뀌지 않으나

대입 문장에 의해 변수 저장 값은 계속 바뀔 수 있으며, 저장값이 바뀔 수 있으므로 변수라고 부른다.

 

아레 보면 변수의 좌측 값과 우측 값을 이해하고 더하고 빼기를 구현했다. 

그러면 아래와 같은 출력 창이 나온다. 


3.3 정수 자료형

 

C언어의 자료형 구조

 

C의 자료형은 기본형,유도형, 사용자정의형으로 나뉘어진다.

 

기본형은 기본이 되는 자료형으로 정수형, 부동소수형, 문자형, 무치형으로 나뉜다. 

 

무치형이란? 무치형 자료형인 void는 아무런 자료형도 지정하지 않은 자료형이나, 함수의 인자위치에 놓이면 인자가 없다라는 의미로 쓰이고, 함수의 반환 값에 놓이면 반환값이 없다의 의미로 쓰인다.

유도형은 기본형에서 나온 자료형으로 배열포인터, 함수 등으로 구성되어있다.

사용자 정의형은 기본형과 유도형을 이용해 프로그래머가 다시 만드는 자료형으로 열거형, 구조체, 공용체 등등 이 있다. 

 

 

 


정수형 int

 

정수형의 기본 키워드는 int다.
정수형에서 파생되어 short와 long이 있다.
각 int보다 작거나 같은 범위를, int보다 크거나 같은 범위의 값을 저장한다. 


 


음수, 0, 양수를 모두 지원하는 signed 자료형

 

정수형 short, int, long 모두 양수, 0, 음수를 표현할 수 있다.

 

그러므로, [부호가 있는]을 의미하는 signed 키워드는 정수형 자료형 키워드에 앞서 표시할 수 있다.

 

물론 이 signed 키워드는 생략될 수 있다.

즉 signed int와 int는 같은 자료형이다.

 

0과 양수만을 지원하는 unsigned 자료형

 

0과 양수만을 나타내는 정수 자료형은 short, int, long 앞에 키워드 unsigned를 표시한다.

즉 부호가 없는 정수인 unsigned int는 0과 양수만을 저장할 수 있는 정수 자료형이다.

 

자료형 unsigned int에서 int는 생략가능하다.

즉 unsigned int와 unsigned는 같은 자료형이다. 

 


정수형 저장공간

 

저장공간 크기를 살펴보면, 비주얼 스튜디오에서

 

short는 2바이트이며, int와 long는 모두 4바이트이다.

즉 int는 short보다 표현범위가 넓으며 long과는 같다. 

 

short %d, long은 %ld, long long은 %lld이다. 

 

짱중요!!!
저장공간 크기가 n비트인 signed 자료형은 그 크기가 -2^n-1 부터 2^n-1까지 유효하다.

마찬가지로 저장공간 크기가 n비트인 unsigned 자료형은 0부터 2^n-1까지 유효하다.

 

아래는 정수 표현을 위한 C언어의 다양한 자료형 예제이다. 

 

 

아래 정수의 내부표현은 3학년 운영체제나 컴퓨터구조 과목에도 많이 나오는 내용이므로 알면 좋다.


부동소수 자료형

 

부동소수 자료형은 실수를 표현하는 자료형으로 float, double, long double 이 세가지이다.

 

float는 4바이트이며, double과 long double은 모두 8바이트이다. 

 

 

일반적으로 float x = 3.14라고 하면 모두 자료형 double로 인식을 하므로, float형 변수로 저장 시 꼭 3.14F와 같이 float 형 상수로 저장하도록 해야한다. 

 

 

아래와 같이 부동소수형 변수의 선언과 활용을 예제로 실습해보았다. 

float는 모두 %f로 나타낸다 (double. long double 둘다)


문자형 자료형

 

문자형 자료형은 char, signed char, unsigned char 이렇게 총 3가지가 있다.

여기서 char은 character의 약자이며 저장공간 크기는 모두 1바이트이다. 

 

char는 signed char과 같으나, 컴파일러에 따라 다를 수 있다.

일반적으로 signed char와 unsigned char는 short보다 작은 범주의 정수 자료형으로 이용한다. 

 

즉, 문자열 char는 'a'와 같이 문자 상수를 이용하거나, 정수를 직접 저장할 수 있다.
또한 문자코드 값을 \ddd처럼 3자리의  8진수로, \xhh와 같이 두 자리의 16진수로도 표현할 수 있다.

 

그러나 c 언어에서 1바이트인 char로는 한글문자를 저장할 수 없으며,

단원 09에서 학습할 char 배열에서 지원이 가능하다.

 

 

다음은 문자형 변수의 선언과 이용 예제이다. 


자료형의 크기

연산자 sizeof를 사용하면, 자료형, 변수, 상수, 저장공간의 크기를 바이트단위로 알 수 있다. 


오버플로와 언더플로

 

자료형의 범주에서 벗어난 값을 저장하면 오버플로 또는 언더플로가 발생한다. 

 

정수형 자료형에서 최대값 +1은 오버플로로 인해서 최소값이 된다.
마찬가지로 최소값 -1은 최대값이 된다. 

변수의 크기와 오버플로우 예제이다.

다음은 문자 '#'과 대한민국 인구, 세계인구의 출력 Lab이다.  

 

나는 처음에  pop1의 자료형을 long라고 적었다. 그러나, %d는 int만 지원하므로, int로 작성해야한다. 


 

3.4 상수의 개념과 표현방법 
상수는 이름 없이 있는 그대로 표현한 자료 값이나(리터럴 상수),
이름은 있으나 정해진 하나의 값으로만 사용되는 자료값(심볼릭 상수)을 말한다.
 

리터럴 상수란? 달리 이름이 없이 소스에 그대료 표현해 의미가 전달되는 다양한 자료 값을 말한다.

예를 들면 10, 24.3 , "C는 흥미롭습니다." 와 같은 문자열이 그 예이다.

 

심볼릭 상수란? 리터럴 상수와 다르게 변수처럼 이름을 갖는 상수를 말한다.

예를 들면 PI ... 등이 예이다.

 

심볼릭 상수를 표현하는 방법은 const 상수, 매크로 상수, 열거형 상수 세가지가 있다

 

 


리터럴 상수

 

 

리터럴 상수란?
프로그램에서 소스에 그대로 표현해 의미가 전달되는 다양한 자료 값을 말한다. 

 

상수는 정수, 실수, 문자, 문자열 상수와 같이 네 가지 분류로 나뉘며 표현방법은 아래와 같다.

 

1. 정수 상수: 정수를 그대로 표현 가능하다. ex) 4,5,20, 0x1f, 0x1d
2. 실수 상수: 실수를 그대로 표현 가능하다. ex) 2.5, 3.1
3. 문자 상수: 한 문자를 작은 따옴표로 묶는 표현 (일반문자('b', 'C') 와 특수문자(\n,\\n)로 나뉜다.)
4. 문자열 상수: 일련의 여러문자를 큰따옴표로 표현("C++", "Objective-C")

 


문자 상수 표현

 

문자 상수는 문자 하나의 앞 뒤에 "작은 따옴표"를 넣어 표현한다. 

또 다른 문자 표현으로는 \ddd와 같이 한 자리에서 세 자리까지의 8진수 코드 값을 이용할 수 있으며

\xhh처럼 \x뒤에 한 자리에서 두 자리까지의 16진수 코드 값을 나타낼 수 있다.

 

함수 printf()에서 문자 상수를 출력하려면  %c가 포함되는 형식제어 문자열을 사용한다. 

 


이스케이프 시퀀스

 

 

이스케이프 시퀀스(특수문자)란,
역슬래쉬 \와 문자의 조합으로 표한하는 문자를 뜻한다. 

아래는 이스케이프 문자의 다양한 사용이다. 

아래는 이스케이프 문자를 비롯한 다양한 문자 리터럴의 표현의 예이다. 


정수와 실수, 리터럴 상수

 

정수형 상수는 int, unsigned int, long, unsigned int, long long, unsigned long long 등의 자료형으로 나뉜다.

 

즉, 일반 정수는 int 유형이며, 345L처럼 정수 뒤에 L또는 l을 붙이면 long int를 나타낸다.


 

2진수와 16진수 표현방식

 

일반적으로 상수의 정수 표현은 10진수로 인식되나, 숫자 0을 앞에 놓으면 8진수로 인식한다.

8진수이므로 0뒤에 숫자 0에서 7까지 만으로 구성되어야한다. 

 

또 알바펫으로 0X를 숫자 앞에 놓으면 16진수가 된다. 

16진수는 0에서 9까지의 수와 A,B,C,D,E,F(대소문자 모두 가능)으로 나타낸다.

 

함수 printf()에서 정수를 출력하려면 다음과 같이 %d의 형식 제어문자를 사용한다.

형식 제어문자 %d의 d는 10진수 decimal에서 나온 d이다. 

 

 


지수표현 방식

 

실수는 e 또는 E를 사용해 10의 지수표현 방식으로 나타낼 수 있다

 

ex) 3.14e+2는 3.14^2 을 나타낸다

ex) 3.14e-2는 3.14^-2 를 나타낸다

 

함수 printf()에서 지수표현 방식과 함께 일반 실수를 출력하려면 다음과 같이 %f의 형식 제어문자를 활용해야한다. 

형식제어문자 %f로 출력되는 실수는 소수점 6자리까지 출력된다.

 

 


실수형 리터럴 상수

 

실수형 상수도 float, double, long double의 자료형으로 나누어진다.

즉 일반 소수는 double 유형이며, float 상수는 숫자 뒤에 f나 F를 붙인다.

 

long double 상수는 숫자 뒤에 L을 붙여서 표시한다. 

 

아래는 정수형과 실수형 리터럴 상수의 다양한 표현을 나타낸다. 


 

심볼릭 const 상수

 

심볼릭 상수는 변수처럼 고유한 이름이 있는 상수로서,

변수 선언에서  키워드 const를 자료형 앞에 삽입하면 변수로는 선언되지만.

일반 변수와는 달리 초기 값을 수정할 수 없으며, 이름이 있는 심볼릭 상수가 된다.

 

변수 선언 시 자료형 또는 변수 앞에 키워드 const가 놓이면 이 변수는 심볼릭 상수가 된다. 

 

다른 변수와 구분하기 위해 관례적으로 모두 대문자로 선언한다.

 

아래는 키워드 const를 사용한 상수 선언이다. 

만약 아래 주석이 있는 줄에서 주석을 빼면 상수는 수정할 수 없으므로 컴파일 오류가 발생한다. 

 


열거형 상수 enum

 

열거형은 키워드 enum을 사용하여
정수형 상수 목록 집합을 정의하는 자료형이다.
 

상수 목록에 특정한 정수 값을 부분적으로 직접 지정할 수도 있다.

 

상수 값을 지정한 상수는 그 값으로, 따로 지정되지 않은 첫번째 상수는 0이며,

중간 상수는 앞의 상수보다 1씩 증가한 상수 값으로 정의된다. 

 

이렇게 enum 열거형 상수 예제를 실습해보았다.


전처리기 지시자 #define

 

이름이 붙여진 심볼릭 상수의 표현방법으로 매크로 상수가 있다.

 

#define에 의한 심볼릭 상수도 주로 대문자 이름으로 정의하는데, 이를 매크로 상수라고 부른다. 

 

아래 예제는 정수형 최대 최소 매크로 상수를 <limits.h>로 표현해봤다.

 

 

아래는 부동소수점 최대 최소 매크로를 출력하는 lab이다.


 

이렇게 chapter 3도 끝이다 !! 뒤에 있는 연습문제는 가능하면 풀어서 올리도록 하겠다.!!!

그러면 앙뇽!