본문 바로가기

C & C++

C/C++ 기초 - 문 (Statement)

조건문 ( Conditional statement )


 조건문은 갈림길이 생겨서 들어오는 조건에 따라 코드의 흐름을 제어할 수 있습니다. 조건문은 크게 if문과 switch문으로 나눌 수 있습니다.

 

if 문

 if문은 프로그래밍을 할 때 엄청나게 중요하며 자주 사용됩니다. 기본적으로 if 문의 조건으로 들어온 값이 true인지 false인지에 따라 특정 코드를 동작시킬 것인지 결정하게 됩니다.

 if문은 else와 함께 사용되기도 하는데, if의 사용법을 4가지로 구분하여 설명하겠습니다.

 

int main()
{
	if (10 < 20)
	{
		// 조건이 true일 경우 여기에 해당된다.
	}

	if (10 < 20)
		;// 조건이 true일 경우 여기에 해당된다.
}

if만 사용하는 경우

 if의 옆 소괄호에 들어오는 값이 true인 경우 if의 중괄호 안으로 진입하고 false인 경우 if를 건너뛰게 됩니다.

 

 

int main()
{
	if (10 < 20)
	{
		// 조건이 true일 경우 여기에 해당된다.
	}
	else
	{
		// if의 조건이 false일 경우 여기에 해당된다.
	}

	if (10 < 20)
		;// 조건이 true일 경우 여기에 해당된다.
	else
		;// if의 조건이 false일 경우 여기에 해당된다.
}

if / else를 사용하는 경우

 if의 조건이 true라면 if의 중괄호 안의 코드가 작동하고 false라면 else 쪽의 코드가 작동하게 해주는 방법입니다. else는 앞에 if가 있는 경우에 사용할 수 있습니다.

 

 

int main()
{
	if (10 < 20)
	{
		// 조건이 true일 경우 여기에 해당된다.
	}
	else if (20 < 10)
	{
		// if의 조건이 false, else if의 조건이 true일 경우 여기에 해당된다.
	}
	else if (20 < 10)
		;// if와 앞의 else if의 조건이 false, 현재 else if의 조건이 true일 경우 여기에 해당된다.
}

if / else if를 사용하는 경우

 else if는 if의 조건이 false였을 경우 또 다른 조건을 확인하게 해줍니다. 또한 else if는 계속해서 이어갈 수 있습니다. 

 

 

int main()
{
	if (10 < 20)
	{
		// 조건이 true일 경우 여기에 해당된다.
	}
	else if (20 < 10)
	{
		// if의 조건이 false, else if의 조건이 true일 경우 여기에 해당된다.
	}
	else if (20 < 10)
		;// if와 앞의 else if의 조건이 false, 현재 else if의 조건이 true일 경우 여기에 해당된다.
	else
		;// if와 else if의 조건이 모두 false일 경우 여기에 해당된다.
}

if / else if / else를 사용하는 경우

 if / else if에 else를 추가하여 모든 조건이 만족하지 않는 경우에 해당되는 코드가 작동하도록 할 수 있습니다.


 

switch-case 문

 switch문이라고도 하기도 하는데 switch는 혼자서는 코드의 흐름을 제어하지 못하므로 switch-case문이라고 함께 얘기하기도 합니다.

 

int main()
{
	int a = 5;

	switch (a)
	{
	case 1:
		break;
	case 2:
		break;
	case 3:
	case 4:
	case 5:
		break;
	case 6:
		break;
	default:
		break;
	}
}

( 코드에 나오는 break는 글 밑부분의 점프문에서 확인할 수 있습니다. )

 

 switch의 옆 소괄호에 인자가 들어오게 되고 인자의 값에 해당되는 case로 점프하게 됩니다. 예시의 경우 5가 들어왔으므로 case 5에 진입하게 됩니다.

 case 3과 case 4에는 break가 존재하지 않는 것을 확인할 수 있는데 이럴 경우에 인자로 3이 들어왔다면 case 3에 해당되는 코드만 실행시키는 것이 아니라 case 4와 case 5의 코드까지 함께 실행되니 이를 방지하기 위해서는 break를 사용해야 합니다. 의도적으로 다음 case의 코드가 작동되도록 break를 사용하지 않을 수도 있습니다.


 

반복문( Iteration statement )


 반복문은 특정 코드들을 조건이 만족하는 동안 계속해서 실행하게끔 할 수 있습니다. 반복문의 기본적인 구성으로 for문, while문, do/while문이 있습니다.

 


for 문

#include <iostream>

int main(void)
{
	for (int i = 0; i < 10; i++)
	{
		printf("i의 값은 %d입니다.\n", i);
	}

	for ( ; ; )
	{
		
	}

	return 0;
}

 for문의 특징은 루프변수가 존재한다는 점입니다. for문의 시작과 동시에 변수를 선언 및 정의할 수 있습니다. (예시의 int i = 0 부분) 변수를 꼭 선언하거나 정의해야 할 필요는 없습니다. 이 단계를 초기화라고 합니다.

 초기화 단계 직후에 조건식을 확인합니다. (예시의 i < 10 부분) 조건식을 확인하여 조건이 true일 경우에 for문이 작동하게되고 false인 경우 for문이 종료됩니다. 이 단계를 조건식이라고 합니다.

 조건식이 true가 되어 for문이 작동을 다하고 나면 증감식이라고 불리는 단계로 갑니다. 증감식 단계에서 변수의 값을 변경할 수 있습니다.

 증감식에서 변수의 값을 변화시킨 후 다시 조건식을 확인해서 true일 경우에 계속 진행하고 false가 되면 for문이 종료됩니다.

 스크린샷 기준으로 1 -> 2 -(조건이 true라면)-> 3 -> 4 -> 2 -(조건이 true라면) -> 3 -> 4 -> ... 와 같은 방식으로 반복문이 작동하게 됩니다.

 초기화, 조건식, 증감식 각 구간은 비워둘 수 있습니다. 다만 조건식을 비워둘 경우 따로 for문을 탈출하기위한 명령어를 사용하지 않는다면 무한 루프에 빠지게 됩니다.

 


while 문

#include <iostream>

int main(void)
{
	int i = 0;

	while (i < 10)
	{
		printf("i의 값은 %d입니다.\n", i);

		i++;
	}

	while (true)
	{
		
	}
	
	return 0;
}

 while문은 조건식을 만족하는 동안 계속 작동하는 반복문입니다. for문으로 할 수 있는 것은 while문으로도 할 수 있고, while문으로 할 수 있는 것도 for문으로 할 수 있지만, 보통 for문에서 초기화와 증감식을 사용할 필요가 없는 경우에 while문을 사용하는 경우가 많습니다.

 조건식에 true 혹은 0이 아닌 숫자를 넣으면 무한 루프가 되는데, 이 경우 탈출 명령어를 사용해주어야 합니다. 특히 사용자가 원하는 때에 반복문을 탈출하게끔 설계하여 무한 루프 시킬 때 while문을 많이 사용합니다.

 


do-while 문

#include <iostream>

int main(void)
{
	int i = 0;

	do
	{
		printf("i의 값은 %d입니다.\n", i);

		i++;
	} while (i < 10);
	
	return 0;
}

 do-while문은 앞선 두 반복문과는 다르게 일단 해당 구간의 코드를 최소 1번은 작동시키는 반복문입니다.

 코드를 작동시키고 나서 조건식을 확인하고 결과에 따라 계속 진행하거나 반복문을 종료시키게됩니다. 이런 구조가 필요한 상황에서 사용할 수 있는 반복문이라고 할 수 있겠습니다.


 

점프문 ( Jump statement )

 


 점프문에는 break문, continue문, goto문, return문이 있습니다. 이 문들은 코드의 흐름을 다른 곳으로 이동시키고자 할 때 사용됩니다.

 


break문

#include <iostream>

int main(void)
{
	for (int i = 0; i < 10; i++)
	{
		if (i > 5)
			break;

		printf("i는 %d입니다.\n", i);
	}

	return 0;
}

 예시 코드에서 for문의 조건식에 의해 i가 10이 될 때까지 반복되어야 하지만, if문 안에 있는 break 때문에 i가 6이 되면 if의 조건이 true가 되고 break가 작동해서 for문에서 탈출하게 됩니다. break는 이처럼 반복문 내에서 반복문을 강제로 종료시키기 위해 사용하거나 switch-case문에서 탈출하기 위해 사용됩니다.

 


continue문

#include <iostream>

int main(void)
{
	for (int i = 0; i < 10; i++)
	{
		if (5 < i && i < 8)
			continue;

		printf("i는 %d입니다.\n", i);
	}

	return 0;
}

 continue문은 반복문의 시작점으로 돌아가는 명령어입니다. 예시 코드에서 "i는 %d입니다.\n"가 i가 5일 때 까지는 출력이 되지만, 6부터는 조건문에 의해 continue가 작동하여 증감문으로 이동하고 다시 조건문을 확인하여 i가 아직 10보다 작으므로 다시 for문을 계속 진행하는 작업을 i가 8이 될 때까지 반복합니다.

 i가 8이되면 if문의 조건을 충족하지 못하므로 continue가 더 이상 작동하지 않고 "i는 9입니다.\n"까지 출력하고 반복문을 끝낼 수 있게 됩니다.

 이처럼 continue는 작동하게되면 반복문 내에서 continue 뒤에 있는 코드들을 건너뛰게 할 수 있습니다.

 


return문

#include <iostream>

int sum(int a, int b)
{
	return a + b;

	return a - b;
}

int main(void)
{
	int a = 10;
	int b = 3;
	int c = 0;

	c = sum(a, b);

	printf("c는 %d입니다.\n", c);

	return 0;
}

 return문은 함수를 종료시키고 값을 반환하는 역할을 합니다. 예시 코드에서 int sum(int a, int b)라는 함수를 만들었습니다. 이 함수는 return으로 인해 a와 b를 더한 값을 반환시키는 함수입니다. 반환된 값은 함수를 호출한 지점으로 나와 c에 대입되어 출력 결과가 "c는 13입니다."가 나오게 해 줍니다.

 return문이 작동할 때 함수가 종료되므로 현재 코드에서는 절대 return a - b;는 작동하지 않습니다.

 


goto문

#include <iostream>

int main(void)
{
	int a = 10;

	re:
	printf("%d\n", a);
	a++;

	if (a < 20)
		goto re;

	return 0;
}

 goto문은 코드 내에 정의된 지점으로 점프시키는 역할을 합니다. 예시 코드는 goto문을 사용하여 마치 반복문을 사용한 것처럼 작동하게 만들었습니다.

 goto문은 코드의 흐름을 내가 원하는 지점으로 보낼 수 있다 보니 상당히 강력한 기능이지만 많이 사용하게 되면 코드가 난잡해져서 알아보기가 힘든 코드가 되기 때문에 사용을 지양하는 분위기입니다.

 저 개인적인 의견으로는 goto문 사용을 지양하시되 코드를 공부하다 보면 goto문 쓰기에 좋아 보이는 상황이 가끔 있는데 그럴 때 한두 번씩 사용해보시는 게 좋다고 생각됩니다.