**Struct**는 몇 개의 속성을 묶는 단순한 클래스를 빠르게 생성하기 위한 Ruby 내장 클래스입니다 — 생성자, 접근자, 동등성 등을 자동으로 생성합니다. 전체 클래스를 작성하지 않고 경량 데이터 클래스를 정의하는 간결한 방법입니다.
Struct가 해결하는 문제
,
()
= x
= y
()
x == other.x && y == other.y
= .new(, )
Struct.new(:x, :y)는 생성자, x와 y에 대한 attr_accessor, 값 기반 동등성, to_s 등을 가진 클래스를 생성하여 — 단순 데이터 클래스의 상용구를 없앱니다.
Point = Struct.new(:x, :y)
p = Point.new(1, 2)
p.x # 1 — 접근자 생성됨
p.y = 5 # setter 생성됨
p == Point.new(1, 5) # true — 값 기반 동등성 (생성됨)
p.to_a # [1, 5] — 변환 가능
# Struct는 메서드도 가질 수 있음
Point = Struct.new(:x, :y) do
def distance_from_origin
Math.sqrt(x**2 + y**2)
end
end
Point.new(3, 4).distance_from_origin # 5.0
Struct는 접근자와 값 기반 동등성(속성이 같은 두 struct는 동등 — 데이터 객체에 편리)을 제공하며, block에서 커스텀 메서드를 추가할 수 있습니다.
# 키워드 인자 (많은 필드에 더 명확)
Point = Struct.new(:x, :y, keyword_init: true)
Point.new(x: 1, y: 2)
# Data (Ruby 3.2+) — Struct의 불변 대안 (값 객체용)
Point = Data.define(:x, :y)
p = Point.new(1, 2)
p.x # 1 (읽기 전용 — 불변)
p2 = p.with(x: 5) # 변경과 함께 비파괴적 복사
Ruby 3.2의 **Data**는 Struct의 불변 변형입니다 — 변하면 안 되는 값 객체에 이상적입니다.
Struct는 상용구 없이 단순 데이터 클래스를 빠르게 생성하는 유용한 Ruby 기능이므로, 이를 이해하는 것은 간결하고 깔끔한 Ruby를 작성하는 데 귀중합니다.
핵심 이점은 단순 데이터 보유 클래스가 요구하는 반복적인 코드를 없애는 것입니다 — 생성자, attr_accessor, 동등성을 가진 전체 클래스를 작성하는 대신, Struct.new(:x, :y)가 값 기반 동등성(속성이 같은 두 struct는 동등하며, 이는 데이터 객체에 원하는 것이고 일반 클래스의 참조 동등성과 다름)을 포함해 이 모든 것을 한 줄로 생성합니다.
이는 Struct를 경량 자료 구조, 값 객체, 메서드에서 묶인 값 반환, 그리고 전체 클래스가 과한 단순 레코드에 이상적으로 만듭니다 — 코드를 간결하게 유지하는 실용적인 생산성 도구입니다.
Struct(생성된 접근자와 값 동등성을 가진 간결한 데이터 클래스, 커스텀 메서드 추가 능력), 키워드 초기화 struct(많은 필드에 더 명확), 그리고 현대 Data 클래스(Ruby 3.2의 변하면 안 되는 값 객체를 위한 불변 대안)를 이해하는 것은 단순 데이터를 우아하게 모델링하는 데 귀중한 지식입니다.
작은 데이터 클래스를 정의하는 것은 흔한 요구이고, Struct(와 Data)가 유용한 생성 동작(특히 값 동등성)과 함께 이를 간결하고 관용적으로 수행하는 방법을 제공하므로, 전체 클래스 대 Struct/Data를 언제 선택할지 아는 것은 깔끔하고 간결한 코드 작성을 반영하는 실용적으로 관련되는 Ruby 지식입니다 — 관련 속성을 경량 타입으로 묶는 빈번한 작업을 위한 Ruby 개발자 도구 모음의 유용한 도구이자, 간결함과 상용구 감소에 대한 Ruby의 강조를 구현합니다.