# [프로그래밍 언어] 5. Statement-Level Control Structures

- 명령형 언어 프로그램에서 배정문 만으로 모든 유용한 프로그램 작성은 어려움

- 제어문을 사용해야한다 → 선택문 / 반복문

## 선택문

---

- 프로그램의 두 개 또는 그 이상의 실행 경로 중 선택 가능한 수단을 제공

### **2방향 선택문**

```javascript
if 제어식
then 절
else 절
```

```javascript
if (sum == 0)   // 1
    if(count = 0) // 2
        result=0;
else
    result = 1;
// C, Java -> 가장 가까운 if 2
// Python -> 들여쓰기 기준 if 1
```

- **제어식**: then 예약어 혹은 ()

    - C89: 산술식이나 제어식

    - Python, C99: 산술식이나 불리안식

    - 다른 언어: 불리안 식

- **절형식**: 단일 문장 혹은 {복합문}  / Python은 들여쓰기 + 콜론

- **선택자 중첩**: else 절이 어느 if와 연관되는가?

### **다중 선택문**

```javascript
switch(식){
    case 상수식1: 문장1;
    ...
    case 상수식n: 문장 n;
    [default: 문장 n+1;]
}
```

**switch-case**

- 임의의 개수의 문장들, 문장 그룹 중 한 개의 선택

- **식과 상수식**: 이산타입 → 문자, 정수, 열거 타입

- **문장**: 복합문, 블록 → C언어에서는 break; 필수

- **선택적 default 세그먼트**

- C언어의 경우 유연성 높아 이상한 코드 가능

```javascript
if 조건: 문장
else:
    if 조건: 문장 => elif
    else:...
```

**else-if**

- if-then-else-if문이 가장 일반적

- python은 elif를 사용

## 반복문

---

- 0번, 한 번 또는 그 이상의 횟수로 실행하는 것을 야기

- **몸체**: 실행이 반복문에 의해 제어되는 문장 모음

- **사전 검사**: 루프 몸체 실행 전 검사

- **사후 검사**: 루프 몸체 실행 후 검사

### **for - 계수 counter 기반 반복문**

```javascript
for (식 1 - 루프 초기화; 식 2 - 루프 제어; 식 3 - 루프 계수기 증가) 
    루프 몸체
```

- 루프 변수의 (초기 값, 종료값, 단계 크기 → 루프 매개변수)

- 계수값이 유지됨

- 식 1, 2, 3 모두 선택적, 여러 문장 포함 가능

    - 식1은 C99 이후 변수 정의 포함 가능

    - 식2는 산술식, 불리안식 → 항상 참이면 무한 루프

- Python은 range()를 사용 → range() 함수의 마지막은 포함되지 ㅇ낳음

### **while - 논리 logical 기반 반복문**

```javascript
// 사전-검사 논리 제어 루프
while(제어식)
    루프 몸체
    
```

```javascript
// 사후검사 논리 제어 루프
do
    루프 몸체
while(제어식);
```

- 가장 일반적인 방법 (Java는 Boolean 타입이어야 함)

### **break, continue - 사용자 정의 반복 제어**

- 처음이나 끝이 아닌 곳에서 사용자 지정 탈출 포함

- 구문적 메커지니즘 제공

    - continue: 루프를 건너뜀

    - break: 가까운 루프 탈출

    - Java는 레이블 있는 탈출 (break) → flag 사용 X

### **데이터 구조에 기반한 반복**

- 반복 시작 시점에 호출, 한 개의 원소 반환

- 객체 지향 프로그래밍 → ㅜ추상 데이터타입 사용

    - Iterable 인터페이스 구현 집합체들에 대해 반복과정 단순화

## 무조건 분기

---

**goto**

- 실행 흐름 제어에서 가장 강력 → 심각한 문제 초래

- 프로그램 판독이 어렵고 신뢰성 낮아짐, 유지보수 비용 높아짐

- Java, Python 등은 goto를 지원하지 않음

For the site tree, see the [root Markdown](https://slashpage.com/yerim-devnote.md).
