루아의 함수 (function)

동적 타입 언어 (dynamic type)

함수에 대해 들어가기 전에 동적 타입에 대하여 생각해볼 필요가 있습니다.

 

현재 대표적인 동적타입 언어는 자바스크립트, 파이썬 그리고 루아 정도가 있겠네요.

 

이들이 함수를 사용할 때 특징을 보면 프로그래머가 매개변수를 타입(자료형)을 명시하지 않습니다. 반환형도 마찬가지라서 반환을 하고 싶으면 return 을 쓰는 것이고 아니면 그냥 end 로 끝을 낼 수 있습니다. 정적 타입 언어를 오래 쓰다보면 이런 것에 적응하는데 시간이 걸립니다. 습관이란게 남아있어서 뭔가 컴파일러(인터프리터)에게 더 자세하게 지시를 해놔야 마음이 편할 것 같거든요.

 

동적 타입 언어를 사용하기 위해서 이런 습관을 좀 무시해야 하는 부분이 있습니다. 프로그래머가 하지 않은 부분은 인터프리터가 하는 부분입니다. 좋게 말하면 컴퓨터가 알아서 해주니 좋고 안좋게 말하면 어떻게 작동하는지 몰라서 불편하게 느낄 수 있습니다.

 

동적 타입(dynamic type)은 최근 프로그래밍의 큰 흐름 중의 하나라서 잘 알아둬야 하는 기술입니다.

 

불과 몇십년 사이에 하드웨어와 소프트웨어 기술이 눈부시게 발전하면서 예전처럼 바이트 단위로 메모리를 관리하지 않아도 되는 세상입니다. 모든 분야가 그렇지는 않지만 많은 CPU들이 성능향상으로 예전에 비해 풍족한 생활을 하고 있죠😀 메모리도 기가 단위로 쌓아놓다보니 이전 처럼 메모리 충돌(memory carsh)이 일어날 일도 별로 없습니다.

 

서버는 클라우드 기술의 발달로 없는 파워도 바로 끌어다 쓸 수 있도록 되있습니다. 컴퓨팅 기술의 발전을 보면 그야말로 신세계입니다.

 

동적 타입은 실행시간에 역동적으로(dynamic) 명령어의 실행을 결정한다는 의미도 있지만 한편으로 프로그래밍의 세세한 부분까지도 기계의 자동화에 위임한다는 뜻도 담겨있습니다. 이전에는 프로그래머가 했던 부분이었지요.

 

인공지능이 프로그래밍을 한다는 이야기까지 하지 않아도 미래의 소프트웨어 기술은 많은 부분을 컴퓨터에게 위임할 가능성이 높습니다. 인간 입장에서는 기계에게 밀릴까봐 좀 두렵기도 합니다만 그렇게 생각하기 보다는 컴퓨터에게 더 많은 일을 시킬 수 있는 인간이 되도록 노력하는게 좋겠죠.

 

최근에 사용되는 동적 타입 언어의 특징은 아무래도 개발의 속도를 높인 부분이 있습니다. 시류에 맞게 빠른 결과물을 만드는 것에는 JS, 파이썬 같은 동적 타입 언어가 유리합니다. 하지만 단점도 있는데 타입관리를 컴파일러나 번역기가 하다보니 실행시간(runtime) 오류에 취약한 부분이 있습니다.

 

이런 부분을 생각하면서 함수의 사용법을 알아 보겠습니다.

1. 매개변수와 반환값이 없는 경우

매개변수와 반환값이 없다는 것은 void 함수 (void) 로 볼 수 있습니다.

 

단순히 표준입출력을 사용하는 경우에는 딱히 매개변수나 반환값을 사용하지 않는 경우도 많죠. 

 

또 전역변수를 함수에서 사용하는 경우에도 매개변수로 전달하지 않습니다.

 

아래의 예제에는 단순히 console 에 문자열을 출력하는 함수입니다. 매개변수와 반환값이 없어도 됩니다.

 

function sayHello()
    print("Hello, my friend!")
end

sayHello()

2. 매개변수가 있는 경우

매개변수는 갯수에 제한은 없다. 다량의 데이터를 구조적으로 취급하려면 테이블 자료형을 매개변수로 받으면 될 것이다. 매개변수도 동적 타입이라 이럴 때도 딱히 함수에 자료형의 표시를 하지 않는다. 겉으로 봐서 타입을 알 수 없으니 이름을 좀 더 공들여 짓는 것도 하나의 방법이다. 반환값이 없기 때문에 코드블록의 마지막까지 실행후 함수는 종료한다.

function add_square(a,b)
    print("(a + b)^2 = " .. (a+b)^2)
end

add_square(3,2)

3. 매개변수와 반환값 둘 다 있는 경우

 

매개변수는 기본적으로 함수의 지역변수다. 함수가 종료하면 stack 메모리에서 사라지기 때문에 그 값을 바깥에서 사용하기 위해서 반환이 필요하다. return 키워드를 사용하면 함수의 바깥으로 값을 전달할 수 있다.

 

또 함수는 자기 스스로를 호출할 수 있는데 이를 재귀라고 한다. 재귀함수에서는 return 문을 사용해서 자기 자신을 호출하는 방식도 있다. 유용하게 사용되는 알고리즘이다.

function cube(a)
    return a*a*a
end

a = 5
print("cube of " .. a .. " : " .. cube(a))

 

4. Sequence 를 매개변수로 사용

 

Sequence - 연속된 자료 구조 - 를 매개변수로 사용하면 매개변수를 훨씬 유연하게 사용할 수 있다. 크기가 늘어나거나 줄어들어도 잘 동작한다.

function sum (a)
    local sum = 0
    
    for i = 1, #a do
    sum = sum + a[i]
    end
    
    return sum    
end

myArray = { 1, 3}

temp = sum(myArray)
print(temp)

myArray = { 1, 3, 5}

temp = sum(myArray)
print(temp)

myArray = { 1, 3, 5, 7}

temp = sum(myArray)
print(temp)

5. 가변인자 ... 사용

 

가변인자를 사용하여 값을 전달할 수도 있다. for문의 ipairs 를 사용하면 테이블에서 꺼내는 것 처럼 값을 가져온다. 자동생성한 인덱스가 1로부터 시작하는 것에 주의한다. 시작점이 0이 아니라 1이다.

function addALot(...)
    local sum = 0
    for i, v in ipairs{...} do
        print(i, v)
    end
end

addALot(2, "Greeting", 5, {"hello", "hi"})

 

여기까지 함수의 기본 사용법이다. 객체지향, 스레드 등 뒤로가서 나오는 함수의 고급 사용법은 후반 챕터에서 익힐 수 있다.

공유하기

facebook twitter kakaoTalk kakaostory naver band