IMCAT.DEV
로그인 가입
Lua 중급 자료구조

Lua 제네릭 프로그래밍

Lua 제네릭 프로그래밍 — 중급

제네릭 프로그래밍

1. 도입 (왜 배워야 하는가)

제네릭 프로그래밍은 다양한 데이터 타입을 처리할 수 있는 프로그래밍 기법으로, 코드의 재사용성을 높이고 유지보수성을 향상시키는 데 중요한 역할을 합니다. 실무에서 여러 가지 데이터 유형을 다룰 때, 제네릭을 활용하면 코드의 중복을 줄이고, 작성한 코드가 다양한 상황에서도 잘 작동하도록 할 수 있습니다.

제네릭 프로그래밍을 모른다면, 특정 데이터 타입에 맞춰 코드를 반복해서 작성해야 하므로, 프로그램의 복잡성이 증가하고 버그가 생길 가능성이 높아집니다. 또한, 코드의 가독성과 유지보수성이 떨어져, 팀원들과 협업할 때 어려움을 겪을 수 있습니다.

2. 핵심 개념 설명

제네릭 프로그래밍은 특정 데이터 타입의 제한 없이, 다양한 타입으로 작동할 수 있는 코드를 작성하는 방식입니다. 쉽게 말해, 다양한 크기의 상자를 만들어 어떤 물건이든 담을 수 있는 것과 같습니다.

용어설명
제네릭하나의 함수나 데이터 구조가 다양한 데이터 타입을 처리할 수 있도록 하는 개념
타입 매개변수제네릭 함수나 구조체에서 사용되는 데이터 타입을 나타내는 매개변수

3. 기본 코드 예제

아래는 제네릭 함수를 사용하는 간단한 예제입니다. 두 값을 비교하여 더 큰 값을 반환하는 함수를 구현해보겠습니다.

function max(a, b)
    if a > b then
        return a
    else
        return b
    end
end

print(max(10, 20))   -- 20
print(max("apple", "banana")) -- banana

실행 결과

20
banana

코드 한 줄씩 동작 설명

  1. function max(a, b) : 두 개의 매개변수 a와 b를 받는 max라는 함수를 정의합니다.
  2. if a > b then : a가 b보다 큰지 비교합니다.
  3. return a : a가 크면 a를 반환합니다.
  4. return b : 그렇지 않으면 b를 반환합니다.
  5. print(max(10, 20)) : 정수 10과 20을 비교하여 더 큰 값을 출력합니다.
  6. print(max("apple", "banana")) : 문자열 "apple"과 "banana"를 비교하여 알파벳 순서로 더 큰 값을 출력합니다.
  7. 4. 실전 활용 예제

    예제 1: 쇼핑몰 장바구니 구현

    장바구니에 다양한 상품 객체를 담기 위해 제네릭을 사용할 수 있습니다.

    function addItem(basket, item)
        table.insert(basket, item)
    end
    
    local basket = {}
    addItem(basket, {name = "사과", price = 1000})
    addItem(basket, {name = "바나나", price = 800})
    
    for i, item in ipairs(basket) do
        print(item.name .. " 가격: " .. item.price)
    end

    예제 2: 스택 구현

    제네릭을 사용하여 다양한 타입의 데이터를 저장할 수 있는 스택을 구현할 수 있습니다.

    Stack = {}
    Stack.__index = Stack
    
    function Stack:new()
        return setmetatable({ items = {} }, Stack)
    end
    
    function Stack:push(item)
        table.insert(self.items, item)
    end
    
    function Stack:pop()
        return table.remove(self.items)
    end
    
    local myStack = Stack:new()
    myStack:push(1)
    myStack:push("hello")
    print(myStack:pop()) -- hello
    print(myStack:pop()) -- 1

    5. 흔한 실수와 주의사항

    실수 1: 타입 불일치

    print(max(10, "20")) -- 에러 발생

    올바른 코드:

    print(max(10, 20)) -- 20

    주의: 함수에 전달하는 인자의 타입이 일치해야 합니다.

    실수 2: 반환값을 확인하지 않음

    local result = max(10, 20)
    print(result) -- 잘못된 반환값 확인

    올바른 코드:

    local result = max(10, 20)
    if result then
        print(result) -- 20
    end

    주의: 반환값을 항상 확인하여 사용해야 합니다.

    6. 정리

    • 제네릭 프로그래밍은 코드의 재사용성과 유지보수성을 높여줍니다.
    • 다양한 데이터 타입을 처리할 수 있는 제네릭 함수를 작성할 수 있습니다.
    • 제네릭을 활용하면 코드의 중복을 줄이고, 협업 시 가독성을 높일 수 있습니다.
    • 다음에 학습하면 좋은 주제:

    • Lua의 메타테이블과 메타메소드
    • 객체 지향 프로그래밍(OOP) 개념
    • 고급 데이터 구조 (예: 링크드 리스트, 트리)