IMCAT.DEV
로그인 가입
Lua 중급 디자인패턴

Lua 디자인 패턴 개요

Lua 디자인 패턴 개요 — 중급

디자인 패턴 개요

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

디자인 패턴은 소프트웨어 개발에서 자주 발생하는 문제에 대한 해결책을 모아놓은 것입니다. 이러한 패턴을 이해하고 활용하면 코드의 재사용성, 유지보수성, 확장성을 높일 수 있습니다. 특히 시니어 개발자는 팀원들과의 소통이나 코드 리뷰 시 디자인 패턴을 이해하고 있어야 효과적으로 피드백을 줄 수 있습니다.

만약 디자인 패턴을 모른다면, 비효율적인 코드 구조로 인해 새로운 기능 추가 시 많은 시간과 노력이 소요될 수 있습니다. 또한, 코드의 가독성이 떨어져 팀원들이 협업하기 어려워질 수 있습니다.

2. 핵심 개념 설명

디자인 패턴은 주로 세 가지 카테고리로 나눌 수 있습니다: 생성 패턴, 구조 패턴, 행동 패턴입니다.

카테고리설명예시
생성 패턴객체 생성 방식을 다룸싱글톤, 팩토리 메소드
구조 패턴객체와 클래스의 조합을 다룸어댑터, 데코레이터
행동 패턴객체 간의 상호작용을 다룸옵저버, 전략

비유하자면, 디자인 패턴은 요리법과 같습니다. 요리법을 통해 각 재료를 어떻게 조합하여 맛있는 요리를 만들 수 있는지를 알려줍니다. 요리를 할 때마다 새로운 방식을 찾기보다는 이미 검증된 요리법을 사용하는 것이 더 효율적입니다.

3. 기본 코드 예제

여기서는 팩토리 메소드 패턴의 기본 사용법을 보여주겠습니다.

-- 제품 클래스
local Product = {}
Product.__index = Product

function Product:new(name)
    local instance = setmetatable({}, Product)
    instance.name = name
    return instance
end

function Product:use()
    return "Using " .. self.name
end

-- 팩토리 클래스
local ProductFactory = {}
ProductFactory.__index = ProductFactory

function ProductFactory:createProduct(name)
    return Product:new(name)
end

-- 사용 예
local factory = setmetatable({}, ProductFactory)
local product = factory:createProduct("Example Product")
print(product:use())

실행 결과:

Using Example Product

코드 설명:

  1. Product 클래스를 정의하고, new 메소드를 통해 새로운 인스턴스를 생성하는 방법을 정의합니다.
  2. use 메소드는 제품의 이름을 반환합니다.
  3. ProductFactory 클래스를 정의하고, createProduct 메소드를 통해 Product 인스턴스를 생성합니다.
  4. factory 인스턴스를 생성한 후, createProduct 메소드를 사용해 제품을 만들고, use 메소드를 호출하여 결과를 출력합니다.
  5. 4. 실전 활용 예제

    1. 싱글톤 패턴

    쇼핑몰의 설정 관리에서 싱글톤 패턴을 사용할 수 있습니다. 설정 정보는 애플리케이션 전체에서 동일해야 하므로, 단 하나의 인스턴스만 존재해야 합니다.

    local Settings = {}
    Settings.__index = Settings
    
    local instance
    
    function Settings:getInstance()
        if not instance then
            instance = setmetatable({}, Settings)
            instance.config = {}
        end
        return instance
    end
    
    function Settings:set(key, value)
        self.config[key] = value
    end
    
    function Settings:get(key)
        return self.config[key]
    end
    
    -- 사용 예
    local settings1 = Settings:getInstance()
    settings1:set("theme", "dark")
    
    local settings2 = Settings:getInstance()
    print(settings2:get("theme"))  -- "dark"

    2. 옵저버 패턴

    뉴스 어플리케이션에서 사용자가 구독한 뉴스 항목을 실시간으로 업데이트할 때 옵저버 패턴을 활용할 수 있습니다.

    local Subject = {}
    Subject.__index = Subject
    
    function Subject:new()
        local instance = {
            observers = {}
        }
        setmetatable(instance, Subject)
        return instance
    end
    
    function Subject:attach(observer)
        table.insert(self.observers, observer)
    end
    
    function Subject:notify()
        for _, observer in ipairs(self.observers) do
            observer:update()
        end
    end
    
    local Observer = {}
    Observer.__index = Observer
    
    function Observer:new(name)
        local instance = {
            name = name
        }
        setmetatable(instance, Observer)
        return instance
    end
    
    function Observer:update()
        print(self.name .. " received update!")
    end
    
    -- 사용 예
    local news = Subject:new()
    local user1 = Observer:new("User1")
    local user2 = Observer:new("User2")
    
    news:attach(user1)
    news:attach(user2)
    news:notify()  -- "User1 received update!" "User2 received update!"

    5. 흔한 실수와 주의사항

    실수 1: 패턴 남용

    디자인 패턴이 항상 필요한 것은 아닙니다. 간단한 문제에 복잡한 패턴을 적용하면 오히려 코드가 복잡해질 수 있습니다.

    잘못된 코드:

    -- 불필요한 팩토리 패턴 사용
    local unnecessaryFactory = {}
    function unnecessaryFactory:create()
        return {name = "Unnecessary"}
    end

    올바른 코드:

    -- 간단하게 직접 생성
    local simpleObject = {name = "Simple"}

    실수 2: 인터페이스의 일관성 무시

    각 패턴에 맞는 인터페이스를 잘 정의하지 않으면, 나중에 코드가 어렵게 될 수 있습니다.

    잘못된 코드:

    function incompatibleFunction()
        return 42  -- 예상치 못한 반환값
    end

    올바른 코드:

    function expectedFunction()
        return "Expected Value"
    end

    6. 정리

    • 디자인 패턴은 소프트웨어 개발에서 문제를 해결하기 위한 검증된 방법입니다.
    • 생성, 구조, 행동 패턴으로 분류할 수 있으며, 각 패턴은 특정 문제를 해결하는 데 특화되어 있습니다.
    • 실전에서는 싱글톤, 옵저버, 팩토리 메소드와 같은 패턴이 자주 사용됩니다.

다음에 학습하면 좋은 주제는 "각 디자인 패턴의 구체적인 예제와 활용 사례"입니다. 각 패턴의 세부 내용을 더 깊이 있게 학습함으로써 실무에 더 효과적으로 적용할 수 있습니다.