구조체
구조체 (Structures)
구조체 타입이 무엇인지는 The Racket Guide의 프로그래머가 정의하는 데이터 타입(Programmer-Defined Datatypes) 장에서 struct를 통해 소개하고 있어요. 이 장에서는 구조체 타입의 의미와 동작을 자세히 다뤄요.
출처: Racket Reference
본문
구조체 타입(structure type)은 여러 개의 필드(field)를 묶는 레코드 데이터 타입이에요. 구조체(structure)는 구조체 타입의 인스턴스로, 그 구조체 타입의 각 필드마다 하나씩 값을 담는 일급(first-class) 값이에요. 구조체 인스턴스는 타입에 특화된 생성자(constructor) 프로시저로 만들고, 필드 값은 타입에 특화된 접근자(accessor)와 변경자(mutator) 프로시저로 읽고 바꿔요. 또한 각 구조체 타입은 술어(predicate) 프로시저를 가지는데, 이는 그 구조체 타입의 인스턴스에 대해 #t를, 그 외의 모든 값에 대해 #f를 반환해요.
구조체 타입의 필드는 본질적으로 이름이 없지만, 오류 보고를 위한 이름은 지원해요. 생성자 프로시저는 구조체 타입의 각 필드마다 하나씩 값을 받는데, 일부 필드는 자동 필드(automatic field)가 될 수 있어요. 자동 필드는 구조체 타입에 연결된 상수로 초기화되며, 해당 인자는 생성자 프로시저에서 생략돼요. 구조체 타입의 모든 자동 필드는 비자동 필드 뒤에 와요.
구조체 타입은 기존의 기본 구조체 타입(base structure type)의 구조체 하위 타입(subtype)으로 만들 수 있어요. 구조체 하위 타입의 인스턴스는 항상 기본 구조체 타입의 인스턴스로도 사용할 수 있지만, 하위 타입은 자신만의 술어 프로시저를 가지며 기본 타입의 필드 외에 자신만의 필드를 더 가질 수 있어요.
구조체 하위 타입은 기본 타입의 필드를 "상속"해요. 기본 타입에 m개의 필드가 있고, 새 구조체 하위 타입에 n개의 필드가 지정되면, 결과 구조체 타입은 m+n개의 필드를 가져요. 자동 필드의 값은 하위 타입에서 기본 타입과 다를 수 있어요.
원래 m개 필드 중 m′개가 비자동이고(m′<m), 새 필드 중 n′개가 비자동이라면(n′<n), 하위 타입의 생성자 프로시저에 m′+n′개의 필드 값을 제공해야 해요. 하위 타입 인스턴스의 처음 m개 필드 값은 원래 기본 타입(또는 그 상위 타입)의 선택자 프로시저로 접근하고, 마지막 n개는 하위 타입에 특화된 선택자로 접근해요. 처음 m개 필드에 대한 하위 타입 특화 접근자와 변경자는 존재하지 않아요.
struct 형식과 make-struct-type 프로시저는 보통 새 구조체 타입을 만들지만, 전역적으로 공유되고 인스턴스를 기본 리더(The Reader 참고)와 프린터(The Printer 참고)가 읽고 쓸 수 있는 prefab(즉, 미리 만들어진) 구조체 타입에 접근할 수도 있어요. Prefab 구조체 타입은 다른 prefab 구조체 타입에서만 상속할 수 있고, 가드(구조체 타입 만들기 참고)나 속성(구조체 타입 속성 참고)을 가질 수 없어요. 이름, 상위 타입, 필드 수, 자동 필드 수, 자동 필드 값(자동 필드가 하나 이상일 때), 그리고 필드 가변성 각각의 조합마다 정확히 하나의 prefab 구조체 타입이 존재해요.
직렬화(Serialization) 문서에도 구조체를 읽고 쓰는 방법에 대한 정보가 있어요.
두 구조체 값이 eqv?인 것은 오직 그 둘이 eq?일 때뿐이에요. 두 구조체 값은 eq?이면 equal?이에요. 기본적으로 두 구조체 값은, 같은 구조체 타입의 인스턴스이고 어떤 필드도 불투명(opaque)하지 않으며, 두 구조체에 struct->vector를 적용한 결과가 equal?이라면, 역시 equal?이 돼요. (그러므로 구조체에 대한 equal? 판정은 현재 코드 검사자에 의존할 수 있어요.) 구조체 타입은 gen:equal+hash 또는 gen:equal-mode+hash 제네릭 인터페이스를 통해 기본 equal? 정의를 재정의할 수 있어요.
이 장의 하위 섹션:
- 5.1 구조체 타입 정의: struct
- 5.2 구조체 타입 만들기
- 5.3 구조체 타입 속성
- 5.4 제네릭 인터페이스
- 5.5 구조체 복사와 갱신
- 5.6 구조체 유틸리티
- 5.7 구조체 타입 변환기 바인딩
더 알아보기
- The Racket Guide의 프로그래머가 정의하는 데이터 타입 장
- 직렬화(Serialization)