Menu
Coddy logo textTech

명시적 'self'

Coddy Lua 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 70개 중 2번째.

함수가 테이블 내부에 있을 때, 해당 테이블 내의 데이터에 접근하거나 수정해야 할 때가 많습니다. 하지만 여기에 문제가 있습니다. 함수는 자신이 어떤 테이블에 속해 있는지 어떻게 알 수 있을까요?

해결 방법은 테이블을 함수의 첫 번째 인자로 명시적으로 전달하는 것입니다. 관례적으로, 이 매개변수의 이름은 self로 지정됩니다:

local counter = {
    value = 0
}

function counter.increment(self)
    self.value = self.value + 1
end

counter.increment(counter)
print(counter.value)  -- 출력: 1

counter.increment(counter)를 호출할 때 테이블 자체를 인자로 전달하는 방식에 주목하세요. 함수 내부에서 self는 이제 해당 테이블을 가리키며, 이를 통해 self.value를 읽고 수정할 수 있습니다.

이 패턴은 테이블의 이름을 하드코딩하지 않고도 함수가 테이블의 데이터와 함께 작동할 수 있게 해주기 때문에 필수적입니다. 현재 카운트를 초기화하고 반환하는 함수를 생각해 봅시다:

function counter.reset(self)
    local old = self.value
    self.value = 0
    return old
end

print(counter.reset(counter))  -- 출력: 1
print(counter.value)           -- 출력: 0

테이블을 수동으로 전달하는 방식도 작동하지만, 반복적으로 느껴질 수 있습니다. 다음 레슨에서는 이를 자동으로 처리하는 더 깔끔한 구문을 배우게 됩니다.

challenge icon

챌린지

쉬움

count 필드가 0으로 초기화된 tracker라는 이름의 테이블을 생성하세요.

다음을 수행하는 tracker.addAmount(self, amount) 함수를 추가하세요:

  • 첫 번째 매개변수로 self(테이블)를 받습니다
  • 두 번째 매개변수로 amount를 받습니다
  • self.countamount를 더합니다

두 개의 입력을 받게 됩니다:

  1. 더할 첫 번째 금액
  2. 더할 두 번째 금액

매번 테이블을 첫 번째 인자로 전달하여 tracker.addAmount를 두 번(각 입력에 대해 한 번씩) 호출하세요. 두 번의 호출이 끝난 후, tracker.count의 최종 값을 출력하세요.

치트 시트

테이블 내부의 함수는 테이블을 첫 번째 매개변수로 받음으로써 테이블 데이터에 접근할 수 있으며, 관례적으로 self라고 명명합니다:

local counter = {
    value = 0
}

function counter.increment(self)
    self.value = self.value + 1
end

counter.increment(counter)  -- 테이블을 인자로 전달
print(counter.value)  -- 출력: 1

self 매개변수를 사용하면 테이블 이름을 하드코딩하지 않고도 함수가 테이블의 필드를 읽고 수정할 수 있습니다:

function counter.reset(self)
    local old = self.value
    self.value = 0
    return old
end

print(counter.reset(counter))  -- 출력: 1
print(counter.value)           -- 출력: 0

함수는 self 다음에 추가 매개변수를 받을 수 있습니다:

function counter.add(self, amount)
    self.value = self.value + amount
end

counter.add(counter, 5)

직접 해보기

-- 입력 읽기
local amount1 = tonumber(io.read())
local amount2 = tonumber(io.read())

-- TODO: 아래에 코드를 작성하세요
-- 'count' 필드가 0으로 초기화된 'tracker'라는 이름의 테이블을 생성하세요
-- self.count에 amount를 더하는 tracker.addAmount(self, amount) 함수를 추가하세요
-- 테이블을 첫 번째 인자로 하여 tracker.addAmount를 두 번 호출하세요


-- 최종 count 출력
print(tracker.count)
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Object Oriented Programming의 모든 레슨