엑셀/엑셀 기초~중급

IF문에 대한 이해

내일도화이팅 2023. 7. 6. 01:39

엑셀의 첫부분부터 if문에 대해 설명하려고하여 미안한 마음은 있으나, if문만 이해해도 다른 함수들을 포함한 다른 언어의 프로그래밍이 급격히 쉬워지기에 먼저 설명하고자 한다.
 
엑셀에서 if문은 =if(명제,참인경우,거짓인경우)의 형태로 사용한다.
 
필자는
=if(명제,A,B)라는 식에 대해
만약에 명제가 참이면 A실행 그렇지않으면 B실행이라고 읽는다.
 
아니 그건 당연한 얘기 아닌가? 나도 그렇게 읽어라고 말할 수 도 있다.
 
그렇다면 해당 문제를 풀어보아라.

  A B C D
1 이름 나이   출력
2 한숙 35   =?
3 지수 10    
4 지혜 8    

지혜는 지수의 여동생이고 한숙은 지혜와 지수의 친엄마이다. 만약에 한숙의 나이가 40살 이상이고 지수와 지혜의 나이의 합계가 한숙보다 많다면 True를 아니라면 False를 출력하고 한숙의 나이가 40살 이상이 아니고 지수와 지혜의 나이의 평균이 한숙의 나이보다 많다면 True 아니라면 False를 출력해라.(D2에 출력하시오. -> 사실 중요하지않음)
 
답을 구했는가?
 
일단 지문에 대해 풀어보겠다.
경우의 수로는

1. 한숙의 나이가 40살 이상이고 지수와 지혜의 나이의 합이 한숙의 나이보다 많은 경우와 그렇지 않은 경우
2. 한숙의 나이가 40살 미만이고 지수와 지혜의 나이의 평균이 한숙의 나이보다 많은 경우와 그렇지 않은 경우
 
즉, 한숙의 나이가 40살 이상이냐 아니냐에 따라 1번만 고려하냐 2번만 고려하냐가 달렸기 때문에 한숙이 40살 이상인지부터 확인을 해야하므로
 
=만약에(한숙의 나이는 40살 이상이다., 1번만 고려(한숙의 나이가 40살 이상이 참), 2번만 고려(한숙의 나이가 40살 이상인 경우가 거짓))
 
이라는 식이 도출되고
한숙의 나이가 40살 이상이라는 명제가 참이라고 가정했을 때 지수의 나이와 지혜의 나이의 합이 한숙보다 많은지만 고려하면되고
 
한숙의 나이가 40살 이상이라는 명제가 거짓이라고 가정했을 때 지수의 나이와 지혜의 나이의 평균이 한숙보다 많은지만 고려하면 되므로
 
=만약에(한숙의 나이는 40살 이상이다., 만약에(지수와 지혜의 나이 합은 한숙보다 많다.,True,False), 만약에(지수와 지혜의 나이 평균은 한숙보다 많다.,True,False))
 
로 정리할 수 있다.
 
그리고 이제 엑셀 함수로 정리하면
 
=IF(B2(한숙 나이의 셀위치) >= 40,IF(B3(지수 나이의 셀위치) + B4(지혜 나이의 셀위치) > B2, True, False),IF((B3 + B4) / 2 > B2, True, False))
 
다시 정리하면,
=IF(B2 >= 40,IF(B3 + B4) > B2, True, False),IF((B3 + B4) / 2 > B2, True, False))
로 정리할 수 있다.
 
여기서 AND와 OR을 이해한 사람(다음 시간에 설명하겠다.)은
=IF(OR(AND(B2>=40, B3 + B4 > B2),AND(B2<40, (B3 + B4) / 2) > B2, True, False)
로 쓸 수 도 있을 것이고
 
SUM과 AVERAGE(마찬가지로 다음시간에 설명할테니 몰라도 된다.)도 알고 있는 사람은
=IF(OR(AND(B2>=40, SUM(B3,B4) > B2),AND(B2<40, AVERAGE(B3, B4) > B2, True, False)
라고 쓸 수 도 있을 것이다.
 
확실히 함수를 쓰면 코드는 길어지지만 가독성이 올라가므로 함수를 AND나 OR을 쓰는 것도 나쁘지않고 사람마다 식이 조금씩 다를 수 있으므로 적절한 정답만 나오면 충분하다.
 
하지만, 위의 방식의 코드를 쓴 사람들은 정답을 출력하는 코드를 짤 수 있으나, 문제에 대해 완전한 분석이 되지 않은 상태이다. 
 
IF문의 본질은 명제에 대한 참과 거짓을 가려내는 것이고 어떤 명제에 대해 참과 거짓을 가려낼지 선택하는 것이 매우 중요하다.
 
문제로 돌아가보자.
 
지혜는 지수의 여동생이고 한숙은 지혜와 지수의 '친엄마'이다. 만약에 한숙의 나이가 40살 이상이고 지수와 지혜의 나이의 합계가 한숙보다 많다면 True를 아니라면 False를 출력하고 한숙의 나이가 40살 이상이 아니고 지수와 지혜의 나이의 평균이 한숙의 나이보다 많다면 True 아니라면 False를 출력해라.에서
 
한숙은 지혜와 지수의 '친엄마'라고 언급했다.
 
그리고 평균을 구하는 식은
(지수 + 지혜) / 2이므로 (지수의 나이 + 지수의 나이 - (지수의 나이 - 지혜의 나이)) / 2 라고 할 수 있다.
 
고로, 지수와 지혜 나이의 평균값에 대한 식은
지수의 나이(최댓값) >= 지수와 지혜의 나이의 평균값 >= 지혜의 나이(최솟값)
라는 식으로 정의할 수 있다.
 
즉, 지수와 지혜의 나이의 평균값은 커봤자 지수의 나이이고 지수의 '친엄마'인 한숙보다 나이가 많을 수 없으므로
 
지수와 지혜의 나이의 평균값은 한숙의 나이보다 많다는 자녀는 친엄마보다 항상 나이가 적다는 공리에 반하는 명제이기때문에 증명할 필요 없이 어떤 수가 들어가도 거짓이고(공리에 대해서는 이산수학에서 다루겠다.) -> 고려할 필요가 전혀없다.
 
그렇다면
True가 나오는 경우의 수는
한숙의 나이가 40살 이상이고 지수와 지혜의 나이의 합이 한숙의 나이보다 많다는 경우밖에 존재하지않고
 
이중 하나라도 틀린다면 False가 나올 수 밖에 없다.
 
즉, 식은
=IF(B2>=40, IF(B3 + B4 > B2, True, False),False)
=IF(AND(B2>=40, B3 + B4 > B2), True, False)
=IF(AND(B2>=40, SUM(B3,B4) > B2), True, False)
중 하나로 정의할 수 있다.
 
IF 함수 설명하다가 왜 이런거가지고 꼬투리냐 그런거 고려안해도 답이 나오지않냐라고 할 수 있지만, 누구나 참으로 인정하는 공리와 그 공리의 여집합만 없애도 코드가 이렇게나 줄어들고 연산속도 또한 줄어든다.
 
간단한 예시라서 체감이 되었는지는 모르겠으나, 코드를 가독성있게 그리고 효율적으로 짜는 것은 매우 중요하고 문제를 명제로 나누고 IF문을 적절히 활용하여 적절한 결과값을 출력할줄 아는 것이 IF문의 핵심이다.
 
IF문을 사용하는 것은 어렵지않다. 다만 나 또는 나한테 일을 주문한 사람의 문제에 대해 적절한 결과값을 효율적으로 출력하는 것은 매우 중요한 문제이다. 이를 중요하게 생각하지 않는다면, 당신은 어려운 문제(특히 IF문이 여러개 중첩된)에 대해 무조건 어려움에 봉착하게 될 것이다.