Menu
Coddy logo textTech

점(.) 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을 전달하지 않습니다. 값 10self가 되어, 예상치 못한 동작이나 오류를 발생시킵니다.

반대의 실수 또한 문제를 일으킵니다:

function game.reset(self)
    self.score = 0
end

-- 틀림: 콜론으로 호출하면 game이 두 번 전달됩니다
game:reset()  -- self는 game을 받지만, 추가적인 nil 인자도 예상됩니다

이 특정한 사례가 작동할 수도 있지만, 혼란을 야기하고 특정 인수를 기대하는 함수를 망가뜨릴 수 있습니다. 가장 안전한 방법은 일관성을 유지하는 것입니다. 함수에 self가 필요한 경우에는 정의와 호출 모두에 콜론(:)을 사용하고, 그렇지 않은 경우에는 마침표(.)를 사용하세요.

challenge icon

챌린지

쉬움

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

테이블에 두 개의 함수를 추가하세요:

  1. player.setScore(self, value) - 점(dot) 구문과 명시적인 self 매개변수를 사용하여 정의합니다. self.score를 주어진 값으로 설정합니다.
  2. player:addBonus(amount) - 콜론(colon) 구문을 사용하여 정의합니다. self.scoreamount를 더합니다.

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

  1. 초기 점수 값
  2. 추가할 보너스 금액

다음 단계를 수행하세요:

  1. 초기 점수를 설정하기 위해 점(dot) 구문을 사용하여 setScore를 호출합니다 (테이블을 첫 번째 인자로 전달).
  2. 보너스를 추가하기 위해 콜론(colon) 구문을 사용하여 addBonus를 호출합니다.
  3. 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)
quiz icon실력 점검

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

Object Oriented Programming의 모든 레슨