본문 바로가기
[ CODING STUDY ]/》C언어 공부

C언어 10장(제어문, 조건문, if문,else, else if, 알고리즘)

by MRG 2020. 4. 27.
728x90
반응형

▣ 안녕하세요 ^^ 
저번장에서 비트 연산자를 배웠습니다. 
저번장 숙제는 해보셨나요??
당연히 해보셨겠죠?? 
꼭 숙제를 하셔야합니다. 
안 하시고 읽기만 하시면 안 됩니다~~ 꼭이요~~



오늘은 제어문에 있는 조건문에 대해서 배워보겠습니다. 
비트 연산자랑 연관이 있는 부분이 있어서 저번장을 꼼꼼하게 공부하셨다면 오늘 내용에 많은 도움이 되실 겁니다.



▣ 자 그럼 제어문에 있는 조건문이 무엇일까요?
제어문은 쉽게 이야기하면 컴퓨터를 제어하는 코딩을 이야기하겠죠??
그럼 조건문은 무엇일까요?
컴퓨터를 제어하는데 조건에 맞게 제어를 하는 걸 생각하시면 될꺼같습니다.
사전에서는 여러 의미로 이야기를 하지만 이 정도로만 이야기하겠습니다.



▣ 그럼 먼저 조건문에서 if문을 먼저 살펴보겠습니다.
나무 위키에서 if는 "만약~"과 같은 뜻. 가정문(조건문: conditional sentence)을 만들 때 많이 쓰인다. 반대되는 단어는 unless로, "만약 ~하지 않을 때"와 같은 뜻이 된다. 을 의미합니다.
말 그대로 만약에 뭐하면 머를 해...라고 우리가 조건을 알려주고 그대로 실행할 수 있게 명령을 해주는 걸 의미합니다. 
그럼 먼저 그림을 살펴보겠습니다.

 

▣ 이건 알고리즘 순서도 도형입니다. 
이게 무엇이냐 하면 쉽게 이야기하면...
우리는 컴퓨터한테 명령을 줘야 합니다.
하지만 우리는 사람인지라 모든 변수와 상황을 생각하고 완벽하게 우리에 생각을 정리해서 
컴퓨터한테 한 번에 명령을 하는 건 어렵습니다. 
그렇기 때문에 알고리즘 순서도에 모형을 활용하여 우리에 생각을 정리하고 설계한 다음에 명령을 해줘야 합니다.

 

▣ 이건 스크래치 프로그램에서 코딩을 하기 전에 그린 알고리즘 순서도입니다.
이런 식으로 코딩을 하기 전에 알고리즘 순서도를 설계하고 저 순서도를 보고 활용하여 코딩을 작성하면 안정적으로 우리에 생각을 컴퓨터한테 명령해 줄 수 있습니다.



자 그럼 이 이야기를 왜 했느냐?
우리가 지금까지는 코딩을 할 때 단순히 입력, 출력, 연산 등등 순차적인 구조만 명령을 했습니다.
또 이야기하면 실제로 프로그램을 만들 때에는 많은 변수들이 있겠죠?
그렇기 때문에 이제부터 우리는 저 위에 있는 알고리즘을 활용할 줄 알아야 합니다.
그리고 그걸 보고 컴퓨터를 제어해 나가야 합니다. 
꼭 저 도형을 참고해주시고 오늘 조건문을 배우고 알고리즘 순서도를 설계하는 걸 공부해주시고 연습해주시면 
코딩을 하는데 많은 도움이 되실 겁니다.


▣ 다시 이 알고리즘으로 돌아가서 조건문은 이런 형식입니다.
우리가 준 조건이 맞으면 참(1)을 반환하고, 틀리면 거짓(0)을 반환하게 됩니다. 
그럼 이 조건을 어떻게 컴퓨터가 연산하게 할 수 있을까요?
그건 관계 연산자를 사용하면 됩니다.

 


▣ 이런 식으로 관계 연산자가 있습니다. 
우리가 수학에서 배웠던 내용들이랑 많이 비슷하죠?
하지만 여기서 주의해야 할 건 == 과 != 입니다.
마냥 모두 다 수학에 나오는 연산이랑 같다고 생각하시면 안 됩니다.



▣ = 한 개는 머였죠? 네 바로 대입 연산자입니다.!!!
== 두 개는 관계 연산자 같다 라는 의미입니다. 꼭 기억해주세요.
그리고!= 같지 않다는 의미입니다. 

 

▣ 이건 논리 연산자입니다.
어디서 많이 본거 같죠?
네 바로 비트 연산자랑 비슷합니다. 
비트 연산자는 그런데 기호가 한 개씩이었죠?
논리 연산자는 이런 식으로 기호가 두 개씩을 사용합니다.
이점 꼭 기억해주세요.

 

▣ 논리 연산자도 이런 식으로 연산 결과가 나오게 됩니다. 
비트 연산자랑 거의 똑같죠? 
그런데 여기서 한 가지 말씀드리고 싶은 저에 생각은 
! 는 웬만한 상황이 아니면 많이 사용하지 않는 거 같습니다.
왜냐 정말 간단하게! 을 사용하게 되면 코딩이 너무 복잡해질 수 있기 때문입니다.



제가 코딩은 코드를 치는 것도 중요하지만 다시 그걸 읽고 유지 보수하는 것도 너무 중요하다고 했습니다.
논리 연산자에서! 을 난발하면 어떻게 될까요?
네 본인이 코딩을 짜도 못 알아볼 수 도 있습니다. ^^
이 좀 기억해주세요.
코딩은 복잡하게 짜는 게 잘하는 게 아닙니다.!!! 저는 그렇게 생각합니다.
그럼 실전으로 한번 갈까요?

 

 


▣ 자 이렇게 코딩을 작성해보겠습니다.
우리가 배웠던 scanf_s 함수도 사용해 보았습니다.



if문을 사용하려면 저런 식으로 if함수를 적고 () 괄호 안에 조건을 적어줍니다.
우리가 위에서 배웠던 관계 연산자와, 논리 연산자를 활용해서 말이죠.
그리고 화살표 괄호를 사용합니다.
그 안에 조건이 참일 경우 무엇을 할지 작성해줍니다.
그리고 21을 입력하면 결과가 어떻게 나오나요?
네 맞습니다.
관계 연산자 결과가 참이기 때문에 
printf에 값을 출력합니다.
그럼 거짓이면 어떻게 될까요?

 


▣ printf를 하지 않고 바로 return 0으로 프로그램이 끝나는 걸 볼 수 있습니다.
간단하죠?
그런데 저기 있는 화살 괄호는 무엇일까요?
네 스코프 범위입니다. 
우리가 main함수를 사용할 때 범위를 화살 괄호로 진행했죠?
그것도 동일하게 if문이 참일 경우 저렇게 스코프 범위를 지정해주면 저 안에 있는 건 다 작동하게 됩니다.

 

 

▣ 이렇게 말이죠~~ 그런데 여러분들이 { 괄호를 하게 되면 저렇게 위치가 나오지 않을 겁니다.

 

이렇게 위치가 나올 겁니다.
이것도 상관은 없습니다. 
제가 저렇게 한 이유는 아까 위에서 말씀드린 것처럼 제가 보기 편하게 하기 위해서입니다.
그렇기 때문에 저는 위에 있는 방법으로 화살 괄호 범위를 지정할 생각입니다. 
그런데 저기에 괄호를 빼면 어떻게 될까요?

 

▣ 이렇게 코딩을 해서 디버그로 확인을 해보면 조건문이 틀렸을 경우 어떤 것만 작동하죠?
네 두번째 있는 printf만 동작하게 됩니다.
자 다시 질문으로 돌아가서 화살 괄호가 없으면 어떻게 되냐?
그건 간단합니다. 
if문 조건을 맞았을 경우 if문 아래 있는 한 줄만 작동하게 됩니다.
이점 꼭 기억해주세요.
하지만 저희는 저런 방법을 사용하지 않겠습니다.



▣ 그건 나중에 조건문이 많아질 경우 다시 코딩을 볼 때 헷갈릴 우려가 있기 때문입니다.
그러니 꼭 화살 괄호로 스코프를 정해주세요!!!

 

▣  이번에는 논리 연산자를 사용해보겠습니다. 
저렇게 코딩을 하고 &&(AND) 연산자를 사용하면 어떻게 되나요?
네 두 개에 조건이 하나는 참 하나는 거짓이기 때문에 거짓을 반환하고 printf함수를 작동하지 않습니다.

 

▣ 그럼 이렇게 같은 결과로 ||(OR)을 사용하면 어떻게 되나요?
네 하나는 참이고 하나는 거짓이기 때문에 참을 반환해주고 printf 함수가 작동하게 됩니다.



이 부분은 여러분들이 한번 만들어서 해보세요.
꼭 직접 만들어서 해보셔야 합니다.
그럼 논리 연산자는 어떨 때 사용할까요?
예를 들어 이럴 때 사용합니다.
player캐릭터 HP가 50 이하이고 독에 상태가 1이면 HP가 1씩 떨어뜨려라라는 명령 줄 때 사용할 수 있겠죠?



자 그런데 여기서 조건을 저렇게 한 줄로 논리 연산자를 사용해서만 조건문을 쓸 수 있을까요?
아닙니다.

 

▣ 이런 식으로 코딩이 가능합니다.
else if라는 겁니다.
조건문은 연산을 하는 거지만 우리가 이해하기 쉽게 검사라고 표현하겠습니다.
이건 쉽게 이야기하면 1번 if문이 거짓이면 2번 검사합니다.
2번이 거짓이면 3번을 검사 결과를 보여줍니다.
프로그램은 순차적으로 작동합니다.
예외적인 부분도 있지만 대부분 이러니 꼭 기억해주세요.
그럼 제가 damage라는 숫자를 20으로 입력을 했습니다.
그럼 1번을 검사하겠죠? 
그럼 관계 연산 결과가 참이기 때문에 결과가 80 이상이라고 나오게 됩니다.
그럼 2번 3번을 검사(연산)할까요?
하지 않습니다.
1번이 참이기 때문에 보지 않고 바로 연산을 끝냅니다.

 

▣ 자 이런 식으로 21이라고 해보겠습니다.
그럼 1번을 검사하겠죠?
1번이 틀리기 때문에 2번을 진행합니다. 
2번이 참이기 때문에 70 이상이 나오게 됩니다.
그럼 3번을 연산할까요? 아닙니다. 
이점 꼭 기억해주세요.



그런데 여기서 의문이 생깁니다. 
만약에 3번 다음에 나머지 숫자들(0~50)은 다 좀비가 죽었습니다.
이런 식으로 나오게 하고 싶다고 하겠습니다.
그럼 하나하나 else if로 조건문을 만들어줘야 할까요?
아닙니다. 

 


▣ 자 이렇게 else를 사용하면 됩니다.
else는 나머지라고 생각하시면 될꺼같습니다.
쉽게 이야기하면요.
else는 항상 if와 else if 밑에 있어야 합니다.
그래야 if문과 else if가 모두 거짓일 경우에만 else를 작동하게 됩니다.



여기서에서 보면 50을 입력하면 hp가 50이 남기 때문에
3번 조건문마저 거짓이므로 마지막에 있는 else 나머지가 작동하게 됩니다.
그럼 60 미만은 다 저렇게 결과를 얻을 수 있겠죠?



▣ 꼭 기억해주세요.
if문 조건이 맞을 경우 밑에 있는 연산들은 하지 않습니다.



▣그럼 여기서 또 질문이 생길 수 있습니다.
그럼 zombie가 여러 상황이 있을 수 있는데 여러 조건문을 하나하나 다 검사(연산)하게 하는 방법을 없나요?
라는 질문이 생길 수 있습니다. 

 


▣ 이렇게 다중 if문을 사용해서 하나하나 다 연산하게 하시면 됩니다.
그럼 10을 입력했을 경우 90이니깐 1번 했을 경우에도 참, 2번 경우에도 참, 3번 경우에도 참이기 때문에 각각 printf 함수가 작동하게 됩니다.
else는 나머지이기 때문에 3번에 값이 참이므로 연산하지 않습니다. 
꼭 이 부분은 기억해주세요.



한 번씩 제가 예로 보여드렸던 값을 변경하시면서 해보세요.!!!
직접 만들어서 해보지 않으면 나중에 조건문을 사용하실 때 너무 어려울 수 있습니다. 

 


▣ 또한 이렇게 중첩 if문을 사용할 수도 있습니다.
중첩이라는 말에 어려워하지 마시고 if문안에 if문이 또 있다고 생각하시면 될꺼같습니다.
그래서 if을 검사하고 그게 맞으면 안에 있는 if문을 또 검사하겠죠?
그래서 둘 다 참이기 때문에 저런 결과가 나오게 됩니다. 



▣ 자 오늘은 조건문 if문에 대해서 배웠습니다. 
코딩은 결국 컴퓨터한테 명령을 해줘야 하기 때문에 우리가 프로그램에 필요한 상황들을 조건에 맞춰서 코딩을 해줘야 합니다.
그렇기 때문에 오늘 배운 알고리즘과 if문 꼭 공부해주시고, 꼼꼼하게 읽고 직접 실습해보는 시간을 가지셨으면 좋겠습니다. 
오늘은 이게 숙제입니다.!!! 꼭 해보세요. 직접 조건을 만들어서요.



아 그리고 중요한 거 한 가지 if문은 우리가 보기에는 논리 연산을 하는 거 같지만 컴퓨터는 결국 모든 걸 연산하는 겁니다.
아까 위에서도 잠깐 언급했죠?
그렇기 때문에 조건문을 많이 쓰면 연산을 많이 하기 때문에 최적화 부분이랑 연관이 있겠죠?
그래서 조건문을 너무 남발하면 안 됩니다. 
이 부분도 앞으로 함께 공부하고 고민해 보도록 하겠습니다.
포기하지 마시고 꼭 꼼꼼하게 읽으면서 공부해주세요.
질문 있으시면 댓글 남겨주세요.
그럼 다음장에서 뵙겠습니다.



포기하지 마세요. 저도 했습니다. 파이팅!!!

728x90
반응형

댓글