시리즈 AI채팅 중급자용 가이드
개념글 모음

미리 읽기


리스 중괄호 구문 기초 강의: 변수 편을 먼저 읽고 오기를 권한다.

변수 편에서 우리는 변수를 선언하고, 변수 값을 설정하고, 변경하거나 계산하는 방법을 배웠다.

최종적으로는 '체력'이라는 변수에 90, '정신력'이라는 변수에 86이 할당되게 되었다.


{{getvar::체력}}=90

{{getvar::정신력}}=86

{{calc::{{getvar::체력}}+{{getvar::정신력}}}}=176


이 중괄호 구문을 잘 이해할 수 있다면 연산자를 배울 준비가 되었다는 뜻이다.



주의사항


- 중괄호 구문은 채팅 메시지, 봇카드/페르소나 디스크립션, 로어북 등 리퀘스트에 포함되는 대부분의 항목에서 사용할 수 있다.

- 하지만 {{setvar}} 등 퍼메에서 작동하지 않는 구문도 있기 때문에 렌트리를 잘 확인해야 한다.

- 변수 기능 등은 메시지가 '전송될 때' 작동한다. 순서에 유의해야 한다.

- 대소문자는 구분되지 않는다. 예를 들어, {{user}}, {{User}}, {{USER}}는 모두 같은 값을 가진다.



불리언 자료형(Boolean Data Type)


연산자를 이해하고 써먹기 위해서는 먼저 불리언 타입에 대해 간단하게 알아 둘 필요가 있다.

많은 챗붕이들은 컴퓨터가 오직 0과 1로만 사고하고 소통할 수 있다는 말을 어디에선가 들어 본 적이 있을 것이다.

그런 컴퓨터에게 어떤 판단 또는 연산의 결과가 '맞다' 또는 '틀리다'를 전달하고 전달받기 위해, 참과 거짓을 0과 1로 표현한 게 불리언 자료형이다.

이 때 많은 언어, 그리고 우리가 현재 다루고 있는 리스 중괄호 구문(및 자바스크립트)에서는 '참(True)'을 1, '거짓(False)'를 0으로 표현한다.


'다람쥐'와 '햄스터'는 같은 문자열인가? => 0 (False)

'63빌딩'은 '경복궁'보다 긴 문자열인가? => 1 (True)


설명이 조금 어렵게 느껴지더라도, 결과의 참과 1, 결과의 거짓과 0을 잘 연관지을 수 있기만 하면 된다.



등가 연산자


등가 연산자(Equality Operator)는 말 그대로 값 두 개가 서로 같은지(equal) 다른지(not equal)를 판별하여 그 결과를 반환(출력)해 준다.


{{equal}}

값 1과 값 2가 같으면(equal) 1, 다르면 0을 반환한다.


{{equal::(값 1)::(값 2)}}


'체력' 변수값과 '정신력' 변수값이 일치하는지 확인해 보자. '변수' 편에서, 값을 나타내기 위해서는 {{getvar}}를 써 줘야 한다는 것을 기억하자.


{{equal::{{getvar::체력}}::{{getvar::정신력}}}}


체력은 90, 정신력은 86이므로 둘은 일치하지 않는다. 어떤 값이 반환될까? 그렇다. 거짓이므로 0이 반환된다.


{{equal::{{getvar::체력}}::{{getvar::정신력}}}} = 0 (거짓)


{{not_equal}}

not_equal 구문은 equal과 정확히 반대로 작동한다. 즉, 값 1과 값 2가 같으면 0, 다르면 1을 반환한다.


{{not_equal::(값 1)::(값 2)}}


즉 체력과 정신력에 대한 위의 예시에 대한 결과는 1일 것이다.


{{not_equal::{{getvar::체력}}::{{getvar::정신력}}}} = 1 (참)



관계 연산자


관계 연산자(Relational Operator)는 값 두 개를 비교해서 두 값 간의 관계를 평가하는 연산자이다.

즉, 값 1이 값 2보다 큰지, 작은지, 크거나 같은지, 작거나 같은지를 판별하여 결과에 따라 1 또는 0을 출력한다.


{{greater}}, {{greater_equal}}

greater는 값 1이 값 2보다 클 때(초과) 1, 그렇지 않으면 0을 반환한다.

greater_equal은 값 1이 값 2보다 크거나 같을 때(이상) 1, 그렇지 않으면 0을 반환한다.


{{greater::(값 1)::(값 2)}}
{{greater_equal::(값 1)::(값 2)}}


체력 변수의 값이 90보다 큰 지 확인해 보자.


{{greater::{{getvar::체력}}::90}}


체력은 90이었으므로, 90보다 큰 것은 아니다. 따라서 위 식의 결과는 거짓이다.


{{greater::{{getvar::체력}}::90}} = 0 (거짓)


하지만 greater 대신 greater_equal을 쓴다면, 체력이 정확히 90과 같기(equal) 때문에 결과는 달라진다.


{{greater_equal::{{getvar::체력}}::90}} = 1 (참)


{{less}}, {{less_equal}}


greater를 잘 이해했다면 less도 자연스럽게 이해할 수 있다.

less는 값 1이 값 2보다 작을 때(미만) 1, 그렇지 않으면 0을 반환한다.

less_equal은 값 1이 값 2보다 작거나 같을 때(이하) 1, 그렇지 않으면 0을 반환한다.

예시는 생략한다.



논리 연산자


여기까지 강의글을 잘 따라왔다면 이제 판단이나 연산 결과의 참을 1, 거짓을 0으로 나타내는 불리언 타입이 조금 익숙해졌을 것이다.

그렇다면 이제 논리 연산자를 이해할 준비가 되었다는 뜻이다.

등가 연산자와 관계 연산자는 '값'을 서로 비교하기 위한 연산자였다. 하지만 논리 연산자는 '조건'을 연산하기 위해 쓰인다.


'다람쥐'와 '햄스터'는 같은 문자열인가? : 등가 연산자

'63빌딩'은 '경복궁'보다 긴 문자열인가? : 관계 연산자

'다람쥐'는 3글자 이상(결과 1)이고, 그리고(조건) '63빌딩'에는 숫자가 포함(결과 2)되는가? : 논리 연산자


즉, (결과 1)이 참이고, 그리고(and) (결과 2)도 참인가? 와 같이, 주어진 식이 어떤 조건에 부합하는지 아닌지를 판별하기 위해 쓰이는 것이 논리 연산자이다.

설명이 다소 난해할 수 있지만 예시들을 차근차근 잘 따라와 보자.


{{and}}


and는 결과 1도 참, 결과 2도 참일 때 1, 그렇지 않으면 0을 반환한다.

즉, 결과 1과 결과 2의 값이 모두 1이어야지만 1을 반환한다.


{{and::(결과 1)::(결과 2)}}


조건{{and}}의 최종 결과
결과 1결과 2
111
100
010
000


{{or}}


and는 결과 1 또는 결과 2 둘 중 하나만 1이어도 1을 반환하고, 둘 다 거짓이면 거짓을 반환한다.


{{or::(결과 1)::(결과 2)}}


조건{{and}}의 최종 결과
결과 1결과 2
111
101
011
000


{{not}}


not은 비교적 간단하다. 구문 안의 식의 결과가 거짓이라면 1, 거짓이 아니라면 0을 반환한다.


{{not::(결과)}}



실전 예시


지금까지 배운 내용을 모두 활용해 체력과 정신력이 모두 90 이상인지를 판별하는 구문을 작성해 보자.

우리가 해야 할 건 크게 세 가지다.


1. 체력이 90 이상인지를 판별한다.

2. 정신력이 90 이상인지를 판별한다.

3. 1과 2의 결과가 둘 다 참인지를 판별한다.


지금까지 강의를 잘 따라왔다면, 1과 2에는 {{greater_equal}} 구문을 사용할 수 있다는 걸 금방 깨달았을 것이다.

3번에 대해서는, 체력이 90 이상이고, 그리고 정신력도 90 이상이어야 하기 때문에 {{and}}를 사용해야 한다.

차근차근 구문을 작성해 보자.


1. 체력이 90 이상인지를 판별하는 구문

{{greater_equal::{{getvar::체력}}::90}}


2. 정신력이 90 이상인지를 판별하는 구문

{{greater_equal::{{getvar::정신력}}::90}}


3. 1과 2의 결과가 둘 다 참인지를 판별하는 구문

{{and::결과 1::결과 2}}, 즉

{{and::{{greater_equal::{{getvar::체력}}::90}}::{{greater_equal::{{getvar::정신력}}::90}}}}


최종 식의 결과는 어떻게 될까?


체력은 90이었으므로 90 이상이 '참'이다.


{{greater_equal::{{getvar::체력}}::90}} = 1


정신력은 86이었으므로 90 이상이 '거짓'이다.


{{greater_equal::{{getvar::정신력}}::90}} = 0


즉, {{and}} 식은 다음과 같이 처리된다.


{{and::{{greater_equal::{{getvar::체력}}::90}}::{{greater_equal::{{getvar::정신력}}::90}}}}

= {{and::1::0}}


{{and}}는 결과 1과 결과 2가 모두 1이어야 1을 반환하므로,


{{and::{{greater_equal::{{getvar::체력}}::90}}::{{greater_equal::{{getvar::정신력}}::90}}}} = 0 (거짓)


만약 {{and}} 대신 {{or}}를 쓰면 어떻게 될까?

{{or}}은 결과 1과 2 둘 중 하나만 1이어도 1을 반환한다. 따라서,


{{or::{{greater_equal::{{getvar::체력}}::90}}::{{greater_equal::{{getvar::정신력}}::90}}}}

= {{or::1::0}}

= 1 (참)



마무리


이 글은 여러분을 괴롭히려고 작성된 것이 아니다.

프로그래밍에 대한 지식이 하나도 없어도, 변수라는 것을 완전히 처음 접했어도 누구나 리스의 중괄호 구문을 활용하여 다양한 기능을 직접 구현해 볼 수 있도록 최대한 쉽고 이해가 편하게 작성하려고 노력하고 있다.

따라서 글이 어렵게 느껴지거나, 이해가 잘 안 되는 부분이 있다면, 잘 모르겠고 어렵다는 의견만을 표현하는 대신 댓글로 어떤 부분이 어려웠는지 피드백을 해 준다면 참 고마울 듯 하다.

그래야 설명 방식을 바꾸든, 예제나 그림을 추가하든, 여러 방식으로 글을 개선하여 더 많은 챈럼들에게 도움이 될 수 있으리라 생각한다.


다음 강의는 중괄호 구문 기초 강의의 마지막 편인 #if 및 실전 활용이 될 예정이다.

이 강의까지를 잘 이해했다면 #if의 기능과 사용 방법을 이해하는 것은 전혀 어렵지 않다.

따라서 다음 강의는 실전 활용 예제를 통해, '체력'과 '정신력'이 둘 다 90 이상이라면 '건강' 상태를 출력한다거나, '체력'이 '정신력'보다 40 이상 작다면 '불굴의 의지' 상태를 출력한다거나, '체력'이 0 이하면 캐릭터를 사망시키라는 프롬프트를 삽입하는 등 다양한 기능을 구현해 볼 것이다.

읽어 주어서 고맙다!