안녕하세요, 스스로 코딩 두셀코입니다.
지난 글에서 변수에 대해 알아봤는데요, 변수는 코딩에 필수적인 재료로 어떤 값을 담고 있는 상자라고 했습니다. 이렇게 재료가 준비되었으니 재료들을 한 번 요리해볼까요? 재료들을 요리하는 방법은 조건문과 반복문 그리고 함수입니다. 이번 글에서는 첫 번째로 조건문에 대해서 배워보도록 하겠습니다.
조건문은 '어떤 조건이 주어질 때 어떤 동작을 해라'를 표현하고 싶을 때 사용합니다. 쉽게 이야기하면, 만약 ~ 라면, ~를 해라 라는 명령을 하고싶을 때 사용하는 것이지요. 조건문이 될 수 있는 것을 아무거나 생각해볼까요?
비가 온다면 어떻게 해야 할까요? 만약 지금 날씨가 비가 온다면, 우산을 써라
만약 당신이 코딩 입문자면, 두셀코에게 물어봐라
만약 미세먼지 농도가 20이 넘으면, 공기청정기를 틀어라
위와 같은 예제들을 조금 더 코딩스럽게 쪼개볼까요?
만약 지금 날씨 = 비
우산을 써라
만약 당신 = 코딩입문자
두셀코에게 물어봐라
만약 미세먼지 농도 > 20
공기청정기를 틀어라
여기서 =은 등호, >는 부등호를 나타냅니다. 잠깐 퀴즈를 내볼까요? 만약~ 이라는 문장에서 '날씨', '당신', '미세먼지 농도'의 공통점은 무엇일까요? (힌트: 지난 글의 주제는?) 네, 바로 변수라는 것입니다! '날씨'는 비오는 날씨, 햇살이 따사로운 날씨, 눈이 오는 날씨 등 날씨에 따라서 변할 수 있는 값이겠죠? 그리고 '당신'은 코딩 입문자가 될수도 있고, 코딩 고수가 될수도 있고, 코딩에 관심없는 사람이 될 수 있겠죠? 마지막으로 미세먼지는 10, 15 20, 30 과 같은 값이 들어가면 정수형 변수가 되는 것이고 10.0, 15.4, 22.7 등 소수점까지 표현하면 실수값이 들어올 수 있는 변수가 되는 것 입니다. 저희가 왜 변수를 가장 먼저 배웠는지 알 수 있겠죠?
다시 조건문으로 돌아오면, 위 예제를 보면 프로그래밍 언어의 종류와 관계없이 어떤 언어든지 공통적으로 가지는 조건문의 구성요소를 알 수 있습니다.
조건문의 구성요소
1. 조건부
위의 예시에서 다음 문장들이 조건부에 해당합니다.
[조건부]
만약 지금 날씨 = 비
만약 당신 = 코딩 입문자
만약 미세먼지 농도 > 20
조건부는 참/거짓으로 판단할 수 있는 조건이 들어와야합니다. 예를 들어, 지금 비가 온다/비가 오지 않는다, 나는 코딩입문자다/아니다, 미세먼지 농도가 20이 넘는다/넘지않는다 처럼 참/거짓이 분명해야합니다. '인생이란?, '행복이란?', '나는 누구일까?', '코딩을 왜 공부해야하나?' 라는 추상적인 질문 또는 주관식은 조건부가 될 수 없습니다. 보통 여기에 변수와 조건을 써줍니다.
조건부에는 여러가지 조건을 조합할 수 있습니다. '지금 날씨가 비가 오면' 이라는 조건에 추가적으로 '실외에 있다면' 이라는 조건을 추가해서, '지금 날씨가 비가 오고 실외에 있다면' 이라는 조건으로 만들 수 있습니다. 코딩스럽게 표현한다면,
만약 지금 날씨 = 비 그리고 위치 = 실외
위와 같이 표현할 수 있겠죠? 이 경우 날씨가 비가 오지 않거나 위치가 실외가 아닌 경우에는 우산을 펴지 않는다는 것을 알 수 있습니다. 왜냐하면 두 개의 조건이 '그리고'로 연결되어있기 때문인데요, 만약에 '또는'으로 연결되어있다면 어떨까요?
만약 지금 날씨 = 비 또는 위치 = 실외
이 경우에는 지금 날씨가 비가 오고 실내이더라도 우산을 써야하고, 비가 오지 않더라도 위치가 실외면 우산을 써야합니다. 이런 경우 의도치않게 우스꽝스러운 상황이 연출되겠죠? 그렇기 때문에 여러가지 조건을 조합해서 조건부를 구성할 때는 반드시 '그리고'나 '또는'이 코딩을 하는 사람의 의도에 맞게 사용이 되었는지 꼭 확인해야합니다.
2. 실행부
위의 예시에서 실행부는 다음과 같습니다.
[실행부]
우산을 써라
두셀코에게 물어봐라
공기청정기를 틀어라
실행부는 이미 많은 예제에서 봤다시피 특정 조건을 만족했을 때 수행되는 부분입니다. 위 예시들은 하나의 실행만 하게 되지만, 사실 여러 개의 실행부가 올수도 있습니다. 예를 들어, 우산을 써라 그리고 장화를 신어라, 우비를 입어라 라고 실행부를 구성할 수 있겠죠. 그러면 이 조건일 때, 우산을 쓰고, 장화를 신고, 우비를 입는 과정을 순차적으로 수행하게 됩니다.
만약 지금 날씨 = 비 그리고 위치 = 실외
우산을 써라
장화를 신어라
우비를 입어라
3. 만약 ~ 하면, 아니면 ~ 해라
지금까지의 예시들은 하나의 조건으로만 이루어진 조건문을 봤습니다. 하지만 우리말에서도 그렇듯이 여러 개의 조건을 연결하여 조건문을 만들 수 있습니다. 예를 들어, '만약~라면 ~을 하고, 아니라면 ~을 하지 않는다' 처럼 말이죠. 이것을 코딩스럽게 표현하면 다음과 같이 표현할 수 있겠죠?
만약 지금 날씨 = 비
우산을 써라
아니면
우산을 쓰지 말아라
만약 비가 오면 우산을 쓰고 비가 오지 않으면 우산을 쓰지 않는다
실행부에는 우산과 관련된 행동이 나올수도 있고, 그렇지 않아도 됩니다. '우산을 쓰지 말아라'라고 실행부를 만들었지만, '공기청정기를 켜라'가 나올수도 있습니다. 하지만 그렇게 되면 '만약 ~ 라면 ~를 하고 아니면 ~를 해라'라는 구조를 사용하는 의미가 없겠죠?
그리고 지금 날씨가 비가 오는 것이 아니기만 하면 전부 '아니면~'의 실행부가 수행됩니다. 맑은 날이면, 눈이 오는 날이면, 태풍이 부는 날이면 모두 비가 오지 않기 때문에 우산을 쓰지 않는 동작을 하게됩니다. 만약에 조건이 구체적이지 않으면 그만큼 빠지는 조건들이 많아집니다. 위의 예제에서도 지금 날씨가 눈이 오는 경우에도 우산을 써야할 수 있는데, 조건을 구체적으로 설정을 하지 않다보니 이런 예외적인 케이스가 발생할 수 있는 것을 볼 수 있습니다.
[그림 1] 만약 눈이 올 때 우산 쓰라는 조건이 빠지면, 우산 없이 눈을 맞을 수 밖에 없습니다
이번 글에서는 조건문의 구성요소에 대해서 알아봤습니다. 정리해보면 조건문의 구성요소는 '만약 ~ 라면'에 해당하는 '조건부'와 '~ 를 한다'에 해당하는 '수행부'가 있습니다. 그리고 조건문은 조건을 만족하는 경우 (만약에 ~ 라면) 뿐만 아니라 조건을 만족하지 않는 경우 (아니면 ~ ) 어떻게 해라까지 지정할 수 있습니다. 코딩의 가독성과 혼란을 피하기 위해서 조건을 만족하지 않는 경우에는 조건을 만족하는 경우와 다른 (또는 반대되는) 수행부로 구성하는 것이 좋습니다.
다음 글 조건문 (2) 에서는 여러 개의 조건부로 구성되어 있는 조건부 사슬 (또는 조건부 기차)에 대해서 배우도록 하겠습니다.
[참고자료]
[그림 1] https://www.thechronicleherald.ca/news/provincial/even-without-a-weather-warning-be-warned-its-going-to-be-nasty-398969