이번에는 C언어의 변수와 연산자에 대해 간단히 알아 보겠습니다.
1. 변수와 연산자
연산자 : + - x / 처럼 특정연산을 요구할 때 사용하는 약속된 기호 입니다.
변수 : 특정 연산의 결과나 특정 값을 저장하기 위해 사용되는 것이 변수 입니다.
변수를 선언한다는 것은 메모리 공간을 할당한다는 말이에요! (메모리 할당에 대해서는 추후 포인터를 다루면서 다시 설명 하도록 하겠습니다.)
변수 선언과 연산자를 사용한 결과를 출력한 간단한 예제를 보도록 하겠습니다.
int 라는 것은 조금 후에 추가적으로 설명을 드리도록 하고, 5 번째 줄의 int num1 = 3; 을 보시면 num1 = 3.
이 말은 num1 이라는 변수를 선언 해주고, num1이라는 변수에 3이라는 값을 저장 한다는 의미입니다.
11번째 줄의 printf() 함수를 사용하여 출력한 결과를 보면 num1이라는 변수에 저장 되어진 3이라는 값이 정상적으로 출력 되는 것을 확인 가능합니다.
또한 7번째 줄에서 연산자를 활용하여 num1과 num2에 저장 되어 있는 값을 연산하여 나온 결과 값을 result라는 변수에 저장 합니다.
result 값도 9번째 줄에서 출력을 해보게 되면 num1과 num2의 값이 연산이 되어진 후에 나온 결과 값이 출력되는 것을 알 수 있습니다.
* 변수 선언시 초기화를 해주지 않으면 쓰레기 값이 출력 되거나, 에러가 발생합니다 ! (초기화 해주는 것은 변수를 선언하자마자 처음 값을 넣어 주는 것을 말합니다.)
2. 변수의 이름 규칙 : 변수의 이름을 선언 할 때는 지켜야 할 규칙이 있습니다. 이것을 변수의 이름 규칙이라 합니다.
- 변수의 이름은 알파벳, 숫자, 언더바(_)로 구성됩니다.
- C언어는 대소문자를 구분합니다. ( * 변수 Num과 변수 num은 서로 다른 변수이므로 주의 하셔야 합니다 !)
- 변수의 이름은 숫자로 시작할 수 없고, 키워드도 변수의 이름으로 사용할 수 없습니다. (키워드는 미리 약속된 단어들을 얘기합니다. ex) int, else, if 등등..)
- 변수의 이름 사이에 공백이 삽입될 수 없습니다. ex) int num1 test; <<< 이러한 경우 int num_test; 공백대신 언더바(_)를 사용하시면 하나의 변수로 인식합니다.
3. 변수의 종류
1) 정수형 변수
- 정수 값의 저장을 목적으로 선언된 변수 입니다.
- 정수형 변수는 char형, short형, int형, long형 변수로 나누어 집니다.
2) 실수형 변수
- 실수 값의 저장을 목적으로 선언된 변수 입니다.
- 실수형 변수는 float형 변수와 double형 변수로 나누어 집니다.
* 정수형 변수와 실수형 변수가 나누어지는 이유는 정수를 저장하는 방식과 실수를 저장하는 방식이 다르기 때문입니다. 이는 추후에 추가적으로 설명하겠습니다.
4. 단항 연산자, 이항 연산자
단항, 이항 연산자는 피연산자의 수를 기준으로 나누어진 연산자입니다.
ex) 3 + 4 << +는 피연산자로 왼쪽과 오른쪽에 각각 3과 4를 피연산자로 가지기 때문에 이항 연산자입니다.
++num; << ++는 피연산자로 오른쪽에 num만을 사용하기 때문에 단항 연산자입니다.
5. 대입 연산자, 산술 연산자
대입 연산자 : 값을 저장하는 연산자입니다.
산술 연산자 : 산술 연산을 하는 연산자입니다.
연산자 |
연산자의 기능 |
결합방향 (연산의 실행이 어느 방향으로 진행되어지는지를 나타냅니다.) |
= |
연산자 오른쪽에 있는 값을 연산자 왼쪽에 있는 변수에 대입합니다. ex) num = 20; |
<- |
+ |
두 피연산자의 값을 더합니다. ex) num = 4 + 3; |
-> |
- |
왼쪽의 피연산자 값에서 오른쪽의 피연산자 값을 빼줍니다. ex) num = 4 - 3; |
-> |
* |
두 피연산자의 값을 곱합니다. ex) num = 4 * 3; |
-> |
/ |
왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눕니다. ex) num = 4 / 3; |
-> |
% |
왼쪽의 피연산자 값을 오른쪽의 피연산자 값으로 나눴을 때 얻게 되는 나머지를 반환합니다. ex) num = 7 % 3 |
-> |
6. 복합 대입 연산자
복합 대입 연산자는 두가지의 연산자가 복합으로 만들어진 하나의 연산자를 복합 연산자라 합니다.
ex) + 와 = 연산자가 복합으로 만들어진 하나의 연산자 +=
복합 대입 연산자의 종류
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 |
왼쪽의 연산과 오른쪽의 연산이 같은 연산입니다.
이때 a = a + b 라는 연산을 예로 들어서 a값이 a + b 값과 같다라고 생각 하실 수 있습니다.
하지만 프로그래밍 언어에서는 그러한 의미가 아닌 a에 저장되어 있는 값을 b만큼 증가시켜서 나온 값을 다시 a에 저장하라는 의미 입니다.
ex) int a = 3; a = a + 1; a = 3 + 1; 이 되어 a에 3이 아닌 4가 저장이 됩니다.
이러한 연산을 간편하게 해주기 위하여 복합 대입 연산자를 사용합니다.
7. 부호의 의미를 갖는 + 연산자와 - 연산자
+ 연산자와 - 연산자는 산술 연산의 연산자에 해당이 되지만, 수학시간에서 양수, 음수를 결정짓는 부호를 나타내는 부호 연산자로도 사용이 됩니다.
8. 증가, 감소 연산자
증가, 감소 연산자는 변수에 저장된 값을 1 증가 및 감소시키는 경우에 사용되는 연산자입니다.
* 단항 연산자입니다. 사용빈도가 굉장히 높으니 꼭 알아 두셔야 합니다 !
연산자 |
연산자의 기능 |
결합방향 |
++num |
++num 연산을 실행 후, 문장을 실행합니다. ex) val = ++num; |
<- |
num++ |
num++의 연산보다 문장을 먼저 실행하고, 연산을 진행 합니다. num++연산의 결과 값은 다음 행 부터 적용 됩니다. ex) val = num++; |
-> |
--num |
--num 연산을 실행 후, 문장을 실행합니다. ex) val = --num; |
<- |
num-- |
num--의 연산보다 문장을 먼저 실행하고, 연산을 진행합니다. num++연산의 결과 값은 다음 행 부터 적용 됩니다. ex) val = num--; |
-> |
위의 표가 이해가 되지 않으시면 다음 예제를 보고 확인하시면 됩니다.
* 증가, 감소 연산자 사용시 주의 사항
- ex) ++3 혹은 --3의 경우에는 에러가 발생 합니다. ++연산자, -- 연산자는 '저장 되어 있는 값(변수)'에 대하여 연산을 실행하기 때문에 ++3과 --3처럼 상수에 직접 연산을 하게 되면 에러가 발생합니다. ++연산자와 --연산자의 피연산자는 변수만 사용 가능합니다. 반드시 ++와 -- 사용시 상수가 아닌 변수를 대상으로 사용하셔야 합니다.
9. 관계 연산자
관계 연산자는 두 개의 값을 비교하는 연산자입니다.
관계 연산자의 종류
연산자 |
연산자의 기능 |
결합방향 |
< |
ex) n1 < n2 n1 이 n2 보다 작은가? |
-> |
> |
ex) n1 > n2 n1 이 n2 보다 큰가? |
-> |
== |
ex) n1 == n2 n1과 n2가 같은가? |
-> |
!= |
ex) n1 != n2 n1 과 n2가 다른가? |
-> |
<= |
ex) n1 <= n2 n1이 n2 보다 같거나 작은가? |
-> |
>= |
ex) n1 >= n2 n1이 n2 보다 같거나 큰가? |
-> |
관계 연산자를 사용할 때는 주로 두 개의 값을 비교해서 참(O) 또는 거짓(X)를 결정하기 위해 사용하는데 이 때 참 이면 0이 아닌 수 중 대표적인 값인 1을 사용하고, 거짓일 경우 0을 사용합니다.
다른 대부분의 프로그래밍 언어들도 비슷하겠지만 C언어는 0이 아닌 모든 값을 참으로 간주합니다. 단지 1이 참을 의미하는 대표적인 값이기 때문에 연산의 조건을 만족하면 참을 의미하는 1을 반환합니다.
추가적인 이해가 필요 하신 분들은 예제 사진을 보고 확인 하시면 되겠습니다.
10. 논리 연산자
논리 연산자는 AND(논리곱), OR(논리합), NOT(논리부정)을 표현하는 연산자입니다.
(저 같은 경우 AND는 수학의 교집합, OR는 합집합, NOT은 여집합 처럼 이해를 했습니다. 완전히 같은 건 아니지만 상당히 비슷 하더라구요. 그렇다고 제가 맞다는 말이 아니에요! 혹시라도 제 방식처럼 이해 하시는 분이 계실 수 있는데 잘 못 이해 하시면 안 됩니다. ㅠㅠ... 반드시 자신이 이해 하기 쉬운 방식으로 이해 하시는 걸 추천 드립니다 !)
논리 연산자의 종류
연산자 |
연산자의 기능 |
결합방향 |
&& |
ex) A && B A와 B 모두 '참'이면 연산결과로 '참'을 반환(논리 AND) |
-> |
|| |
ex) A || B A와 B 둘 중 하나라도 '참'이면 연산결과로 '참'을 반환(논리 OR) |
-> |
! |
ex) !A A가 '참'이면 '거짓', A가 '거짓'이면 '참'을 반환(논리 NOT) |
<- |
논리 연산자도 헷갈리는 경우가 많은데요(저는 그랬습니다...) 추가적인 이해가 필요하신 분들은 다음의 예제를 통해 확인 하시면 되겠습니다.
11. 콤마 연산자(,)
콤마도 연산자입니다.
단지 다른 연산자들과 달리 연산의 결과가 아닌 '구분'을 목적으로 사용합니다.
둘 이상의 변수를 동시에 선언하거나 둘 이상의 문장을 한 행에 삽입하는 경우에 사용되는 연산자 입니다.
콤마 연산자의 사용 예제 입니다.
변수 선언에서도 확인 할 수 있듯이 일반적으로 int num1 =1; 처럼 변수를 선언 해주고 다음 행으로 넘어가서 선언 해주는 경우도 있지만 예제처럼 콤마(,)를 사용하여 한 행에서 변수 선언을 다 해주는 경우도 가능한 것을 확인 할 수 있습니다.
12. 연산자의 우선순위와 결합방향
연산자의 우선순위
- 연산의 순서에 대한 순위입니다.
- ex) 덧셈과 뺄셈보다는 곱셈과 나눗셈의 우선순위가 높습니다.
연산자의 결합방향
- 우선순위가 동일한 두 연산자가 하나의 수식에 존재하는 경우, 어떠한 순서대로 연산하느냐를 결정해 놓은 것입니다.
- 우선순위가 동일한 두 연산자 사이에서의 연산을 진행하는 방향을 말합니다.
- ex) 덧셈, 뺄셈, 곱셈, 나눗셈 모두 결합방향이 왼쪽에서 오른쪽으로 진행됩니다. 3 + 4 X 5 / 2 - 10 이 경우 연산자의 우선순위에 근거하여 곱셈과 나눗셈이 먼저 진행이 됩니다. 또한 결합방향에 근거하여 곱셈이 나눗셈보다 먼저 진행이 됩니다.
다음은 연산자의 우선순위와 결합방향에 대한 정보를 나타낸 표입니다.
순위 |
연산기호 |
연산자 |
결합방향 |
1위 |
() |
함수호출 |
-> |
[] |
인덱스 |
||
-> |
간접지정 |
||
. |
직접지정 |
||
++(postfix) --(postfix) |
후위증가 및 감소 |
||
2위 |
++(prefix) --(prefix) |
전위증가 및 감소 |
<- |
sizeof |
바이트 단위 크기 계산 |
||
~ |
비트 단위 NOT |
||
! |
논리 NOT |
||
-, + |
부호 연산(음수와 양수의 표현) |
||
& |
주소 연산 |
||
* |
간접지정 연산 |
||
3위 |
(casting) |
자료형 변환 |
<- |
4위 |
*, /, % |
곱셈, 나눗셈 관련 연산 |
-> |
5위 |
+, - |
덧셈, 뺄셈 |
-> |
6위 |
<<, >> |
비트이동 |
-> |
7위 |
<, >, <=, >= |
대소비교 |
-> |
8위 |
==, != |
동등비교 |
-> |
9위 |
& |
비트 AND |
-> |
10위 |
^ |
비트 XOR |
-> |
11위 |
| |
비트 OR |
-> |
12위 |
&& |
논리 AND |
-> |
13위 |
|| |
논리 OR |
-> |
14위 |
?: |
조건연산 |
<- |
15위 |
=, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |= |
대입연산 |
<- |
16위 |
, |
콤마연산 |
-> |
13. C언어의 표준 키워드
마지막으로 C언어의 표준 키워드에 대해 알아 보겠습니다.
C언어의 문법을 구성하는, 그 의미가 결정(약속)되어 있는 단어 키워드(keyword)라 합니다.
keyword는 약속되어 있는 단어들이기 때문에 변수의 이름으로 지정할 수 없습니다.
keyword의 종류는 다음과 같습니다.
auto |
_Bool |
break |
case |
char |
_Complex |
const |
continue |
default |
do |
double |
else |
enum |
extern |
float |
for |
goto |
if |
_Imaginary |
return |
restrict |
short |
signed |
sizeof |
static |
struct |
switch |
typedef |
union |
unsigned |
void |
volatile |
while |
표에서 확인 가능한 키워드들은 기능 및 의미가 정해져 있기 때문에 변수로 사용할 수 없습니다.
다음에는 데이터 표현방식에 대하여 공부하고, 글을 올리도록 하겠습니다.
'프로그래밍 언어 > C' 카테고리의 다른 글
C언어 반복문 - while문(1) (0) | 2017.01.02 |
---|---|
C언어 printf 함수 와 scanf 함수 (0) | 2017.01.01 |
C언어 상수와 기본 자료형 (0) | 2016.12.27 |
C언어 데이터 표현방식 (0) | 2016.12.25 |
C언어 공부 시작 (0) | 2016.12.21 |