Menu
Coddy logo textTech

계산된 속성

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

Getter와 setter는 저장된 값에 접근할 수 있게 해 주지만, 때로는 저장된 필드로 존재하지 않는 데이터가 필요합니다. 이 데이터는 다른 속성에서 계산되어야 합니다. 이러한 것을 계산된 속성이라고 합니다.

직사각형을 생각해 보세요. 너비와 높이는 저장하지만, 넓이는 어디에도 저장하지 않습니다. 넓이는 이 두 값을 곱해서 계산하기 때문입니다. 중복된 데이터를 저장하는 대신, 결과를 계산하여 반환하는 메서드를 만듭니다.

local Rectangle = {}
Rectangle.__index = Rectangle

function Rectangle:new(width, height)
    local instance = {}
    setmetatable(instance, self)
    instance.width = width
    instance.height = height
    return instance
end

function Rectangle:getArea()
    return self.width * self.height
end

:getArea() 메서드는 저장된 값을 반환하지 않습니다. 호출할 때마다 area를 새로 계산합니다. 이 접근 방식에는 중요한 장점이 있습니다. width 또는 height가 변경되면 아무것도 업데이트하지 않아도 area가 새로운 dimensions를 자동으로 반영합니다.

local box = Rectangle:new(5, 3)
print(box:getArea())  -- 출력: 15

box.width = 10
print(box:getArea())  -- 출력: 30

계산된 속성은 객체의 일관성을 유지합니다. 다른 필드에 의존하는 값을 저장하여 값이 오래된 상태가 될 위험을 감수하는 대신, 필요할 때 계산합니다. 이 패턴은 둘레, 평균, 형식이 지정된 문자열 또는 기존 속성에서 결정할 수 있는 모든 값과 같은 파생 데이터에 적용됩니다.

challenge icon

챌린지

쉬움

필요할 때마다 volume을 계산하는 Box class를 만들어 봅시다! volume을 필드로 저장하는 대신, 필요할 때마다 box의 dimensions에서 계산하는 calculated property를 만들 것입니다.

코드를 두 개의 파일로 구성합니다:

  • Box.lua: 표준 prototype pattern을 사용하여 Box class를 정의합니다. 각 box는 세 가지 dimensions인 width, height, depth를 저장합니다. 다음을 포함하세요:
    • 세 가지 dimensions를 모두 저장하는 :new(width, height, depth) Constructor
    • volume(width × height × depth)을 계산하고 반환하는 :getVolume() method
    • 전체 surface area를 계산하고 반환하는 :getSurfaceArea() method
  • main.lua: Box module을 Require하고, box instance를 만들고, calculated properties가 현재 dimensions를 자동으로 반영하는 방식을 보여 줍니다.

box의 surface area는 다음과 같이 계산합니다: 2 × (width×height + height×depth + width×depth)

box의 dimensions를 나타내는 세 개의 입력을 받습니다:

  1. width
  2. height
  3. depth

main 파일에서 given dimensions로 box를 만든 다음, 다음 두 줄을 Print합니다:

  1. :getVolume()을 using한 volume
  2. :getSurfaceArea()를 using한 surface area

예를 들어 입력이 3, 4, 5라면 Output은 다음과 같아야 합니다:

60
94

calculated properties의 장점은 항상 정확한 상태를 유지한다는 것입니다. 나중에 box의 dimensions 중 하나를 변경하더라도 :getVolume()을 다시 호출하면 수동 업데이트 없이 자동으로 올바른 새 값을 return합니다!

직접 해보기

-- Box 모듈 불러오기
local Box = require('Box')

-- 입력 치수 읽기
local width = tonumber(io.read())
local height = tonumber(io.read())
local depth = tonumber(io.read())

-- TODO: 주어진 치수로 box 인스턴스 생성

-- TODO: :getVolume()을 사용하여 부피 출력

-- TODO: :getSurfaceArea()을 사용하여 표면적 출력
quiz icon실력 점검

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

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

직접 연습해 보세요: 온라인 Lua 컴파일러