셰이프 vs. 느슨한 테이블
Coddy Lua 여정의 Luau 소개 섹션에 포함된 레슨 — 73개 중 40번째.
이제 레코드 테이블을 작업하는 두 가지 방법이 있습니다. Lua에서 항상 사용해 온 loose 방식과 declared shapes입니다. 각 방식이 제공하는 이점을 잠시 살펴볼 가치가 있습니다.
loose 테이블은 모든 것을 허용합니다. 이러한 유연성에는 대가가 따릅니다. 필드 이름을 잘못 입력하면(user.nmae) silently nil을 얻게 되고, 필드를 누락하면 실행 시간(runtime) 동안 해당 빈 값을 처음 다루는 코드에서 훨씬 나중에 버그가 표면화됩니다.
local user = {name = "Ana", age = 20}
print(user.nmae) -- loose table: silently prints nil형태(shape)를 선언하면 이러한 실수가 실행 시간에서 편집 시간으로 이동합니다. 체커는 작성하는 즉시 오타를 표시하고, 에디터는 필드 이름을 자동 완성을 해줄 수 있으며, type 선언은 테이블에 포함된 내용의 문서 역할도 겸하게 됩니다.
type User = {name: string, age: number}
local user: User = {name = "Ana", age = 20}
print(user.nmae) -- ✗ type error: key 'nmae' not found in UserTypeScript에 익숙하시다면 Luau에는 interface 키워드가 없다는 점에 유의하세요. type이 모든 형태를 처리합니다. 또한 "선언 병합(declaration merging)"도 없습니다. 동일한 스코프에서 동일한 이름으로 두 타입을 선언하면 error가 발생하므로 각 형태는 정확히 하나의 정의만 갖습니다.
Luau의 형태는 구조적(structural)입니다. 어디서 어떻게 생성되었든 올바른 타입의 올바른 필드를 가진 모든 테이블은 일치합니다. 그리고 loose 테이블도 여전히 쓰임새가 있습니다. 간단한 스크립트나 진정한 동적 데이터에는 선언된 형태가 필요하지 않습니다. 하지만 함수 간에 전달되는 모든 항목의 경우 형태를 사용하면 적은 비용으로 실수를 잡아낼 수 있습니다.
직접 해보기
이 레슨에는 코드 챌린지가 없습니다.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
Luau 소개의 모든 레슨
7프로젝트: Typed Task Manager
프로젝트: 태스크 형태 정의하기태스크 추가 함수3타입이 지정된 테이블: 배열과 맵
타입이 지정된 배열요소 추가 및 읽기맵 타입이란?맵 선언 및 접근테이블 순회하기혼합 형태 테이블다차원 타입 배열table.unpack과 가변 인자요약: 배열과 맵6테이블 셰이프 타입 지정
인라인 셰이프 어노테이션셰이프를 위한 타입 별칭선택적 속성셰이프 vs. 느슨한 테이블셰이프 확장하기셰이프에 메서드 추가하기Self와 콜론 메서드요약: 테이블 셰이프 정의하기