Menu
Coddy logo textTech

도형 컬렉션

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

challenge icon

챌린지

쉬움

이제 완전한 기능을 갖춘 Rectangle 및 Circle 클래스를 모두 갖추었으므로, 여러 도형을 함께 관리할 수 있는 ShapeCollection 클래스를 만들어 보겠습니다. 이것은 구성(composition)의 훌륭한 예입니다. 컬렉션은 도형이 "되는" 것이 아니라 도형을 "가지는" 것입니다.

성장하는 프로젝트에 새 파일을 추가하게 됩니다:

  • Shape.lua: 기본 Shape 클래스 (변경 없음).
  • Rectangle.lua: :getArea():getPerimeter() 메서드가 포함된 Rectangle 클래스.
  • Circle.lua: :getArea():getPerimeter() 메서드가 포함된 Circle 클래스.
  • ShapeCollection.lua: 도형을 내부적으로 저장하는 새 클래스를 만듭니다. 빈 도형 리스트를 초기화하는 :new() 생성자, 컬렉션에 도형을 추가하는 :addShape(shape) 메서드, 그리고 현재 저장된 도형의 개수를 반환하는 :count() 메서드를 포함하세요.
  • main.lua: 모듈을 require하여 모든 것을 하나로 합칩니다. 입력에서 치수를 읽고, Rectangle과 Circle을 생성하여 둘 다 ShapeCollection에 추가한 다음, 컬렉션의 개수와 각 도형의 이름(추가된 순서대로)을 출력합니다.

ShapeCollection은 사각형을 저장하는지 원을 저장하는지 알 필요가 없습니다. 그저 도형을 보관할 뿐입니다. 이는 다형성(polymorphism)을 통해 공통 인터페이스를 사용하여 서로 다른 객체 유형을 균일하게 처리하는 방법을 보여줍니다.

입력: 세 줄 — 너비(숫자), 높이(숫자), 그리고 반지름(숫자).

출력: 세 줄 — 컬렉션에 있는 도형의 개수, 첫 번째로 추가된 도형의 이름, 그리고 두 번째로 추가된 도형의 이름.

직접 해보기

-- Rectangle 모듈을 불러옵니다
local Rectangle = require('Rectangle')

-- Circle 모듈을 불러옵니다
local Circle = require('Circle')

-- ShapeCollection 모듈을 불러옵니다
local ShapeCollection = require('ShapeCollection')

-- 입력으로부터 너비와 높이를 읽어옵니다
local width = tonumber(io.read())
local height = tonumber(io.read())
local radius = tonumber(io.read())

-- 주어진 치수로 새로운 Rectangle 인스턴스를 생성합니다
local rect = Rectangle:new(width, height)

-- 주어진 반지름으로 새로운 Circle 인스턴스를 생성합니다
local circ = Circle:new(radius)

-- 새로운 ShapeCollection을 생성합니다
local collection = ShapeCollection:new()

-- 두 도형을 컬렉션에 추가합니다
collection:addShape(rect)
collection:addShape(circ)

-- 컬렉션에 있는 도형의 개수를 출력합니다
print(collection:count())

-- 추가된 순서대로 각 도형의 이름을 출력합니다
for i = 1, collection:count() do
    print(collection.shapes[i]:getName())
end

Object Oriented Programming의 모든 레슨