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)
)
- 먼저
(getstring)
함수로 사용자로부터 문자열을 입력받아 그 값을makeCircle
변수에 저장합니다.
- 사용자가 아무것도 입력하지 않고 스페이스바를 누른경우,
(getstring)
은 입력받은 값이 없으므로nil
을 반환하며, 이 값이makeCircle
에 저장됩니다.makeCircle
이 “y”인지 여부를 확인합니다.- “y”면 Circle명령어를 실행합니다.
- “y”가 아니면 Rectangle명령어를 실행합니다.
위 함수를 실행하면 사용자가 입력한 값이 정확히 y
일 경우만 Circle
명령어를 실행하고, 스페이스바 뿐만 아니라 y
가 아닌 어떤 값을 입력하더라도 Rectangle
함수를 실행합니다.
이렇게 (if)
함수를 사용하면 조건에 따라 다른 기능을 실행할 수 있습니다.
사실 이렇게 정확한 키워드를 입력받을 경우에는
(getstring)
대신(getkword)
라는 함수를 사용해야합니다.(getkword)
함수에 대해서는 다음에 알아보도록 합시다.