루아에서 문자열은 바이트의 연속이다(sequences).

 

이 바이트들을 텍스트로 인코딩 하는 방식에 대하여 특정한 방식을 취하진 않는다.

 

유니코드도 사용할 수 있는데 가급적이면 UTF-8 인코딩을 권하고 있다.

(UTF-8이 가장 보편적이다)

 

루아에서는 문자열에 관한 다양한 라이브러리 함수를 지원한다. 예제로 알아보자.

 

* 문자열 대체하기

string 의 메소드 gsub는 substitute, replace 의 의미를 가지고 있다.

 

매개변수는 ("문자열", 대체할 문자열, 대체 문자열) 로 직관적이다.

 

 

* 문자열 길이 계산(바이트)

 

바이트 단위로 문자열의 길이를 계산할 수 있다.

 

영어는 한글자에 1바이트사용하고 유니코드를  UTF-8로 바꾼 한글은 3바이트를 사용한다. 그것을 감안해서 보면 된다.

print(#"가")
print(#"A")
print(#"루아입니다")
print(#"Hello Lua!")

유니코드 UTF-8 인코딩에 관해서는 아래 링크의 글을 참고한다.

 

유니코드와 한글 | 파이썬 유니코드 출력하기 | 한글 깨지는 문제 해결방법 | UTF-8 인코딩 하는 법 (tistory.com)

 

유니코드와 한글 | 파이썬 유니코드 출력하기 | 한글 깨지는 문제 해결방법 | UTF-8 인코딩 하는 법

유니코드는 전세계의 문자를 표현하기 위한 시스템이다. 0과 1로만 작동하는 컴퓨터가 문자를 표현하기 위해서는 별도의 코드를 사용해야 한다. -> 인코드 : 문자 -> 바이트로 변환 (1바이트는 8비

digiconfactory.tistory.com

* 문자열 연산

 

.. 이 연산자가 조금 특이하게 비춰질 수 있는데 유연성이 있어서 사용하다 보면 마음에 들을 것이다.

 

print("My name is " .. "Master Jedi")

a = 888

print(2 .. " + " .. a .. " is " .. (2 + a))

 

.. 은 문자열 연산이기 때문에 자동으로 형변환한다는 점에 주의한다.

 

print(2 .. 9)

-- 답은 29 이다. 2 + 9가 아님

 

한편 숫자가 될 수 있는 문자형과 숫자형을 + 로 연산하면 숫자형이 된다. 이 부분은 파이썬같은 언어와 다른 점이므로 주의해야 한다.

 

print("100" + 99)

답은 199다. 문자열이 -> 숫자형으로 자동 형변환

 

tonumber 함수를 사용하여 문자열을 숫자형으로 변환할 수 있다. 매개변수는 숫자가 가능한 문자열과, 진법(base)이다. 형식에 맞다면 2진수, 8진수 또는 16진수로도 변환할 수 있다.

print(tonumber(" 72 ", 10))
print(tonumber("FF", 16))

실행결과 72, 255

tostring 함수는 tonumber의 반대격이다.

print(tostring(999.99))

* 긴 문자열 (멀티라인)

 

긴 문자열의 사용방법니다. 멀티라인 주석처리할 때 --[[ ]] 기호를 사용했는데 -- 를 제거하면 긴 문자열이 된다. 엔터키를 입력한 곳은 \n 같은 효과가 있다. html 파일 같은 것을 취급하기가 좋다.

longString = [[
This is long story.

It all started with someone breaking slience in the morning

]]

print(longString)

* 스트링 라이브러리 예제

 

좋은 언어는 문자열을 다루는 기본 라이브러리가 풍부하다. 루아도 문자열을 사용할 수 있는 다양한 옵션을 제공한다.

 

string의 함수를 몇번 사용하다보면 어렵지 않게 이해할 수 있을 정도로 직관적이고 쉽다. 문자열 연산자 .. 가 있으니 반대로 슬라이싱 하는 것도 가능하다. 문자열 관련 함수는 자주 사용하게 되니 함수의 사용법을 두루 익혀두면 도움이 된다. 이것들을 한번에 다 외우라는 것은 무리가 있고 그럴 필요도 없다.

 

대략적으로 어떤 기능을 하는 함수가 있는지 정도를 알아두면 된다. 대부분 다른 언어에서도 있는 기능이 많다. 함수 이름과 사용방식만 약간씩 다를 뿐이다. 반대로 루아에 익숙해지면 다른 언어의 문자열 라이브러리도 크게 어렵지 않게 사용할 수 있다. 문법을 외운다는 생각을 버리면 다양한 언어의 공통점을 찾아내서 빠른 학습이 가능하다.

 

이런 말을 하는 것은 루아를 첫번째 언어(프로그래밍의 모국어?)로 시작하는 사람은 많지 않을거라고 생각하기 때문이다. 외국에서는 Roblox 의 인기가 높아서 Lua 스크립트로 코딩을 시작하는 사람도 있는 것 같은데 게임 스크립트로 프로그래밍을 배우기는 한계가 있을 것이다. (도움은 된다)

 

개인적으로는 적어도 파이썬이나 자바 정도를 공부한 후 루아를 해보는게 좀 더 낫지 않을까 싶다.

 

-- 스트링 라이브러리 함수 예제

print(string.rep( "*okay* ", 5 ))
print(string.reverse( "YOUR FRIEND" ))
print(string.lower( "YOUR FRIEND" ))
print(string.upper( "my friend" ))

text = "[SEOUL CITY]"

print(text)
print(string.sub(text, 2, -2))
print(string.sub(text, 1, 6))
print(string.sub(text, -2, -1))

print(string.char(65))
print(string.char(97, 98, 99, 100))
print(string.byte( "abcdefghijklmnopqrstuvwxyz", 1 ))
print(string.byte( "abcdefghijklmnopqrstuvwxyz", 1, 2))
print(string.byte( "abcdefghijklmnopqrstuvwxyz", -1 ))

* 문자열 포맷

 

문자열 포맷은 c언어의 printf 스타일이다. c와 달리 별도로 string.format 함수에서 사용한다.

a = 5
b = 3

print(string.format( "a + b,  %d + %d = %d", a, b, a + b ))
print(string.format( "float : %f", 99.98 ))
print(string.format( "%s", "String variable"))

 

문자열에 좀 더 많은 사용법이 있겠지만 지나치지 않도록 이정도만 해둔다.

 

공유하기

facebook twitter kakaoTalk kakaostory naver band