점(.) vs 콜론(:)
Coddy Lua 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 70개 중 4번째.
이제 점 표기법과 콜론 표기법을 모두 알았으니, 두 표기법이 어떻게 관련되는지, 그리고 테이블이 전달되지 않으면 무엇이 잘못되는지 살펴보겠습니다.
두 콜론은 모두 축약형입니다. function game:addPoints(points)를 정의하는 것은 function game.addPoints(self, points)를 정의하는 것과 같고, game:addPoints(10)을 호출하는 것은 game.addPoints(game, 10)을 호출하는 것과 같습니다. 테이블이 첫 번째 인수로 전달되기만 하면 메서드가 작동합니다.
테이블이 전달되지 않으면 다음과 같이 됩니다:
local game = { score = 0 }
function game:addPoints(points)
self.score = self.score + points
end
-- 잘못됨: 점으로 호출했지만 table을 전달하지 않음
game.addPoints(10) -- 오류! self는 이제 table이 아니라 10임game.addPoints(10)을 호출하면 Lua는 game을 자동으로 전달하지 않습니다. 값 10은 self가 되고, 10은 테이블이 아니라 숫자이므로 self.score는 실패합니다.
점과 명시적인 self로 정의된 함수는 콜론 호출과 함께 작동합니다. 콜론 호출은 테이블을 첫 번째 인수로 전달하기 때문입니다.
function game.reset(self)
self.score = 0
end
-- 콜론으로 호출하기: game:reset()은 game.reset(game)와 같습니다
game:reset() -- self가 game을 올바르게 전달받으므로 정상적으로 작동합니다두 정의는 같은 함수를 만들므로, 선택은 관례에 따릅니다. self를 사용하는 함수는 콜론으로 정의하고 호출하며, self를 사용하지 않는 함수는 점으로 정의하고 호출하세요. 그러면 각 호출에서 테이블이 전달되는지 알 수 있습니다.
챌린지
쉬움0으로 초기화된 score 필드가 있는 player라는 테이블을 만드세요.
테이블에 다음 두 함수를 추가하세요.
player.setScore(self, value)- 명시적인self매개변수를 사용해 점 표기법으로 정의합니다.self.score를 주어진 값으로 설정합니다.player:addBonus(amount)- 콜론 표기법으로 정의합니다.amount를self.score에 더합니다.
다음 두 입력값이 주어집니다.
- 초기 점수 값
- 더할 보너스 양
다음 단계를 수행하세요.
- 점 표기법을 사용해
setScore를 호출하여(테이블을 첫 번째 인수로 전달) 초기 점수를 설정합니다. - 콜론 표기법을 사용해
addBonus를 호출하여 보너스를 더합니다. player.score의 최종 값을 출력합니다.
기억하세요. 각 함수를 정의한 방식에 맞춰 호출하세요.
직접 해보기
-- 입력을 읽습니다
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)이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러