점(.) 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:reset()은 game.reset(game)과 동일합니다
game:reset() -- self가 game을 올바르게 전달받으므로 정상적으로 작동합니다이 특정 사례가 작동할 수도 있지만, 혼란을 야기하고 특정 인수를 기대하는 함수를 망가뜨릴 수 있습니다. 가장 안전한 방법은 일관성을 유지하는 것입니다. 함수에 self가 필요한 경우 정의와 호출 모두에 콜론(:)을 사용하고, 그렇지 않은 경우에는 마침표(.)를 사용하세요.
챌린지
쉬움score 필드가 0으로 초기화된 player라는 이름의 테이블을 생성하세요.
테이블에 두 개의 함수를 추가하세요:
player.setScore(self, value)- 점 구문(dot syntax)과 명시적인self매개변수를 사용하여 정의합니다.self.score를 주어진 값으로 설정합니다.player:addBonus(amount)- 콜론 구문(colon syntax)을 사용하여 정의합니다.self.score에amount를 더합니다.
두 개의 입력을 받게 됩니다:
- 초기 점수 값
- 추가할 보너스 금액
다음 단계를 수행하세요:
- 점 구문(dot syntax)을 사용하여
setScore를 호출(테이블을 첫 번째 인자로 전달)하여 초기 점수를 설정합니다. - 콜론 구문(colon syntax)을 사용하여
addBonus를 호출하여 보너스를 추가합니다. player.score의 최종 값을 출력합니다.
주의: 각 함수를 호출할 때는 정의된 방식에 맞춰서 호출해야 합니다.
직접 해보기
-- 입력 읽기
local initialScore = tonumber(io.read())
local bonusAmount = tonumber(io.read())
-- TODO: 아래에 코드를 작성하세요
-- 1. 'score' 필드가 0으로 초기화된 'player'라는 이름의 테이블을 생성합니다
-- 2. 명시적인 self와 함께 점(dot) 구문을 사용하여 player.setScore(self, value)를 추가합니다
-- 3. 콜론(colon) 구문을 사용하여 player:addBonus(amount)를 추가합니다
-- 4. 점(dot) 구문을 사용하여 setScore를 호출합니다 (테이블을 첫 번째 인자로 전달)
-- 5. 콜론(colon) 구문을 사용하여 addBonus를 호출합니다
-- 최종 점수 출력
print(player.score)이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.