포스트(post)

15. 조건에 따라 다른 기능 실행하기 2 - 비교연산자

목표

비교함수를 이용하여 조건문의 조건을 만들어 보고, 간단한 예제를 통해 활용 해 봅시다.



비교함수

어떤 두 대상이 같은지, 다른지, 혹은 더 큰지 작은지 등을 판별할 때 사용할 때 비교함수를 사용합니다. 이 함수들을 사용하면 조건문에 사용할 조건을 만들 수 있습니다.

  • (=) : 인자들이 동일하면 T, 다르면 nil을 반환합니다.
    1
    2
    
    (= 100 101) ;nil
    (= "오토리습" "오토리습") ;T
    
  • (/=) : 인자 들이 다르면 T, 동일하면 nil을 반환합니다.
    1
    2
    
    (/= 100 101) ;T
    (/= "오토리습" "오토리습") ;nil
    
  • (>) : 앞의 인자가 뒤의 인자보다 크면 T, 작으면 nil을 반환합니다.
    • 문자는 사전순으로 앞의 인자가 뒤의 인자보다 뒤에 위치하면 T, 앞에 위치하면 nil을 반환합니다.
      1
      2
      3
      4
      5
      6
      
      (> 100 100) ;nil
      (> 100 101) ;nil
      (> 101 100) ;T
      (> "오토리습" "오토리습") ;nil
      (> "리습" "오토리습") ;nil
      (> "오토리습" "리습") ;T
      
  • (<) : 앞의 인자가 뒤의 인자보다 작으면 T, 크면 nil을 반환합니다.
    • 문자는 사전순으로 앞의 인자가 뒤의 인자보다 앞에 위치하면 T, 뒤에 위치하면 nil을 반환합니다.
      1
      2
      3
      4
      5
      6
      
      (< 100 100) ;nil
      (< 100 101) ;T
      (< 101 100) ;nil
      (< "오토리습" "오토리습") ;nil
      (< "리습" "오토리습") ;T
      (< "오토리습" "리습") ;nil
      
  • (>=): 앞의 인자가 뒤의 인자보다 크거나 같으면 T, 작으면 nil을 반환합니다.
    • 문자는 사전순으로 앞의 인자가 뒤의 인자보다 뒤에 위치하거나 같으면 T, 앞에 위치하면 nil을 반환합니다.
      1
      2
      3
      4
      5
      6
      
      (>= 100 100) ;T
      (>= 100 101) ;nil
      (>= 101 100) ;T
      (>= "오토리습" "오토리습") ;T
      (>= "리습" "오토리습") ;nil
      (>= "오토리습" "리습") ;T
      
  • (<=) : 앞의 인자가 뒤의 인자보다 작거나 같으면 T, 크면 nil을 반환합니다.
    • 문자는 사전순으로 앞의 인자가 뒤의 인자보다 앞에 위치하거나 같으면 T, 뒤에 위치하면 nil을 반환합니다.
      1
      2
      3
      4
      5
      6
      
      (<= 100 100) ;T
      (<= 100 101) ;T
      (<= 101 100) ;nil
      (<= "오토리습" "오토리습") ;T
      (<= "리습" "오토리습") ;T
      (<= "오토리습" "리습") ;nil
      



비교함수를 (if)함수의 조건으로 사용 해 보기

(if)문은 아래와 같이 사용한다고 했었습니다.

1
2
3
(if 조건 참일때실행)
; 또는
(if 조건 참일때실행 거짓일때실행)

이전에 (if)함수를 사용해 봤을 때는 조건 자리에 직접 nil이나 nil이 아닌 값(T 등)을 넣었었지만, 이제 조건자리에 비교함수들을 넣어서 그 결과가 일 경우에는 참일때실행할 내용을 실행시키고, 거짓일 때는 거짓일때실행할 내용을 실행시켜보겠습니다.

복붙 해 봅시다.

1
(if (= 100 101) "두 숫자는 같습니다" "두 숫자는 다릅니다")

위 함수를 명령어창에서 실행 해 보면 (if)함수에서 "두 숫자는 다릅니다"가 반환되는 것을 볼 수 있습니다. 이는 (= 100 101)의 실행결과가 nil이므로, 거짓일때실행할 부분이 실행 및 반환되기 때문입니다.

마찬가지로 (/=), (>), (<), (>=), (<=) 비교함수들에 여러 비교할 값들을 넣어서 어떠한 값들이 실행 및 반환되는지 확인 해 보세요.



실습

사용자가 입력한 두 숫자가 같은지 다른지 알려주기

이번에는 (getint)함수를 사용하여 사용자로부터 2개의 숫자를 입력 받은 뒤에, 그 숫자가 같을경우 “두 숫자는 같습니다”를, 다를 경우에는 “두 숫자는 다릅니다”라고 말해줍시다. 아래 함수를 명령어창에 붙여 넣고 실행 해 봅시다.

1
2
3
4
5
6
7
8
9
(progn
	(setq num1 (getint "\n첫번째 숫자 입력 : ")) ;첫번째 숫자를 num1에 저장
	(setq num2 (getint "\n두번째 숫자 입력 : ")) ;두번째 숫자를 num2에 저장
	(if (= num1 num2) ;두 숫자가 같은지 여부 확인
		(princ "\n두 숫자는 같습니다") ;두 숫자가 같을경우 실행
		(princ "\n두 숫자는 다릅니다") ;두 숫자가 다를경우 실행
	)	
	(princ)
)

입력한 두 숫자가 동일한지 여부에 따라서 다른 결과를 보여주는 것을 확인 할 수 있습니다.



활용

사용자 입력에 따라 원 또는 사각형 만들기

이번에는 사용자가 "y"를 입력하면 Circle명령어를, 그냥 스페이스바를 누르면 Rectangle명령어를 실행시키도록 해 봅시다. 복붙 해 봅시다.

1
2
3
4
5
6
7
8
(progn
	(setq makeCircle (getstring "\n원 생성(y), 사각형 생성(스페이스바)")) ;1
	(if (= makeCircle "y") ;2
		(command "circle") ;3
		(command "rectangle") ;4
	)
	(princ)
)
  1. 먼저 (getstring)함수로 사용자로부터 문자열을 입력받아 그 값을 makeCircle변수에 저장합니다.
    • 사용자가 아무것도 입력하지 않고 스페이스바를 누른경우, (getstring)은 입력받은 값이 없으므로 nil을 반환하며, 이 값이 makeCircle에 저장됩니다.
  2. makeCircle이 “y”인지 여부를 확인합니다.
  3. “y”면 Circle명령어를 실행합니다.
  4. “y”가 아니면 Rectangle명령어를 실행합니다.

위 함수를 실행하면 사용자가 입력한 값이 정확히 y일 경우만 Circle명령어를 실행하고, 스페이스바 뿐만 아니라 y가 아닌 어떤 값을 입력하더라도 Rectangle함수를 실행합니다.

이렇게 (if)함수를 사용하면 조건에 따라 다른 기능을 실행할 수 있습니다.

사실 이렇게 정확한 키워드를 입력받을 경우에는 (getstring)대신 (getkword)라는 함수를 사용해야합니다. (getkword)함수에 대해서는 다음에 알아보도록 합시다.

© IsaacGo. All rights reserved.