3. 연산자와 구문
1. 연산자
수학에서 우리가 계산식을 표기할 때에도 기호라는 것을 이용해서 덧셈식, 뺄셈식 등등을 표기하듯이, 프로그래밍 언어에서도 계산 작업을 수행할 때에는 연산자를 이용해서 계산하게 된다. 그 연산자의 종류로는 다음이 있다.
분류
|
연산자
|
산술 연산자
|
+, -, *, /, %
|
증가/감소 연산자
|
++, --
|
관계 연산자
|
<, >, ==, !=, <=, >=
|
조건 연산자
|
?:
|
논리 연산자
|
&&, ||, !
|
비트 연산자
|
<<, >>, &, |, ^, ~
|
할당 연산자
|
=, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
|
표 1 연산자의 종류
산술 연산자는 덧셈, 뺄셈 등 우리가 일상생활에서 가장 많이 사용하는 연산을 수행하는 연산자이다. 예시를 들어보자.
int a = 1 + 2;
int b = 4 – 1;
int c = 4 * 2;
int d = 4 / 3;
int e = 4 % 3;
double f = 5 / 2;
예상할 수 있듯이, 정수형 변수 a에는 3이 저장되고, b에는 3이 저장되며, c에는 8이 저장된다. 하지만 d는 정수형 변수인데, 4 / 3을 어떻게 저장할까? 소수점 뒷부분을 전부 빼 버린, 결국 나눗셈의 몫, 1만 남게 된다. 그리고 e에는 4 나누기 3의 나머지인 1을 저장하게 된다. 반면, 소수점이 붙을 수 있는 변수 f에는 5 나누기 2의 결과인 2.5가 전부 저장될 수 있게 된다.
증가 연산자와 감소 연산자는 의미가 간단하나, 가장 많이 쓰이는 연산자 중 하나이다. 증가 연산자인 ++를 변수 뒤에 붙이면 (예 : number++;) 그 변수의 수가 1 증가하며, 감소 연산자 --를 변수 뒤에 붙이면 (예 : number--;) 그 변수의 수가 1만큼 감소하게 된다.
관계 연산자는 조건문에 빠지지 않고 등장하는 단골 손님이다. <는 왼쪽이 오른쪽보다 작은 지를 확인, >는 오른쪽이 왼쪽보다 작은 지를 확인, <=는 오른쪽이 왼쪽보다 크거나 같은 지를 확인, >=는 왼쪽이 오른쪽보다 크거나 같은 지를 확인, 그리고 ==는 왼쪽과 오른쪽이 같은 지를 확인, !=는 왼쪽과 오른쪽이 다른 지를 확인하여 참이면 TRUE, 거짓이면 FALSE를 내놓는다.
논리 연산자는 말 그대로 논리 연산을 하는데, &&는 왼쪽 조건과 오른쪽 조건이 동시에 확인하여 참이면 참을 내놓고, ||는 왼쪽 조건과 오른쪽 조건 중 하나라도 만족하면 참을 내놓는다.
2. 구문
분기문은 프로그램의 흐름을 조건에 따라 여러 갈래로 나누는 흐름 제어 구문이다. 이 중에서 가장 많이 쓰게 될 것은 if문이다. 다음은 if 문의 사용 형식이다.
if ( 조건식 )
{
실행할 내용;
}
if 옆의 괄호 안에 있는 조건식이 성립하게 되면, if문 아래 중괄호 안의 내용을 실행하게 된다. 이때 조건식에는 방금 봤던 관계 연산자가 아주 많이 쓰이게 된다. 예시를 보자.
if ((10 % 2) == 0)
{
Console.WriteLine(“10은 짝수다”);
}
10을 2로 나눴을 때의 나머지와 0을 우선 조건식에서 비교한다. 결과는 TRUE이므로, if문은 중괄호 안의 내용을 실행하게 된다. 그럼 콘솔 창에 “10은 짝수다”라고 출력되고 끝날 것이다. 그리고 이와 같이 중괄호 안의 코드가 한 줄 밖에 되지 않는 경우, 그냥 중괄호를 생략하고 코드만 써 줄 수 있다.
우리는 if 문 안의 조건문이 참이 아닌 경우에서는 다른 작업이 수행되도록 하고 싶고, 아니면 여러 가지 경우에 대해서도 분기문을 실행시켜 주고 싶을 때가 있다. 이를 해결할 수 있는 방법이 아래 예시에 나와있다.
int a = 10;
if ( a > 1)
Console.WriteLine(“a is bigger than 1”);
else if ( a == 1 )
Console.WriteLine(“a is 1”);
else
Console.WriteLine(“a is smaller than 1”);
분기문 실행은 if부터 시작된다. 우선 a가 1보다 큰 지 확인해서, 1보다 크다면 그 아래의 코드를 실행시키고, 만약 그렇지 않다면 else if로 넘어가게 된다. 그리고 else if의 조건문에서 명시해 두었듯이, a가 1과 같은 지 확인하고, 참이라면 else if 바로 아래의 코드를 실행시키고, 만약 그렇지 않다면 else로 넘어가서 else 바로 아래의 코드를 실행시키게 된다. 위 예시의 경우 a는 1보다 크므로 if 문의 코드가 실행될 것이다.
이렇게 다양한 분기점에 대해서 if문을 붙여줄 수 있는데, else if문의 개수는 무한정으로 늘일 수 있다. 하지만 이 순서 배정에 있어서 생각을 해 줘야 하는데, 조건을 확인하는 순서는 코드에 쓰여 있는 순서대로 진행되기 때문이다. 그래서 가장 참일 확률이 높은 조건문을 가지는 분기문을 가장 상위에 띄워야 하고, 가장 확률이 낮은 것은 가장 아래에 띄워야 한다.
반복문은 특정 조건을 만족하는 동안 코드를 계속 반복해서 실행하도록 하는 문장이다. 그 종류는 4가지가 있는데, 모두 매우 자주 쓰이는 구문들이다.
첫 번째는 while 문이다. while 문은 다음의 형식을 가진다.
while ( 조건식 )
{
반복_실행할_내용;
}
while 문은 가장 먼저 조건식을 체크한다. 조건식이 참이면 중괄호 안의 코드를 수행하고, 조건식이 거짓이면 코드를 수행하지 않는다. 조건식을 먼저 체크하기 때문에 맨 처음부터 조건식이 거짓이면 while 문 안의 코드는 전혀 수행되지 않을 것임을 명심해야 한다.
두 번째는 do while 문이다. do while 문은 다음의 형식을 가진다.
do
{
반복_실행할_내용;
}
while ( 조건식 );
이 반복문의 특성은 조건식을 체크하기 전에 먼저 do 안의 코드를 실행한다는 것이다. 그래서 조건식이 맨 처음부터 거짓이더라도 반복 실행할 내용을 무조건 한 번은 수행하게 돼 있다.
세 번째는 for 문이다. for 문은 다음의 형식을 지닌다.
for ( 초기화식; 조건식; 반복식;)
{
반복_실행할_내용;
}
초기화식은 반복을 실행하기 전에 단 한 번만 실행되는 코드이며, 조건식은 반복문을 계속 수행할 지 체크하는 코드이다. 그리고 반복식은 반복이 한 번씩 끝날 때마다 실행되는 코드로, 주로 초기화식에서 선언한 변수를 변화시키는데 쓰이는 코드이다. 예시를 통해 확인해보자.
for ( int i = 0; i < 10; i++)
{
Console.WriteLine(i);
}
우선 초기화식에서 새로운 변수 i를 선언하고 값을 0으로 초기화한다. 이때 초기화하는 변수는 굳이 초기화식에서 새로 선언하지 않고 외부에서 가져와도 괜찮다. 초기화식을 처리한 후, 바로 조건식을 체크하는데, 만약 맨 처음부터 조건식이 성립되지 않으면 for 문 안의 코드는 수행되지 않고 끝난다. 조건식 체크 후에 조건식이 참이면, 반복식 말고 for 문 중괄호 안의 코드가 먼저 실행된다. 코드의 실행이 끝나면 그 후에 반복식을 실행한다. 이 예시의 경우, 결과는 다음과 같을 것이다.
0
1
2
3
4
5
6
7
8
9
이러한 for 문 안에 다시 for문을 집어넣어 중첩된 for 문을 쓸 수 있음을 알고 있으면 좋다.
네 번째는 foreach 문이다. foreach 문은 배열 또는 컬렉션을 순회하며 각 데이터 요소에 차례대로 접근하는 반복문이다. 형식은 다음과 같다.
foreach ( 데이터형식 변수명 in 배열_또는_컬렉션 )
{
반복_실행할_코드;
}
그리고 이에 대한 예시는 다음과 같다.
int[] arr = {0,1,2};
foreach (int a in arr)
Console.WriteLine(a);
정수형 배열 arr에는 0, 1, 2가 저장되고, foreach 문이 이 원소를 차례차례 살펴가며 각 원소를 콘솔 창에 출력하게 된다. 결과는 다음과 같을 것이다.
0
1
2
이 반복문은 다른 것에 비해서 상대적으로 사용 빈도가 적은 편이나, 쓰이면 유용한 경우가 있기 때문에 잘 알아 두는 것이 좋다.