명시적 '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) -- 출력: 1counter.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테이블을 수동으로 전달하는 방식도 작동하지만, 반복적으로 느껴질 수 있습니다. 다음 레슨에서는 이를 자동으로 처리하는 더 깔끔한 구문을 배우게 됩니다.
챌린지
쉬움count 필드가 0으로 초기화된 tracker라는 이름의 테이블을 생성하세요.
다음을 수행하는 tracker.addAmount(self, amount) 함수를 추가하세요:
- 첫 번째 매개변수로
self(테이블)를 받습니다 - 두 번째 매개변수로
amount를 받습니다 self.count에amount를 더합니다
두 개의 입력을 받게 됩니다:
- 더할 첫 번째 금액
- 더할 두 번째 금액
매번 테이블을 첫 번째 인자로 전달하여 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) -- 출력: 1self 매개변수를 사용하면 테이블 이름을 하드코딩하지 않고도 함수가 테이블의 필드를 읽고 수정할 수 있습니다:
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)이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.