학습
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
코드 한 줄씩 동작 설명
function max(a, b): 두 개의 매개변수a와b를 받는max라는 함수를 정의합니다.if a > b then:a가b보다 큰지 비교합니다.return a:a가 크면a를 반환합니다.return b: 그렇지 않으면b를 반환합니다.print(max(10, 20)): 정수 10과 20을 비교하여 더 큰 값을 출력합니다.print(max("apple", "banana")): 문자열 "apple"과 "banana"를 비교하여 알파벳 순서로 더 큰 값을 출력합니다.- 제네릭 프로그래밍은 코드의 재사용성과 유지보수성을 높여줍니다.
- 다양한 데이터 타입을 처리할 수 있는 제네릭 함수를 작성할 수 있습니다.
- 제네릭을 활용하면 코드의 중복을 줄이고, 협업 시 가독성을 높일 수 있습니다.
- Lua의 메타테이블과 메타메소드
- 객체 지향 프로그래밍(OOP) 개념
- 고급 데이터 구조 (예: 링크드 리스트, 트리)
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. 정리
다음에 학습하면 좋은 주제: