명명 규칙
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()를 사용하는 코드는 변경 없이 계속 작동합니다.
챌린지
쉬움언더스코어(_) 명명 규칙을 사용하여 어떤 필드가 프라이빗(private)으로 의도되었는지 적절하게 신호를 보내는 BankAccount 클래스를 만들어 봅시다!
코드는 두 개의 파일로 구성됩니다:
BankAccount.lua: 계좌 정보를 관리하는 클래스를 생성합니다. 생성자:new(ownerName, initialBalance)는 소유자의 이름을 퍼블릭(public) 필드(owner)로 저장하고, 잔액을 프라이빗 필드(_balance)로 저장해야 합니다. 다음 세 가지 메서드를 포함하세요::getBalance()— 현재 잔액을 반환합니다.:deposit(amount)—_balance에 금액을 추가합니다.:getOwner()— 소유자의 이름을 반환합니다.
main.lua: BankAccount 모듈을 불러오고(require), 입력으로부터 소유자 이름, 초기 잔액, 입금액을 읽습니다. 계좌를 생성하고, 입금을 진행한 후, 소유자와 최종 잔액을 출력합니다.
세 가지 입력을 받게 됩니다:
- 소유자 이름
- 초기 잔액 (숫자)
- 입금액 (숫자)
출력은 입금 후의 소유자와 최종 잔액을 보여주는 두 줄이어야 합니다:
Owner: {ownerName}
Balance: {finalBalance}예를 들어, 입력이 Maria, 500, 150이라면 출력은 다음과 같아야 합니다:
Owner: Maria
Balance: 650기억하세요: _balance의 언더스코어 접두사는 다른 프로그래머들에게 이 필드가 직접 액세스되지 않고 :getBalance() 및 :deposit()과 같은 메서드를 통해 액세스되어야 함을 알리는 신호입니다. 언더스코어가 없는 owner 필드는 공개적으로 액세스해도 괜찮음을 나타냅니다.
치트 시트
Lua에서 모든 테이블 필드는 기본적으로 공개적으로 접근 가능합니다. 어떤 필드가 내부 구현 세부 사항으로 취급되어야 하는지 알리기 위해, 프라이빗 필드 앞에 밑줄(_)을 붙이는 밑줄 명명 규칙(underscore naming convention)을 사용하세요.
밑줄이 프라이버시를 강제하는 것은 아닙니다. 이는 다른 프로그래머들에게 해당 필드에 직접 접근하는 대신 메서드를 통해 접근해야 한다는 신호를 주는 것입니다.
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이 규칙은 인터페이스(다른 사람들이 사용해야 하는 것)와 구현(내부적으로 작동하는 방식)을 분리하여, 변경이 필요할 때 코드를 더 유지보수하기 쉽게 만들어 줍니다.
직접 해보기
-- 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}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.