지난 강좌에서 주민등록번호 뒷자리의 첫 숫자를 반환하여 성별(숫자)까지 반환했습니다. 그런데 그 첫 숫자는 사실 몇 가지 정보가 더 있습니다. 대부분 1과 2, 3과 4는 아실 것 같습니다. 1900년대 남자는 1, 여자는 2로 나타내고 2000년대 남자는 3, 여자는 4로 나타내죠. 그런데 5와 6, 7과 8 그리고 9와 0도 존재합니다. 총 10개의 숫자가 사용될 수 있습니다. 중요한 얘기는 아니지만 신기한 얘기라서 알려드리겠습니다.
숫자 | 설명 | 숫자 | 설명 |
---|
1 | 1900년대 출생 남자 | 2 | 1900년대 출생 여자
|
3 | 2000년대 출생 남자
| 4 | 2000년대 출생 여자
|
5 | 1900년대 출생 외국인 남자
| 6 | 1900년대 출생 외국인 여자
|
7 | 2000년대 출생 외국인 남자 | 8 | 2000년대 출생 외국인 여자 |
9 | 1800년대 출생 남자 | 0 | 1800년대 출생 여자 |
즉, 출생년대와 내·외국인 정보까지 있다는 것이죠. 그리고 홀수는 남자, 짝수는 여자라는 것은 모두 같습니다. 예제 파일을 보겠습니다.
성별 숫자를 확인하면 임청하는 2000년대 외국인 여자라는 것을 알 수 있습니다.
어쨌든 그걸 모두 알고 싶은 것은 아니고 단순히 성별만 알고 싶은 것이니까 성별 숫자가 홀수인지 짝수인지를 확인해 홀수면 "남자", 짝수면 여자로 표시하고 싶습니다.
이 경우 IF 함수를 여러 번 사용하던가 IF와 OR 함수를 같이 사용하면 만들 수 있습니다. IF와 OR 함수는 이미 알아본 내용이니, 궁금하시면 아래 강좌를 확인해 주시기 바랍니다.
하지만 위 두 함수를 사용할 경우의 수가 여러 개가 되기 때문에 역시 수식이 지저분해질 수밖에 없습니다. 수식이 지저분해지면 에러가 날 확률은 높아질 수밖에 없겠죠.
그래서 좀 더 단순하고 직관적인 함수를 사용할 필요가 있는데, 바로 ISODD, ISEVEN 함수입니다.
ISODD숫자가 홀수면 TRUE를, 짝수면 FALSE를 반환합니다.
ISODD(number) ISEVEN숫자가 짝수면 TRUE를, 홀수면 FALSE를 반환합니다.
ISEVEN(number) 간단하죠. 인수 number가 홀수냐 짝수냐에 따라 참과 거짓을 반환하는 함수들입니다.
참고로 엑셀에서 IS~로 시작하는 함수들이 꽤 있는데 대부분 있냐, 없냐, 맞냐, 틀리냐를 판단하는 함수입니다. 즉, 결과로 TRUE나 FALSE를 반환하는 함수들이죠. ISODD, ISEVEN도 마찬가지입니다. ODD는 홀수가, EVEN은 짝수가 맞냐 틀리냐를 반환하는 함수입니다. 하지만 반환할 것은 맞냐 틀리냐가 아니라 "남자"냐 "여자"냐 입니다. 그러니 TRUE냐 FALSE냐에 따라 반환할 값을 정해야겠죠. IF함수는 사용해야 한다는 것입니다.
그래서 위 결과를 반환하기 위해선,
- 성별의 첫 셀(J5)을 클릭하여 선택합니다. => =MID(D5,8,1)
- 수식 입력줄에서 MID로 반환된 성별(숫자) 값이 홀수인지 확인하기 위해 ISODD를 MID 앞에 작성합니다. => =ISODD(MID(D5,8,1)
이때 이미 작성된 수식(MID(D5,8,1))이 ISODD 함수의 number 인수가 됩니다. - ISODD 함수를 완성하기 위해 수식 마지막에 닫힌 괄호를 입력하고 엔터를 눌러 셀을 완성합니다. => =ISODD(MID(D5,8,1))
수식이 하나일 경우는 그냥 엔터를 눌러도 되지만 지금처럼 함수가 중첩되면 에러가 발생하니 반드시 닫힌 괄호를 입력한 후에 엔터를 눌러야 합니다. - 나머지도 결과를 확인하기 위해 다시 J5셀을 클릭후 자동 채우기(우측 하단에서 클릭 드래그) 합니다.
=> 결과 홀수는 TRUE로, 짝수는 FALSE로 반환됩니다.
이렇게 함수 안에 함수를 사용해야 하는 경우는 항상 닫힌 괄호에 신경 써야 합니다.
그리고 반드시 ISODD 함수를 사용해야 하는 것은 아닙니다. ISEVEN 함수를 사용해도 됩니다. 그렇다면 TRUE와 FALSE는 반대의 결과가 되었겠죠. IF 함수를 추가 사용할 것이기 때문에 일단 구분만 되면 됩니다.
이제 TRUE의 경우는 "남자", FALSE는 "여자"로 바꾸기 위해 최종 IF 함수를 추가 사용합니다.
- 성별의 첫 셀(J5)을 다시 클릭하여 선택합니다. => =ISODD(MID(D5,8,1))
- 수식 입력줄에서 작성된 수식을 나누기 위해 ISODD 앞에 IF 함수를 작성합니다. => =IF(ISODD(MID(D5,8,1))
이때 이미 작성된 수식(ISODD(MID(D5,8,1)))은 IF 함수의 logical_test 인수가 됩니다. - 쉼표로 구분, IF 함수 두 번째 인수 힌트(value_if_true)를 확인하고 "남자"로 작성합니다. => =IF(ISODD(MID(D5,8,1)), "남자"
- 쉼표로 구분, IF 함수 세 번째 인수 힌트(value_if_false)를 확인하고 "여자"로 작성한 후 IF 함수 종료를 위해 닫힌 괄호를 입력하고 엔터로 셀을 완성합니다.
=> =IF(ISODD(MID(D5,8,1)), "남자","여자") - 나머지도 결과를 확인하기 위해 다시 J5셀 클릭 후 자동 채우기(우측 하단에서 클릭 드래그) 합니다. => 결과 TRUE는 남자로, FALSE는 여자로 반환됩니다.
정리하면, 그림처럼 각 단계의 함수가 다음 단계의 인수로 사용된 것입니다. 그리고 앞으로 이런 식의 함수 사용을 많이 경험하시게 될 겁니다.
함수에 익숙하지 않으신 분들은 지금처럼 먼저 사용될 함수를 작성한 후 다음 단계 함수로 감싸는 구조로 사용하시면 좀 더 직관적으로 함수를 사용할 수 있습니다. 그리고 어느 정도 훈련이 된 다음에는 바로 마지막 단계(=IF~)로 진행할 수 있게 될 것입니다. 그땐 수식 작성 순서가 로직의 반대 순서가 되겠죠.
위의 경우 ISODD 함수를 사용했지만 ISEVEN 함수를 사용해도 됩니다. 그 경우에는 IF 함수에서 "남자", "여자"의 위치가 바뀌어야겠죠.
ISODD와 ISEVEN 함수를 알려드렸지만 좀 더 확장성이 좋고 비교할 만한 함수가 있어서 추가 설명하겠습니다. 바로 MOD 함수입니다.
MOD 함수 설명을 위해 QUOTIENT 함수도 같이 설명해야겠군요. 별거 없습니다. 수학 시간에 배운 나누기의 몫과 나머지를 구하는 함수입니다. 예제 파일에서 "몫과 나머지" 시트를 확인해 주세요.
위 예제에서 일반적인 나누기의 경우 몫과 나머지를 분리하지 않고 무한소수로 나타냅니다.
하지만 몫과 나머지를 구해야 할 경우도 있죠. 이 경우 몫을 반환하는 함수가 QUOTIENT 함수이고 나머지를 반환하는 함수가 MOD 함수입니다. MOD는 MODULO의 약자로 각각 나누기의 몫(QUOTIENT), 나누기의 나머지(MODULO)라는 의미라고 하네요.
QUOTIENTnumerator를 denominator로 나눈 몫의 정수 부분을 반환합니다.
QUOTIENT(numerator, denominator)numerator | 나눌 수(피제수) |
denominator | numerator를 나누는 수(제수) |
MODnumber를 divisor로 나눈 나머지를 반환합니다.
MOD(number, divisor)number | 나눌 수(피제수) |
divisor | number를 나누는 수(제수) |
함수의 정리는 위와 같습니다. 아쉽게도 함수의 인수명이 다르네요. 어쨌든 나눌 수와 나누는 수를 인수로 갖는다는 것은 동일합니다.
예제 파일의 결과를 반환해 보겠습니다.
나누기는 별거 없죠. B3셀을 C3셀로 나누면 끝입니다. 이건 직접 해 보시고요 몫부터 보겠습니다.
- 작성할 셀(E3)을 클릭하여 선택합니다.
- 수식 입력줄에서 수식을 시작하고 함수명을 작성합니다. => =QUOTIENT(
- 첫 번째 인수 힌트(numerator)를 확인하고 나눌 수를 가진 셀(B3)을 참조합니다. => =QUOTIENT(B3
- 쉼표로 구분, 두 번째 인수 힌트(denominator)를 확인하고 나누는 수를 가진 셀(C3)을 참조합니다. => =QUOTIENT(B3,C3
- 함수가 하나이므로 최종 엔터(닫힌 괄호 자동 생성 후 셀 완성) => =QUOTIENT(B3,C3)
다음, 나머지
- 작성할 셀(F3)을 클릭하여 선택합니다.
- 수식 입력줄에서 수식을 시작하고 함수명을 작성합니다. => =MOD(
- 첫 번째 인수 힌트(number)를 확인하고 나눌 수를 가진 셀(B3)을 참조합니다. => =MOD(B3
- 쉼표로 구분, 두 번째 인수 힌트(divisor)를 확인하고 나누는 수를 가진 셀(C3)을 참조합니다. => =MOD(B3,C3
- 함수가 하나이므로 최종 엔터(닫힌 괄호 자동 생성 후 셀 완성) => =MOD(B3,C3)
결과 몫과 나머지가 정상 반환됩니다.
함수 설명은 여기까지입니다.
그럼, MOD 함수를 ISODD나 ISEVEN과 어떻게 비교할 수 있을까요?
MOD 함수의 divisor 인수를 2로 사용하면 됩니다. 이 경우 0 아니면 1이라는 결과만 반영되겠죠. 즉 두 가지 결과가 나온다는 것입니다. 0이면 "여자", 1이면 "남자"가 되겠죠. 이건 위에서 했던 것처럼 IF 함수로 처리하면 됩니다.
다음, 확장성에 좋다고 한 것에 관해 설명하겠습니다. ISODD나 ISEVEN 함수는 홀수냐 짝수냐만 판단하기 때문에 2가지 경우만 사용할 수밖에 없습니다. 하지만 MOD 함수의 divisor 인수를 2가 아니라 3으로 사용한다면, 3가지 수(0, 1, 2)가 반환됩니다. 4로 사용하면 (0, 1, 2, 3) 4가지 수가 반환될 것이고요. 즉 divisor로 사용한 수만큼 경우의 수가 생긴다는 것입니다. 이렇게 MOD 함수를 사용하면 나머지 값에 따라 다른 결과를 반영하는 수식을 만들 수 있습니다.
예를 들어 어느 여행사에서 4일 여행은 강원도로, 5일 여행은 부산으로, 6일 여행은 제주도로 간다고 가정해 보겠습니다.
이 경우 MOD 함수를 사용하고 여행일을 3(divisor)으로 나누면 해당 여행일에 따라 자동으로 여행지(강원, 부산, 제주)를 분리할 수 있습니다. 1일 경우 강원, 2일 경우 부산, 0일 경우 제주로 분리하면 되겠죠. 여행일에 따른 여행지가 또 있다면 divisor 인수를 4, 5, ... 로 조정하여 경우의 수를 더 만들면 됩니다. ISODD나 ISEVEN으로 할 수 없는 것들이죠.
또 다른 예로, 위 예제 성별(숫자)에서 2000년대 여성만을 구분할 수도 있습니다. 2000년대 여성은 4(내국인) 또는 8(외국인)이죠. 4로 나누었을 때 나머지가 0인 경우입니다. 같은 방법으로 1900년대 남성만을 구분할 수도 있겠죠. 1900년대 남성은 1(내국인) 또는 5(외국인)입니다. 4로 나누었을 때 나머지가 1인 경우입니다. 모두 MOD 함수를 사용하고 divisor 인수를 4로 사용한 후 나오는 결과에 따라 구분하면 되는 것이죠.
그래서 성별 ISODD나 ISEVEN 대신 MOD 함수를 사용한다면 수식은,
위와 같이 됩니다.
IF 함수의 logical_test 인수를 MOD(MID(D5,8,1),2)=1로 하면, value_if_true 인수를 "남자"로, 즉 ISODD 함수와 동일해지며,
logical_test 인수를 MOD(MID(D5,8,1),2)=0으로 하면, value_if_true 인수를 "여자"로, 즉 ISEVEN 함수와 동일해집니다.
추가로 한 가지 더 말씀드리겠습니다. IF 함수뿐 아니라 TRUE(참)와 FALSE(거짓)를 따지는 논리연산에서 TRUE는 숫자 1로, FALSE는 숫자 0으로 사용할 수 있습니다. 즉, 위와 같이 logical_test 인수가 1과 0으로 반환되는 경우라면 굳이 "=1"을 추가하실 필요는 없습니다. 1은 TRUE고 0은 FALSE기 때문이죠. 그래서 위 수식은,
위와 같이 "=1"을 삭제하여 조금 더 단순하게 표현할 수 있습니다.