Menu
Coddy logo textTech

계산된 속성

Coddy Lua 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 70개 중 15번째.

게터(Getters)와 세터(Setters)는 저장된 값에 대한 접근을 제공하지만, 때로는 저장된 필드로 존재하지 않는 데이터가 필요할 때가 있습니다. 즉, 다른 속성들로부터 계산되어야 하는 데이터입니다. 이러한 것들을 계산된 속성(calculated properties)이라고 부릅니다.

사각형을 생각해 봅시다. 너비와 높이를 저장하지만, 넓이는 어디에도 저장되지 않습니다. 이 두 값을 곱하여 계산됩니다. 중복된 데이터를 저장하는 대신, 결과를 계산하고 반환하는 메서드를 만듭니다:

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() 메서드는 저장된 값을 반환하지 않고, 호출할 때마다 면적을 새로 계산합니다. 이 방식에는 중요한 장점이 있습니다. 너비(width)나 높이(height)가 변경되면, 별도로 업데이트할 필요 없이 면적이 자동으로 새로운 치수를 반영합니다.

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

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

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

challenge icon

챌린지

쉬움

필요할 때마다 부피를 계산하는 Box 클래스를 만들어 봅시다! 부피를 필드로 저장하는 대신, 필요할 때마다 상자의 치수를 사용하여 계산하는 계산된 속성(calculated property)을 만들 것입니다.

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

  • Box.lua: 표준 프로토타입 패턴을 사용하여 Box 클래스를 정의합니다. 각 상자는 width, height, depth 세 가지 치수를 저장합니다. 다음을 포함하세요:
    • 세 가지 치수를 모두 저장하는 :new(width, height, depth) 생성자
    • 부피(width × height × depth)를 계산하여 반환하는 :getVolume() 메서드
    • 전체 겉넓이를 계산하여 반환하는 :getSurfaceArea() 메서드
  • main.lua: Box 모듈을 불러오고(require), 상자 인스턴스를 생성한 다음, 계산된 속성이 현재 치수를 어떻게 자동으로 반영하는지 보여줍니다.

상자의 겉넓이는 다음과 같이 계산됩니다: 2 × (width×height + height×depth + width×depth)

상자의 치수를 나타내는 세 개의 입력을 받게 됩니다:

  1. 너비 (Width)
  2. 높이 (Height)
  3. 깊이 (Depth)

메인 파일에서 주어진 치수로 상자를 생성한 후, 다음 두 줄을 출력하세요:

  1. :getVolume()을 사용한 부피
  2. :getSurfaceArea()를 사용한 겉넓이

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

60
94

계산된 속성의 장점은 항상 정확성을 유지한다는 것입니다. 나중에 상자의 치수 중 하나를 변경하더라도, :getVolume()을 다시 호출하면 수동 업데이트 없이도 자동으로 올바른 새 값을 반환합니다!

치트 시트

계산된 속성(Calculated properties)은 값을 직접 저장하는 대신 다른 속성을 기반으로 값을 계산하고 반환하는 메서드입니다. 이는 데이터 일관성을 보장하고 중복을 제거합니다.

면적을 구하기 위한 계산된 속성의 예시입니다:

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() 메서드는 호출될 때마다 면적을 계산하며, 너비(width)나 높이(height)의 변경 사항을 자동으로 반영합니다:

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

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

계산된 속성은 둘레, 부피, 평균 또는 기존 속성에서 결정될 수 있는 형식화된 문자열과 같은 모든 파생 데이터에 유용합니다.

직접 해보기

-- 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의 모든 레슨