점(.) vs 콜론(:)
Coddy Lua 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 70개 중 4번째.
이제 점(dot)과 콜론(colon) 구문을 모두 알게 되었으므로, 각각을 언제 사용해야 하는지 이해하는 것과 이들을 잘못 혼용했을 때 어떤 일이 발생하는지 파악하는 것이 매우 중요합니다.
핵심 규칙은 간단합니다: 함수를 정의하는 방식은 함수를 호출하는 방식과 일치해야 합니다. 콜론으로 정의했다면, 콜론으로 호출하세요. 점(dot)과 명시적인 self를 사용하여 정의했다면, 점으로 호출하고 테이블을 전달하세요.
서로 맞지 않게 사용하면 다음과 같은 일이 발생합니다:
local game = { score = 0 }
function game:addPoints(points)
self.score = self.score + points
end
-- 잘못됨: 점(.)으로 호출했지만 테이블이 전달되지 않음
game.addPoints(10) -- 오류! self는 이제 테이블이 아니라 10입니다game.addPoints(10)를 호출할 때, Lua는 자동으로 game을 전달하지 않습니다. 값 10이 self가 되어, 예상치 못한 동작이나 오류를 발생시킵니다.
반대의 실수 또한 문제를 일으킵니다:
function game.reset(self)
self.score = 0
end
-- 틀림: 콜론으로 호출하면 game이 두 번 전달됩니다
game:reset() -- self는 game을 받지만, 추가적인 nil 인자도 예상됩니다이 특정한 사례가 작동할 수도 있지만, 혼란을 야기하고 특정 인수를 기대하는 함수를 망가뜨릴 수 있습니다. 가장 안전한 방법은 일관성을 유지하는 것입니다. 함수에 self가 필요한 경우에는 정의와 호출 모두에 콜론(:)을 사용하고, 그렇지 않은 경우에는 마침표(.)를 사용하세요.
챌린지
쉬움score 필드가 0으로 초기화된 player라는 이름의 테이블을 생성하세요.
테이블에 두 개의 함수를 추가하세요:
player.setScore(self, value)- 점(dot) 구문과 명시적인self매개변수를 사용하여 정의합니다.self.score를 주어진 값으로 설정합니다.player:addBonus(amount)- 콜론(colon) 구문을 사용하여 정의합니다.self.score에amount를 더합니다.
두 개의 입력을 받게 됩니다:
- 초기 점수 값
- 추가할 보너스 금액
다음 단계를 수행하세요:
- 초기 점수를 설정하기 위해 점(dot) 구문을 사용하여
setScore를 호출합니다 (테이블을 첫 번째 인자로 전달). - 보너스를 추가하기 위해 콜론(colon) 구문을 사용하여
addBonus를 호출합니다. player.score의 최종 값을 출력합니다.
주의: 각 함수를 호출할 때는 정의된 방식에 맞춰서 호출해야 합니다.
치트 시트
Lua에서 메서드를 정의하고 호출할 때, 구문이 반드시 일치해야 합니다:
- 콜론(
:)으로 정의했다면, 콜론으로 호출하세요. - 점(
.)과 명시적인self를 사용하여 정의했다면, 점으로 호출하고 테이블을 전달하세요.
잘못된 사용 - 콜론으로 정의하고 점으로 호출하는 경우:
function game:addPoints(points)
self.score = self.score + points
end
game.addPoints(10) -- 오류! self는 테이블이 아니라 10이 됩니다.잘못된 사용 - 점으로 정의하고 콜론으로 호출하는 경우:
function game.reset(self)
self.score = 0
end
game:reset() -- 혼란스러움: game을 자동으로 전달하지만 문제를 일으킬 수 있습니다.올바른 사용 - 구문 일치:
-- 콜론으로 정의, 콜론으로 호출
function game:addPoints(points)
self.score = self.score + points
end
game:addPoints(10)
-- 점으로 정의, 점으로 호출
function game.reset(self)
self.score = 0
end
game.reset(game)직접 해보기
-- 입력 읽기
local initialScore = tonumber(io.read())
local bonusAmount = tonumber(io.read())
-- TODO: 아래에 코드를 작성하세요
-- 1. 'score' 필드가 0으로 초기화된 'player'라는 이름의 테이블을 생성하세요
-- 2. 명시적 self와 함께 점(.) 구문을 사용하여 player.setScore(self, value)를 추가하세요
-- 3. 콜론(:) 구문을 사용하여 player:addBonus(amount)를 추가하세요
-- 4. 점(.) 구문을 사용하여 setScore를 호출하세요 (테이블을 첫 번째 인자로 전달)
-- 5. 콜론(:) 구문을 사용하여 addBonus를 호출하세요
-- 최종 점수 출력
print(player.score)이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.