Menu
Coddy logo textTech

명명 규칙

Coddy Lua 여정의 객체 지향 프로그래밍 (Object Oriented Programming) 섹션에 포함된 레슨 — 70개 중 43번째.

Lua에서 모든 테이블 필드는 기본적으로 공개적으로 접근 가능합니다. 누구나 self.health를 직접 읽거나 수정할 수 있습니다. Lua는 프라이버시를 강제하지 않지만, 프로그래머들은 의도를 전달하기 위해 명명 규칙을 사용하여 어떤 필드가 내부 구현 세부 사항으로 취급되어야 하는지 신호를 보냅니다.

일반적인 관례는 프라이빗 필드 앞에 언더스코어(_)를 붙이는 것입니다:

local Player = {}
Player.__index = Player

function Player:new(name)
    local obj = {
        name = name,      -- Public: 직접 접근 가능
        _health = 100,    -- Private: 대신 메서드를 사용하세요
        _score = 0        -- Private: 내부 추적용
    }
    setmetatable(obj, Player)
    return obj
end

function Player:getHealth()
    return self._health
end

function Player:takeDamage(amount)
    self._health = self._health - amount
end

언더스코어(_)는 Lua가 작동하는 방식을 바꾸지 않습니다—player._health는 기술적으로 여전히 접근 가능합니다. 하지만, 이는 다른 프로그래머(그리고 미래의 자신)에게 다음과 같은 명확한 경고 역할을 합니다: "이 필드는 비공개(private)로 의도되었습니다. 대신 메서드를 통해 접근하세요."

이 관례는 인터페이스(다른 사람들이 사용해야 하는 것)와 구현(내부적으로 작동하는 방식)을 분리하기 때문에 중요합니다. 나중에 유효성 검사를 추가하거나 체력(health)이 저장되는 방식을 변경해야 하는 경우, 메서드만 수정하면 됩니다. :getHealth()를 사용하는 코드는 변경 없이 계속 작동합니다.

challenge icon

챌린지

쉬움

언더스코어(_) 명명 규칙을 사용하여 어떤 필드가 프라이빗(private)으로 의도되었는지 적절하게 신호를 보내는 BankAccount 클래스를 만들어 봅시다!

코드는 두 개의 파일로 구성됩니다:

  • BankAccount.lua: 계좌 정보를 관리하는 클래스를 생성합니다. 생성자 :new(ownerName, initialBalance)는 소유자의 이름을 퍼블릭(public) 필드(owner)로 저장하고, 잔액을 프라이빗 필드(_balance)로 저장해야 합니다. 다음 세 가지 메서드를 포함하세요:
    • :getBalance() — 현재 잔액을 반환합니다.
    • :deposit(amount)_balance에 금액을 추가합니다.
    • :getOwner() — 소유자의 이름을 반환합니다.
  • main.lua: BankAccount 모듈을 불러오고(require), 입력으로부터 소유자 이름, 초기 잔액, 입금액을 읽습니다. 계좌를 생성하고, 입금을 진행한 후, 소유자와 최종 잔액을 출력합니다.

세 가지 입력을 받게 됩니다:

  1. 소유자 이름
  2. 초기 잔액 (숫자)
  3. 입금액 (숫자)

출력은 입금 후의 소유자와 최종 잔액을 보여주는 두 줄이어야 합니다:

Owner: {ownerName}
Balance: {finalBalance}

예를 들어, 입력이 Maria, 500, 150이라면 출력은 다음과 같아야 합니다:

Owner: Maria
Balance: 650

기억하세요: _balance의 언더스코어 접두사는 다른 프로그래머들에게 이 필드가 직접 액세스되지 않고 :getBalance():deposit()과 같은 메서드를 통해 액세스되어야 함을 알리는 신호입니다. 언더스코어가 없는 owner 필드는 공개적으로 액세스해도 괜찮음을 나타냅니다.

직접 해보기

-- BankAccount 모듈 필요
local BankAccount = require('BankAccount')

-- 입력 읽기
local ownerName = io.read()
local initialBalance = tonumber(io.read())
local depositAmount = tonumber(io.read())

-- TODO: ownerName과 initialBalance를 사용하여 새로운 BankAccount 생성

-- TODO: depositAmount를 사용하여 입금 진행

-- TODO: 요구된 형식으로 소유자와 최종 잔액 출력
-- 형식:
-- Owner: {ownerName}
-- Balance: {finalBalance}
quiz icon실력 점검

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

객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨