언어/C

제어문

빨대도둑 2022. 10. 20. 20:44

제어문: 문장을 실행되는 순서를 제어하는 문장이며, 조건문과 반복문으로 나눈다. 

 

「조건문」

> 순차구조: 명령들이 순차적으로 실행되는 구조

> 선택구조: 둘 중의 하나의 명령을 선택하여 실행되는 구조

> 반복구조: 동일한 명령이 반복되면서 실행되는 구조

 

「if문」

if(조건식)
	실행문

> 일반적으로 조건식에는 연산의 결과값이 참이나 거짓으로 생성되는 수식을 사용한다. 따라서 조건식은 일반적으로 관계수식이나 논리 수식이 된다. 

 

「if-else문」

if(조건식)
	실행문
else
	실행문

> if-else문에서는 (x>y)?x:y와 같은 조건 연산자를 사용할 수 있다. 

 

「다중 if 문」

if(조건식1)
	if(조건식2)
    		문장;

 

「연속 if 문」

if(조건식1)
	문장1;
else if(조건식2)
	문장2;
else if(조건식3)
	문장3;
else
	문장4;

 

「switch 문」

switch(제어식){
	case c1:
    	문장;
        break;
        
    case c2:
      문장2;
      break;
      
    default:
      문장4:
      break;
}
  • break문이 없으면 선택된 case절 안의 문장들을 실행한 다음, 계속해서 다음 case절의 문장들을 실행하게 된다. 따라서 break문을 생략하면 중대한 오류가 발생할 수도 있다.
  • default문은 어떤 case문과도 일치하지 않는 경우에 선택되어 실행된다. default문은 생략될 수 있다. 만약 default 문이 없고 일치하는 case문도 없다면 아무것도 실행되지 않는다. 하지만 미처 예상하지 못했던 값을 알아내기 위하여 가급적 default 문을 포함하는 것이 좋다

-switch 문과 if-else문 중에서 선택해야 하는 경우의 수가 많아지면(5개 이상) switch문을 사용하는 것이 간결해 보인다. 

> switch문의 주의점

  1. 제어식의 값은 반드시 정수값으로 계산되어야 한다. 만약의 수식의 값이 정수로 나오지 않으면, switch문을 쓸 수 없다. 또한 상수여야 한다. 따라서 case절에 실수나 변수, 수식, 문자열을 사용하는 것은 컴파일 오류이다
  2. 정수의 범위에 대해서는 switch를 지정할 수 없다. 

 

「goto」

-goto문은 가장 역사가 오래된 명령문이다. 하지만 사용이 권장되지는 않는다. 그 이유는 프로그램을 복잡하게 만들기 때문이다. goto문은 무조건 갑자기 프로그램의 실행을 점프하게 만든다. 따라서 프로그램을 읽는 사람은 왜 점프를 하는지 알 수 없다.

 


「반복문」: 반복구조를 사용하면 프로그램이 간단하고 빠르게 된다. 

「while」

> 조건식의 값이 True인 동안에는 주어진 문장을 반복실행하며, 값이 False가 되면 반복을 중단한다. 

> 조건식은 참, 거짓으로 계산 될 수 있는 수식으로 값이 0이면 거짓, 1이면 참으로 간주한다. 

> 일반적으로 조건식은 관계 연산자나 논리 연산자를 사용한 수식이지만, 정수를 생성하는 어떤 수식도 사용할 수 있다.

while(조건식)
	실행문

> 반목이 무한정 되는 것을 '무한루프'라고 하는데, 무한루프는 절대로 피해야 할 오류로 반복문을 사용할 때에는 반드시 반복이 종료되는지를 확인해야 한다. 

 

- if문과 while문

> 조건이 한번만 실행되기를 원하면 if문을 사용하고, 한번 이상 실행 시키려면 while루프를 사용해야 한다. 

- 주의점

> 반복 조건식에 !=나 ==를 사용하는 것은 위험하다. 이는 무한 루프를 만들 수 있기 때문이다. 

 

「보초값」

> 데이터가 너무 많아서 개수를 알기 어려운 경우 데이터의 끝에다가 마지막을 알리는 특수한 데이터를 놓는다. 그러면 프로그램에서는 데이터를 입력하다가 이 특수한 데이터가 나타나면 입력을 중단한다. 이를 센티널 또는 보초값이라고 한다. 

 

「do... while」

do{
문장1;
문장2;
문장3;
}while (조건);

> 조건식은 참, 거짓을 가릴 수 있는 수식이며, 문장은 단일문 또는 복합문 일 수 있다. do... while문에서는 조건이 성립하지 않아도 루프 안의 문장이 한 번은 실행된다. 이후에 조건을 검사하면서 참이면 계속된다. 

 

-주의점

> do... while문은 반목 문장이 적어도 한 번은 실행된다. 일단 루프를 실행한 다음에 반복 조건 수식을 검사하기 때문이다. 따라서 do....while문은 반복 문장이 적어도 한번은 실행되어야 하는 경우에 사용하는 것이 좋다.

 

「for」

> for문은 정해진 횟수만큼 반복할 때 사용하는 반복구조이다. for loop(루프)라고 한다. 반복구조 중에서 가장 많이 사용하는데 장점이 제일 많기 때문이다. 

> for 문은 초기식, 조건식, 증감식의 3 부분으로 구성된다. 이들은 세미클론(;)으로 분리되어 있다. 

for(초기식;조건식;증감식){
	실행문
    }
    
for(i=0;i<5;i++){
	printf("*");
    }

> 초기식: 초기식은 반복 루프를 시작하기 전에 한 번만 실행된다. 주로 변수 값을 초기화하는 용도로 사용된다. 

> 조건식: 반복의 조건을 검사하는 수식이다. 이 수식의 값이 거짓이 되면 반복이 중단된다. 이 수식은 반복을 하기 전에 계산한다. 만약 조건식의 값이 거짓이면 한 번도 반복이 일어나지 않는다.

> 증감식: 한 번의 루프 실행이 끝나면 증감식이 실행된다. 

 

- while loop & for loop

> while loop는 루프가 몇 번이나 수행될지 모르는 환경에서 사용할 수 있다. 그러나 미리 반복 횟수를 아는 경우에도 사용할 수 있다. 따라서 for 루프는 while 루프로 변환이 가능하다

> while루프를 사용하여 프로그램하는 경우에도 역시 루프제어 변수를 초기화하는 문장, 루프 제어 변수를 어떤 값과 비교하여 반복 조건을 검사하는 문항, 루프 제어 변수를 증가시키는 문장들이 필요하다. 

 

> for, while, do... while 중 어떤 걸 사용할지 모를 때

개인의 취향이기는 하나, 선택 기준은 루프의 반복 횟수를 아는 경우에는 for 루프가 while 루프에 비해 약간 더 편리하다고 할 수 있다. 즉 루프 제어 변수를 ㄹ증가하는 것을 잊어버린다거나 하는 일이 while루프에 비해 덜 발생한다. 만약 조건만 존재하고 정확한 반복 횟수를 모르는 경우에는 while 구조가 좋다. 만약 반드시 한 번은 수행되어야 하는 문장들이 있다면 do... while 구조가 제격이다

while과 for는 반복하기 전에 조건을 검사하는 구조이고, do...while 은 먼저 실행한 후 반복 조건을 검사한다. 특별한 경우가 아닌 일반적인 경우에는 반복을 하기 전에 조건을 검사하는 것이 좋다.

 


「중첩 반복문」

for(초기식;조건식;증감식){
	for(초기식;조건식;증감식){
    	실행문
    }
 }

 

「break」

break문은 반복 루프를 벗어나기 위해 사용한다. 반복 루프 안에서 break문이 실행되면 반복 루프를 빠져나오게 된다. 

break문은 원하는 만큼 얼마든지 둘 수 있다. 그러나 break문을 너무 많이 사용하게 되면 코드가 난해해진다. 따라서 특수하게 반복 루프를 중단할 경우에만 break문을 사용하는 것이 좋다.

- 주의할 점: 중첩 반복 루프에서 break문을 사용하게 되면 내부의 반복문에만 영향을 끼친다.

 

「continue」

> 현재 실행하고 있는 반복 과정의 나머지를 생략하고 다음 반복을 시작하게 만든다. 

 

「goto」

많은 문제점 때문에 가능한 사용을 하지 말아야 하지만, 효과적으로 사용될 수 있는 한 가지 경우가 중첩 반복 루프이다. 중첩 루프 안에서 어떤 문제가 발생했을 경우, goto를 사용하면 단번에 외부로 빠져나올 수 있다.