일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- C언어 # 핵심 정리
- C언어 #핵심정리
- C언어 #부록
- MySQL #핵심정리
- Hacking #Baic
- C언어 # 부록
- HTML #핵심정리
- PHP #핵심정리
- shell_script
- Bandit
- C++ 언어 # 핵심정리
- C++ 언어 #핵심정리
- C++ 언어 # 핵심 정리
- Today
- Total
cCcode
C Language [핵심정리] - 10 본문
1. switch 분기문
switch 분기문은 전에 설명한 if 분기문처럼 조건을 처리할 수 있습니다.
if는 참과 거짓일 때 두가지만 처리할 수 있었죠. 물론 else if 를 사용해 여러 조건을 지정해줄 수 있었지만, 매번 조건식을 지정해줘야 해서 번거로운 면이 없지 않아 있었습니다. 그에 비해 switch 분기문은 조건이 많아도 if 보다 더 간단히 처리할 수 있습니다.
switch 분기문은 항상 case와 함꼐 사용하는 데 변수의 값이 case에 지정한 값과 일치한다면 해당 코드를 실행하게 됩니다. 만약 어떤 case에도 해당되지 않는다면 default의 코드를 실행합니다. (default 는 생략할 수 있습니다.)
이처럼 switch 분기문은 형식이 일정하며 처리해야 할 조건이 많은 경우 사용합니다.
case 다음에는 반드시 값이 나와야 하며, 변수나 조건식이 올수는 없습니다. 그리고 값을 지정했으면 : (콜론)을 사용한 뒤 실행할 코드와 break를 입력합니다. 만약 case를 break로 중단하지 않으면 해당 case부터 마지막 case까지 계속 실행됩니다.
이런 상황을 fall through라고 부르며, "구멍 사이로 떨어지다" 라는 말에서 유래했습니다.
그래서 case에서 break를 생략하면 break가 나올 때까지 반복한다는 점을 이용해서 여러 가지 case에 같은 값을 출력할 수 있습니다.
+ case 안에서 변수를 선언하려면 { }(중괄호)로 묶어주면 됩니다. 단, 중괄호 안에서 선언된 변수는 해당 case 안에서만 사용할 수 있습니다. 그리고 switch에서 판별할 변수는 정수 자료형만 사용할 수 있고, 실수 자료형은 사용할 수 없습니다. 다만, 문자 자료형(char)도 일종의 정수 자료형이므로 switch에서 ' '(작은 따옴표)를 써 사용할 수 있습니다.
2. for 반복문 사용하기
C언어에서는 for 반복문을 괄호 안에 초기 식, 조건 식, 변화 식을 지정하여 이 부분을 루프 선언문(loop statement)라고 부릅니다. 그리고 중괄호 안에 반복할 코드를 작성하는 데 이 부분을 루프 본체(loop body)라고 부릅니다.
먼저 초기식부터 시작하여 조건식을 판별하는 데 여기서 조건식이 참이면 루프본체(반복할 코드)를 실행하고, 변화식을 수행합니다. 그리고 다시 조건식을 판별하여 참이면 반복하고 거짓이면 반복을 끝낸 뒤 다음 코드를 실행합니다.
이처럼 조건식 → 루프 본체 → 변화식 → 조건식으로 순환하는 부분을 루프(loop)라고 합니다.
◦ 초기 식: 반복문을 실행하는 초기식으로, 보통 정수형 변수를 선언한 뒤 0을 할당합니다. (이 변수를 루프 인덱스라고 부르며 index의 첫 머리글자를 가져와서 i를 주로 사용합니다.) 반복에 사용할 변수는 for문 밖에서 선언해도 됩니다.
대강 오류 메세지를 해석해보면 "for문 초기식에서 변수를 선언하는 건 오직 C99 과 C11 버전에서만 허용된다"라고 해석되므로 즉, 우리는 Dev c++ 컴파일러가 C99 과 C11 버전이 아니라는 걸 알 수 있습니다. 이러하듯 루프 인덱스(변수)선언은 상황에 따라 달라집니다. 그래서 무조건 초기식 안에 선언해야 한다 또는 무조건 for문 밖에 선언해야 한다가 아닌 상황에 따라 능동적으로 선언하시기 바랍니다.
◦ 조건식: 반복될 조건입니다. 조건식이 참이면 계속 반복하며, 거짓이 되면 반복문을 끝냅니다.
◦ 변화식: 반복문이 한 번 실행될 때마다 수행할 식입니다. 보통 증가 연산자 ++을 사용하여 변수의 값을 1씩 증가시킵니다.
아까 말씀드린 것처럼 초기식에 변수를 선언(loop initial declaration)하는 것은 C99 방식(C99은 1999년에 제정된 C언어 표준)입니다. C99 방식은 코드를 간결하게 만드는 장점이 있지만, 변수를 루프 본체에서만 사용할 수 있다는 단점이 있습니다.
이처럼 초기식에서 함수를 호출하는 방식으로 작성할 수 있습니다. 그러면 for 함수 외부에 따로 함수를 호출하지 않아도 되니 이득이죠. 그리고 초기 값, 조건식, 변화식을 모두 생략해서 무한 루프를 만들 수 있습니다.
11줄에 있는 if 분기문은 무한대로 출력할 경우 끝없이 반복되므로 일정 숫자가 되면 멈추도록하여 무한대를 가시적으로나마 보여드리려고 작성한 부분입니다.
3. while 과 do while 반복문 사용하기
while 반복문은 안에 조건식만 들어가고 초기식은 반복문 바깥에 있습니다. 그리고 중괄호 안에 반복할 코드와 변화식이 함께 들어갑니다.
조건식 → 본체 및 변화식→ 조건식 순으로 순화하는 부분이 루프(loop)입니다. 먼저 초기식부터 시작하여 조건식을 판별합니다. 여기서 조건식이 참이면 반복할 코드와 변화식을 함께 수행합니다. 그리고 다시 조건식을 판별하여 참이면, 코드를 계속하고 거짓이면 반복을 끝낸 뒤 다음코드를 실행합니다.
do while 반복문은 초기식이 밖에 있습니다. 그리고 do로 시작하여 중괄호 안에 반복할 코드와 변화식이 함께 들어가며 중괄호가 끝나는 부분에 조건식을 지정합니다.
먼저 초기식의 값과 상관없이 do { } 부분의 코드와 변화식을 무조건 실행합니다. 그 다음 조건식을 판별하여 참이면 코드를 계속 반복하고 거짓이면 반복을 끝낸 뒤 다음코드를 실행합니다. 여기서 본체 및 변화식→ 조건식으로 순환하는 부분이 루프(loop)입니다.
결과에서 갑자기 너무 큰 값이 나와서 당황하셨나요..?
이처럼 큰 값이 나온 이유는 do 부분 때문입니다. 사실 i는 0이라는 값을 저장하고 있어서 다른 반복문 같은 경우에는 애초에 조건식에 걸려 해당 반복문이 실행되지 않습니다만 do while 문은 do 부분 때문에 조건식에 상관없이 실행되면서 변화식을 거쳐 i에는 1을 저장하게 됩니다. 그후로는 뭐.. 조건식에 걸릴 이유가 없으니 무한 반복 되는거죠. 그렇기 때문에 do while 반복문을 사용하실 때는 특히 주의하셔야 합니다.
4. break, continue로 반복문 제어
break는 for, while, do while 문법에서 제어 흐름을 벗어나기 위해 사용됩니다. 여기서 continue와 다른 점이 나오는데요.break는 제어흐름을 중단하고 빠져나오지만 continue는 제어흐름(반복) 유지한 상태에서 continue가 포함된 해당 코드의 실행만을 건너뛰는 역할입니다.
5. goto문 사용하기
프로그램을 만들다보면 중간의 코드를 무시하고 원하는 부분으로 건너뛰어야 하는 상황이 생기기도 합니다. 이런 경우 사용하는 제어문이 goto 문입니다.
goto는 별다른 제약없이 원하는 부분으로 이동할 수 있기 때문에 입문하시는 분들은 goto를 남발하시는 경우가 있는데..
정말 후회합니다.. 저도 경험해봤거든요. 한번 코드의 흐름을 잃어버리면 다시 되돌리기가 정말 힘듭니다. 하지만 goto를 적절히 사용할 수 있다면 중복되는 코드를 삭제하고 간결하게 만드는 데 goto문 만한게 없습니다. 특히 에러처리에 매우 유용하기 때문에 리눅스 커널에서도 자주 사용되고 있습니다.
goto는 레이블을 지정하여 사용합니다. 레블은 :(콜론)을 사용하여 레이블의 이름을 짓는 규칙은 변수와 동일합니다.
◦ 레이블 : [or] goto 레이블;
- 용어 설명
스파게티 코드?
스파게티 코드는 goto문을 과도하게 사용하여 프로그램의 흐름이 마치 스파게티 면발처럼 뒤죽박죽해서 사용되는 이름입니다. 그래서 스파게티 코드는 가독성이 떨어지고 유지보수가 매우 힘듭니다.
가독성?
읽기 쉽고 이해하기 편한 코드를 가독성이 좋다고 합니다. 복잡한 로직(논리)를 간단하고 이해하기 편하게 작성할수록 프로그래밍 실력이 뛰어나다라고 말합니다. 따라서 다른 사람이 보아도 내 코드를 유지보수하기 쉽도록 작성해야 하며, 내가 만든 코드를 나중에 봤을 때도 이해하기 쉽게 작성해야 합니다.
'C Language Basic' 카테고리의 다른 글
C Language [핵심정리] - 12 (0) | 2021.05.16 |
---|---|
C Language [핵심정리] - 11 (0) | 2021.05.15 |
C Language [핵심정리] - 9 (1) | 2021.05.14 |
C Language [핵심정리] - 8 (0) | 2021.05.13 |
C Language [핵심정리] - 7 (0) | 2021.05.11 |