명명 규칙
Coddy Lua 여정의 객체 지향 프로그래밍 (Object Oriented Programming) 섹션에 포함된 레슨. 70개 중 43번째.
Lua에서는 기본적으로 모든 테이블 필드에 공개적으로 접근할 수 있습니다. 누구나 self.health를 직접 읽거나 수정할 수 있습니다. Lua는 프라이버시를 강제하지 않지만, 프로그래머는 명명 규칙을 사용하여 의도를 전달합니다. 즉, 어떤 필드를 내부 구현 세부 사항으로 취급해야 하는지 나타냅니다.
일반적인 관례는 private 필드 앞에 밑줄을 붙이는 것입니다.
local Player = {}
Player.__index = Player
function Player:new(name)
local obj = {
name = name, -- 공개: 직접 접근해도 괜찮음
_health = 100, -- 비공개: 대신 메서드를 사용하세요
_score = 0 -- 비공개: 내부 추적용
}
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는 여전히 기술적으로 접근할 수 있습니다. 하지만 이는 다른 프로그래머와 미래의 자신에게 다음과 같은 명확한 경고 역할을 합니다. "이 field는 private로 사용하기 위한 것입니다. 대신 methods를 통해 접근하세요."
이 규칙은 인터페이스(다른 코드에서 사용해야 하는 것)와 구현(내부적으로 작동하는 방식)을 분리하기 때문에 중요합니다. 나중에 유효성 검사를 추가하거나 체력 저장 방식을 변경해야 한다면, 메서드만 수정하면 됩니다. :getHealth()를 사용하는 코드는 변경 없이 계속 작동합니다.
챌린지
쉬움BankAccount 클래스를 만들어 밑줄 명명 규칙을 사용해 어떤 field가 private인지 올바르게 나타내 봅시다!
코드를 두 개의 파일로 나누어 작성합니다:
BankAccount.lua: account 정보를 관리하는 클래스를 만듭니다. Constructor:new(ownerName, initialBalance)는 owner의 이름을 public field(owner)로, balance를 private field(_balance)로 저장해야 합니다. 다음 세 가지 methods를 포함하세요::getBalance(): current balance를 반환합니다:deposit(amount):_balance에 amount를 더합니다:getOwner(): owner의 이름을 반환합니다
main.lua: BankAccount module을 Require하고, input에서 owner의 이름, initial balance, deposit amount를 읽습니다. account를 만들고, deposit을 수행한 다음 owner와 final balance를 print합니다.
세 개의 inputs를 받습니다:
- owner의 이름
- initial balance(number)
- deposit amount(number)
output은 deposit 후 owner와 final balance를 보여 주는 두 줄이어야 합니다:
Owner: {ownerName}
Balance: {finalBalance}예를 들어 inputs가 Maria, 500, 150이면 output은 다음과 같아야 합니다:
Owner: Maria
Balance: 650기억하세요. _balance 앞의 밑줄은 이 field가 다른 programmers에게 :getBalance() 및 :deposit()와 같은 methods를 통해 access되어야 하며, directly access해서는 안 된다는 것을 나타냅니다. 밑줄이 없는 owner field는 public하게 access해도 괜찮다는 것을 나타냅니다.
직접 해보기
-- 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}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍 (Object Oriented Programming)의 모든 레슨
직접 연습해 보세요: 온라인 Lua 컴파일러