5. 진짜도 작고 가짜도 작고 - 비교와 논리값

  • 평범한 한글은 필요 최소한의 함수를 기본으로 제공하고 있으므로 일반적인 연산이 가능하다.
  • 앞서 설펴본 더하기, 곱하기, 거듭제곱 외에도 비교와 논리 연산 함수가 제공된다.
 

비교 함수 - 같다, 작다

  • : 같다. 두 개의 인수가 같으면 참(True), 다르면 거짓(False)을 내놓는다. ('~는'으로 기억하자)
  • : 보다 작다. 두 개의 인수 중 처음 인수가 나중 인수보다 작으면 참을, 처음 인수가 나중 인수보다 크거나 같으면 거짓을 내놓는다.
ㄱ ㄱㄱ ㄴ ㅎㄷ ㄱ ㄴ ㄴ ㅎㄷ
▶️
True False
  • 첫 번째 줄은 0-0이 같은지 비교한다. 0은 음수도 양수도 아닌 그냥 0이니까 결과는 .
  • 두 번째 줄은 01을 비교한다. 둘은 다르니까 결과는 거짓.
 
  • 함수를 호출해서 받아낸 결과를 비교할 수도 있다. 다음처럼...
ㄷ ㄷ ㄱㅎㄷ ㄷ ㄷ ㅅㅎㄷ ㄴㅎㄷ
▶️
True
  • 2 * 22^2 (2의 2제곱)은 모두 4이기 때문에 결과는 !
  • 위의 코드가 이해하기 어렵다면 ㄷ ㄷ ㄱㅎㄷ ㄷ ㄷ ㅅㅎㄷ ㄴㅎㄷ 처럼 색칠을 해보면 어떨까?
  • 위의 코드를 (ㄷ ㄷ ㄱㅎㄷ) (ㄷ ㄷ ㅅㅎㄷ) ㄴㅎㄷ 처럼 괄호를 사용해서 내용을 구분할 수도 있다. 점점 이 방식에 익숙해지기를 권한다.
  • 평범한 한글은 인수가 먼저 오고 함수가 나중에 오는 후위 표기법(postfix notaion)을 사용하므로 코드를 많이 쓰고 읽어서 익숙해지면 도움이 된다. 후위 표기식은 한국어로 옮기기도 수월하다. ⇒ 2 2 곱한 것과 2 2제곱은 같은가?
 
ㄱ ㄱㄱ ㅈ ㅎㄷ ㄷ ㄹ ㄱㅎㄷ ㄷ ㄹ ㅅㅎㄷ ㅈ ㅎㄷ
▶️
False True
  • 첫째 줄, 0-0 보다 작을 리 없으므로 결과는 거짓.
  • 둘째 줄, (2 * 3) < (2^3), 즉 6이 8보다 작으므로 결과는 .
  • '보다 작다'는 있는데 왜 '보다 크다'는 없을까?
    • 비교하려는 수의 순서를 바꾸면 된다. 4 > 8을 구하고 싶으면 8 < 4 를 구한다.
ㄱㄴㄱ ㅁ ㅈㅎㄷ
▶️
False
  • '크거나 같다'나 '작거나 같다' 는 어떻게 구할까?
    • '크거나 같다'는 '작다'를 구한 뒤 논리값을 부정하면 된다. 방법은... 바로 아래에!
    • '작거나 같다'는 비교하려는 수의 순서를 바꾸어서 '크거나 같다'를 구혀면 된다. 역시 방법은 아래에....
 

논리값 함수 - 참과 거짓 다루기

  • 논리값은 거짓이다. 결과값을 보일 때는 TrueFalse로 표시한다.
  • 비교 연산은 언제나 논리값 객체를 내놓는다.
  • : 논리 부정. 논리값을 부정한다. 참이면 거짓으로, 거짓이면 참으로. ('~못하다'로 기억하자)
  • ㅈㅈ: 논리값 참을 내놓는다. ('진짜'로 기억하자)
  • ㄱㅈ: 논리값 거짓을 내놓는다. ('거짓'이나 '가짜'로 기억하자)
 
  • '크거나 같다'는 '작다'의 부정이다.
ㅁ ㄴ ㅈㅎㄷ ㅁㅎㄴ ㄷ ㄷ ㄱㅎㄷ ㄷ ㄷ ㅅㅎㄷ ㅈㅎㄷ ㅁㅎㄴ ㄷ ㄴ ㄱㅎㄷ ㄷ ㄷ ㅅㅎㄷ ㅈㅎㄷ ㅁㅎㄴ
▶️
True True False
  • 첫째 줄. 4 < 2 는 거짓인데 이를 부정()하면 참. ⇒ 4 >= 2 == ture
  • 둘째 줄. (2 * 2) < (2^2) 가 거졋이므로 이를 부정하면 참.
    • 4 >= 4 == true
  • 셋째 줄. [2 * 1) < [2^2) 는 참이므로 이를 부정하면 거짓.
    • 2 >= 4 == false
 
  • '작거나 같다'를 구하려면 비교하려는 수의 순서를 바꾸어서 '크거나 같다'를 구한다.
ㅅ ㄹ ㅈㅎㄷ ㅁㅎㄴ ㄷ ㄷ ㅅㅎㄷ ㄷ ㄷ ㄱㅎㄷ ㅈㅎㄷ ㅁㅎㄴ
▶️
True True
  • 첫째 줄, 3 <= 6을 구하려면 6 >= 3, 즉 ~(6 < 3)을 구하면 된다.
  • 둘째 줄, 2 * 2 <= 2^2를 구하려면, 2^2 >= 2 * 2, 즉 ~(2^2 < 2 * 2)를 구한다.
 
  • 무조건 참을 내놓는 ㅈㅈ과 거짓을 내놓는 ㄱㅈ 함수를 사용할 수 있다.
ㅈㅈ ㅎㄱ ㄱㅈ ㅎㄱ
  • 그래서 이런 걸 할 수 있다.
▶️
True False
ㄹ ㅁ ㅈㅎㄷ ㅈㅈㅎㄱ ㄴㅎㄷ ㄷ ㄹ ㄱㅎㄷ ㄷ ㄹ ㅅㅎㄷ ㅈㅎㄷ ㄱㅈㅎㄱ ㄴㅎㄷ
▶️
True False
  • 지금까지는 평범한 한글 포드를 수식으로 바꾸어서 이해하려고 시도했다면, 이제는 평범한 한글의 '어순'을 따라서 코드를 해석하는 연습을 해보자.
    • 2는 3 보다작다 진짜와 같다
    • 2와 3을 곱한것은 2에 3을 제곱한것 보다작다 가짜와 같다
  • 조금 어색하게 들리겠지만 코드를 재구성해서 의미를 파악하는 것보다 코드에 나타나는 단어를 덩어리로 생각하는 것이 훨씬 빨리 익숙해지는 방법이다.
💡
[기본함수] ㅎ 꼴의 코드는 [기본함수]ㅎ 꼴로 뭉쳐서 쓰고 읽으면 훨씬 편하다. ㄷ ㄹ ㄱ ㅎㄷ 보다 ㄷ ㄹ ㄱㅎㄷ 쪽이 읽기 쉬워질 것이다. ⇒ 계속 반복하다 보면 기본 함수 호출이 패턴으로 보이기 시작한다.

논리값이 함수라니... if ~ else....

  • 참(True)과 거짓(False)은 믿기 어렵겠지만 두 개의 인수를 갖는 함수이다.
ㄹ ㅁ ㅈㅈㅎㄱ ㅎㄷ ㄹ ㅁ ㄱㅈㅎㄱ ㅎㄷ
▶️
3 4
  • ㅈㅈㅎㄱ 는 True를, ㄱㅈㅎㄱ 는 False를 내놓으므로 여기에 ㅎㄷ 로 3과 4를 인수로 넘겨 호출한다.
  • True 를 호출하면 함수에 전달된 첫 번째 인수를 내놓는다.
  • False를 호출하면 함수에 전달된 두 번째 인수를 내놓는다.
 
  • 쓸모가 없어 보이지만 논리값을 함수로 호출하면 다른 언어의 if ... then ... else ... 역할을 수행한다. (뭐라고?? 어째서? 😳)
ㄴㄱ ㄴ (ㄹ ㅁ) ㅈㅎㄷ ㅎㄷ ㄴㄱ ㄴ (ㄹ ㄷ) ㅈㅎㄷ ㅎㄷ
  • 위의 함수는 괄호 속에 넣은 첫 번째 인수가 두 번째 인수보다 작으면 -1을, 첫 번째 인수가 두 번째 인수보다 크거나 같으면 1을 내놓는다.
  • Python으로 바꾸어 보자면 이렇다.
# 첫째줄 if 3 < 4: return -1 else: return 1 # 둘째줄 if 3 < 2: return -1 else: return 1
  • 평범한 한글의 코드는 오히려 C 언어의 ?: (삼항 연산자)나 Excel의 if 함수와 닮았다.
(3 < 4) ? -1 : 1 (3 < 2) ? -1 : 1
  • 이제부터 코드에 논리값을 함수로 호출한다면 이는 if .. else?: 라고 생각하면 쉬울 것이다.

논리합과 논리곱

  • 여러 논리값의 관계를 따져보는 방법으로 논리합과 논리곱이 있다.
  • 평범한 한글에서는 덧셈(합)을 나태는 과 곱셈을 나타내는 을 이용해서 논리합과 논리곱을 다룬다.
  • : 논리합: OR. 여러 논리값 중에 하나라도 참이면 참.
    • 나는 버스를 타거나 지하철을 탄다. → 버스를 타거나, 지하철을 타거나, 둘 다 타거나...
  • : 논리곱: AND. 여러 논리값 중에 하나라도 거짓이면 거짓.
    • 나는 버스를 타 지하철을 탄다. → 버스와 지하철을 모두 탄다.
  • 실무에서는 두 개 이상의 조건들이 참인지 거짓인지 판별하기 위해 사용한다.
 
(ㄱ ㄱㄱ ㅈㅎㄷ) (ㄱ ㄱㄱ ㄴㅎㄷ ㅁㅎㄴ) ㄷㅎㄷ
▶️
False
  • (0 < -0) or not[0 == -0) 이므로 결과는 거짓. 0보다 -0이 작지도 않고, 0과 -0이 같다는 것도 부정하므로 ,둘 다 거짓이기 때문에 결과도 거짓!
 
(ㄷ ㄹ ㄱㅎㄷ ㄷ ㄹ ㅅㅎㄷ ㅈㅎㄷ) (ㄱ ㄴ ㄱㅎㄷ ㄱ ㄴㅎㄷ) ㄱㅎㄷ
▶️
True
  • (2 * 3) < (2^3) and (0 * 1 == 0) 과 같은 의미이므로 결과는 참. → (2 3 곱하다 2 3 제곱(승)하다 작다) (0 1 곱하다 0 같다) 곱하다 처럼 이해해보자.
 
  • 지금까지 다룬 논리 연산은 이것 자체로 쓰임을 찾기는 어려울 수 있다. 하지만 함수와 결합하면 가공할 위력을 보일 것이다.
 
  • 지금까지 평범한 한글의 기본 함수를 살펴보았다. 그런데 기본 함수 말고 사용자가 직접 함수를 만들 수는 없는 걸까? 여러분은 이미 답을 알고 있다. 그리고 드디어 의 쓰임을 알 수 있게 된다!