https://arca.live/b/textgame/9287721

초보자는 이거 먼저 소화하는게 좋음


1. 문자열이란

기본적으로 컴퓨터는 모든 것을 수로 판단하기 때문에, 컴퓨터에게 문자, 더 나아가 글을 인식하고 저장하게 하는 것은 생각보다 어려운 일임. 그러나 사람들이 그 결과물을 사용해야 하는 이상 글을 다루는 것 또한 언젠가는 컴퓨터로 해야 했고, 이를 위해 각 언어들은 글 분석을 위해 여러 가지 기능을 지원하고 있음.

글을 컴퓨터가 다루기 위해 제일 먼저 해야할 것은 바로 저장할 글을 코드와 분리하는 것임. 코드도 아무튼 글로 이루어져 있기 때문에 그냥 적어놔서는 컴퓨터는 어디까지가 코드이고 어디부터가 글인지 알 수가 없음. 따라서 코드와 글을 분리하기 위한 기호가 필요함.

"내용"

에라를 포함해 대다수의 언어들은 이를 위해 큰따옴표를 채용하고 있음. 위처럼 큰따옴표로 둘러쳐진 부분은 더이상 코드가 아니라 글로써 봐달라는 의미가 됨. 이렇게 된 부분은 컴퓨터가 더이상 적힌 내용을 기호로 인식하지 않으며 그냥 적혀있는 그대로를 가져다 쓰게 됨. 이렇게 큰따옴표로 둘러싸인 하나의 글 묶음을 문자열이라고 부름.

내용

또한, 혼동을 피하기 위해 컴퓨터가 그냥 글로써 받아들여지기를 원하지만 아직 큰따옴표로 둘러치지 않은 상태의 글을 '줄글'이라고 부르기로 하겠음.

줄글을 큰따옴표로 둘러서 문자열로 표시하게 되면서, 이제 컴퓨터는 적혀있는 글을 기호로써 해석해야 하는 코드 부분과 그냥 그대로 받아들여야 하는 문자열 부분으로 구별할 수 있게 됨. 따라서 다음과 같은 일이 가능해짐.

내용1 + 내용2

위와 같이 그냥 줄글 2개를 더하려고 할 경우, 컴퓨터는 +가 줄글의 일부인지 연산인지 알 방도가 없음. 따라서 저렇게 적어봤자 컴퓨터는 무슨 소린지 이해하지 못해 오류를 내거나, 그나마 줄글임을 인식하더라도 내용1 + 내용2 과 같이 통짜 줄글로 인식하게 됨.

"내용1" + "내용2"

그러나 문자열을 쓰게 되면 컴퓨터는 +가 큰 따옴표 밖에 있기 때문에 기호힘을 확실히 알 수 있고, 따라서 위의 구문을 두 문자열을 더하는 구문으로 해석할 수 있게 됨. 에라에서 문자열의 덧셈은 두 문자열을 이어붙이는 것으로 해석하며, 따라서 위의 결과는 "내용1내용2"가 됨.

내"용

만약 줄글에 이미 "가 포함되어 있고, 그 상태의 줄글에 큰따옴표를 붙여서 문자열로 바꾸고자 한다면 컴퓨터에게 어느 "는 그냥 문자이고 어느 "는 기호인지를 알려줘야 함. 그 때 쓰는 기호가 \임. 

"내\"용"

원래는 기호로 취급되는 문자인데 그냥 문자로 취급하게 만들고 싶다면 그 문자의 앞에 \를 붙이면 됨. \는 원래는 역슬래시라는 기호인데, /(슬래시)와는 반대로 왼쪽 위에서 오른쪽 아래로 그어진 사선임. 그런데 자주 안써서인지 한국에서는 이 기호를 원 기호로, 일본에서는 엔 기호로 바꿨고, 그래서 자신이 화면을 보는 환경에 따라 \기호가 원으로 보일수도(주로 한국어로 설정된 컴퓨터에서), 엔으로 보일수도(에뮤에라에서는 이렇게 보임), 혹은 역슬래시로 보일 수도 있음. 여기서는 국제 표준에 따라 역슬래시라고 부르겠음.


2. %%과 {}

위에서 이야기한 내용을 다시 생각해보면, 큰따옴표는 줄글을 문자열로 바꿔주는 기호라고 할 수 있음. 그럼 반대로 문자열을 줄글로 바꿔주는 기호가 있을텐데, 바로 %%임.

%"내용"%

위와 같이 쓰면 이제 저 부분은 내용 이라는 줄글이 됨. 따라서

%"내용"%입니다

와 같이 쓰면 이는 내용입니다 라는 긴 줄글이 되는 셈임.

정수를 줄글로 바꿔주는 기호도 있는데, 바로 {}임.

{10}

이렇게 쓰면 위의 내용은 이제 10 이라는 줄글이 됨. 바뀐게 없지 않냐고 생각할 수도 있는데, 정수 10은 수이기 때문에 사칙연산이나 크기비교가 가능하지만 줄글 10은 줄글이기 때문에 그런 연산들이 불가능함. 즉

10 + 10

은 20이지만

{10} + {10}

은 20이 될 수 없음.

이제 %%와 {}를 사용하여 문자열과 정수를 줄글로 만들었으니, 그럼 다시 ""를 사용하여 이들을 문자열로 돌릴 수 있다고 생각할 수 있음.

"%"내용"%{1}"

그러나 실제로 저렇게 적어보면 오류가 남을 확인할 수 있음. 이 상황을 이해하려면 아까 ""가 내부의 글자들을 기호가 아닌 문자로 해석한다는 것을 기억해야함. %%나 {}도 어쨌든 문자기 때문에, "" 안으로 들어가면 컴퓨터는 이 문자를 기호가 아니라 그냥 문자로서 받아들이게 됨. 따라서 위에서 설명한 문자열이나 정수를 줄글로 바꾸는 작업을 하지 않게 되어 오류가 발생하는거임.

문자열을 만들 때 내부의 %%와 {}만은 문자가 아닌 기호로써 인식하게 하고 싶다면 다음과 같이 해야함.

@"%"내용"%{1}"

위와 같이 "" 대신 @""을 사용하면 이제 컴퓨터는 "" 안에 들어있는 %%와 {}를 다시 기호로 인식함. 따라서 위의 구문은 다시 원하는 대로 작동하여 "내용1"이라는 문자열이 됨.

@""는 내부의 %%와 {}를 기호로 인식하기 때문에, @""을 쓰면서 %나 {}라는 문자를 사용하고 싶으면 위에서 "에 했던 대로 앞에 \를 달아주면 됨.

@"\{내용\}1\%"

위의 구문은 "{내용}1%"라는 문자열과 같은 문자열이 됨.

이후의 혼동을 피하기 위해, 이제부터 %%와 {}를 기호로 인식하게 하고싶은 줄글을 '줄글식'으로 부르고, %%와 {}도 그냥 문자로 인식하게 하고싶은 줄글은 계속 '줄글'로 부르겠음.


3. 문자열 저장하기

마치 정수에 대해서 하듯이, 문자열 역시 변수에 저장하고, 바꾸고, 꺼내 쓰는 작업이 가능함. 적절한 타이밍에 정보들을 저장하고 적절한 타이밍에 꺼내 쓰는 것이 코드를 만드는데 있어서 매우 중요한 요소라고 할 수 있음.

문자열을 문자열 변수(#DIMS로 선언한 변수)에 저장하는 것은 정수를 정수 변수에 저장하는 것과는 조금 다름. 기본적으로 두 가지가 있는데, 줄글을 저장하는 것과 문자열을 저장하는 것이 있음.

변수 = 내용
변수 '= "내용"

문자열 변수에 저장할 때 =를 쓰면 컴퓨터는 그 뒤를 줄글식으로써 인식함. 그 대신 '=를 사용하면 컴퓨터는 그 뒤에 문자열이 올 것을 기대하게 됨. 위의 두 경우 모두 동일하게 변수 안에 "내용"이라는 문자열이 저장되게 됨.

그렇다면 그냥 =로 저장하면 되는데 왜 귀찮게 '나 "를 붙여서 문자열로 저장하는 기호를 만들었는지 알기 위해서는, 아까 위에서 문자열은 기호로 해석할 부분과 문자 그대로를 받아들여할 부분은 명확하게 나눈다는 것을 기억해야 함. 따라서

변수 = 내용1 + 내용2
변수 '= "내용1" + "내용2"

와 같은 경우, 위의 상황에서는 변수에 "내용1 + 내용2"로 통째로 저장되지만, 아래의 상황에서는 "내용1내용2"로 +연산을 실행하여 저장되게 됨.

또한, 기본적으로 문자열 변수는 이름처럼 문자열로 취급되기 때문에 변수끼리의 연산에서는 '=가 더 유리해짐.

변수1 = 안녕
변수2 '= "하세요"
변수3 = %변수1%%변수2%
변수4 = %변수1 + 변수2%
변수5 = 변수1 + 변수2
변수6 '= 변수1 + 변수2

변수1에는 "안녕"이, 변수2에는 "하세요"가 저장됨. 이 상황에서 둘을 합친 문자열을 새 변수에 저장하고자 할 때, =를 쓰려고 한다면 변수3에서와 같이 각각을 %%를 통해 줄글로 변환 후 직접 이어적거나, 두 변수를 더한 후 %%를 통해 줄글로 변환해야 대입할 수 있음. 귀찮다고 변수5처럼 써버리면 컴퓨터는 등호 오른쪽을 통째로 줄글식으로 인식하여 "변수1 + 변수2"가 저장되어버림. 그러나 '=를 쓴다면 변수6처럼 그냥 변수1과 변수2를 더해주는 것으로 "안녕하세요"가 저장되게 할 수 있음.

또한 문자열 배열에 한번에 여러개의 문자열을 대입하려고 할 때에서 '=가 빛을 발함. 배열에 여러 값을 저장할 경우 각각의 값을 ,로 구분하는데

배열 = 내용1, 내용2, 내용3, 내용4

이렇게 해버리면 컴퓨터는 = 오른쪽의 ,마저 그냥 문자로 인식하기 때문에 배열:0에만 "내용1, 내용2, 내용3, 내용4"가 통째로 들어가게 됨. 따라서 배열에 올바르게 저장하기 위해서는 '=를 사용하여

배열 '= "내용1", "내용2", "내용3", "내용4"

로 해야 컴퓨터가 ,를 제대로 각 값들을 구분하는 용도의 기호로써 인식할 수 있게 됨.

단, 처음 변수를 선언하는 동시에 초기화할 경우, 오직 =만 사용 가능하며 컴퓨터는 = 뒤를 문자열로 인식함.

#DIMS 변수 = "내용"

이건 예외조항이니 그냥 외워두어야 함.


위에서 이야기한 내용들을 응용한다면, 위의 예시와는 다르게 생겼지만 같은 내용을 저장할 수 있는 방식을 얼마든지 만들 수도 있음.

변수7 '= @"%변수1%%변수2%"

와 같이. 직접 연습해본다 생각하고 여러가지 방법을 고안해보는 것도 좋을 것 같음.


4. PRINT

우리가 코드에서 문자열을 다루는 것은, 전부는 아니지만 대부분 이를 출력하기 위해서임. 따라서 문자열 관련 정보는 필연적으로 PRINT 명령어 관련 정보와 연결되게 됨. 에라에는 다양한 종류의 PRINT들이 존재하며, 이들은 서로 받는 입력의 형태도, 입력을 해석하는 방법도 약간씩 차이가 있음.

PRINT 줄글(줄글식 아님)
PRINTV 정수 or 문자열, 정수 or 문자열, 정수 or 문자열, ...
PRINTS 문자열
PRINTFORM 줄글식
PRINTFORMS 문자열 or "줄글식"

PRINT를 입력방식으로 구분하면 위처럼 5개로 구분됨. 맨 위의 PRINT는 줄글을 받아 그대로 출력하며, 줄글식이 아니기 때문에 안에 들어있는 "" %% {} 등도 그냥 있는 그대로 출력함. 별다른 처리 없이 그냥 적은 그대로 출력하고 싶을 때 사용하면 됨.

PRINTV는 문자열을 받으며, 정수를 입력해도 오류 없이 그대로 출력해줌. 또한 여러개의 입력을 ,로 구분해 받을 수 있으며 이 경우 입력한 여러 정수 혹은 문자열이 줄줄이 이어서 나오게 됨. 정수가 별다른 변환과정 없이도 출력된다는 것으로 차별화할 수 있음.

PRINTS는 문자열만을 받음. 문자열을 받기 때문에 직접 손으로 출력문을 입력할때보다는 문자열 변수를 출력할 때 강함. @""덕분에 모든 상황에 대응이 가능하기 때문에 개인적으로는 이쪽 사용에 숙달되는 것을 추천함.

PRINTFORM은 줄글식을 받음. PRINT와 달리 %%나 {}를 기호로 취급하여 안의 값을 계산한 후 출력함. 단 ""는 여전히 그냥 문자로 취급해 출력하니 참고. ""를 매번 쓰기 귀찮은데 %%와 {}의 기능을 활용해야 할 때 사용하게 됨.

PRINTFORMS는 문자열과 "줄글식"을 받음. 무슨 소린가 하면 ""로 둘러싸여있어도 안에 들어있는 %%나 {}를 기호로써 취급한다는 의미임. 따라서 매번 @까지 입력하는 것을 안해도 되지만, @ 하나를 생략하기 위해 FORM 네 글자를 더 써야하는 비효율성과 \n에 도달하면 그 뒤의 내용은 무시한다는 PRINTFORMS만의 이상한 기능 때문에 잘 쓸 일은 없음.
그 외에 K(FORCEKANA 명령을 적용하고 출력)/D(SETCOLOR명령을 무시하고 출력) 접미사와 L(출력 후 줄바꿈)/W(출력 후 대기) 접미사도 있지만 문자열과 관련된 내용은 아니니 추가 설명은 생략하겠음.