셰이프 vs. 느슨한 테이블
Coddy Lua 여정의 Luau 소개 섹션에 포함된 레슨. 80개 중 42번째.
이제 레코드 테이블을 다루는 두 가지 방법이 있습니다. Lua에서 늘 사용해 온 느슨한 방식과 선언된 형태입니다. 각각 어떤 이점이 있는지 잠시 살펴보겠습니다.
느슨한 테이블에는 무엇이든 넣을 수 있습니다. 하지만 그 유연성에는 대가가 따릅니다. 필드 이름을 잘못 입력하면(user.nmae) 조용히 nil을 얻고, 필드를 빠뜨리면 그 구멍에 가장 먼저 닿는 코드가 실행될 때 런타임에 한참 뒤에서 버그가 드러납니다.
local user = {name = "Ana", age = 20}
print(user.nmae) -- 느슨한 테이블: 아무 경고 없이 nil을 출력함형태를 선언하면 이런 실수는 런타임이 아니라 편집 시점에 발견됩니다. 잘못 입력한 순간 검사기가 오류를 표시하고, 편집기에서 필드 이름을 자동 완성할 수 있으며, type 선언은 테이블에 무엇이 들어 있는지 설명하는 문서 역할도 합니다.
type User = {name: string, age: number}
local user: User = {name = "Ana", age = 20}
print(user.nmae) -- ✗ 타입 오류: User에서 키 'nmae'을 찾을 수 없음TypeScript를 사용해 봤다면, Luau에는 interface 키워드가 없다는 점에 유의하세요. 모든 형태를 type으로 처리합니다. 또한 "선언 병합"도 없습니다. 같은 범위에서 같은 이름으로 두 타입을 선언하면 오류가 발생하므로, 각 형태는 정확히 하나의 정의만 가집니다.
Luau의 형태는 구조적입니다. 올바른 타입의 필드를 갖춘 테이블이라면 어디서 어떻게 만들어졌는지와 관계없이 일치합니다. 느슨한 테이블도 여전히 쓸모가 있습니다. 간단한 스크립트와 정말 동적인 데이터에는 선언된 형태가 필요하지 않습니다. 하지만 함수 사이에서 전달되는 데이터라면 형태를 선언해 두는 것이 실수가 큰 비용이 들기 전에 잡아 줍니다.
챌린지
쉬움형식이 선언되지 않은 테이블을 형식이 선언된 테이블로 바꾸세요.
- 테이블 위에
type Pet = {name: string, age: number}을 작성하세요. - 테이블에 형식을 지정하세요:
local pet: Pet = {name = "Biscuit", age = 3}. - 첫 번째 출력문 아래에
print(pet.age)를 추가하세요.
코드 실행을 누르세요. 출력에 Biscuit과 3이 표시됩니다.
직접 해보기
-- 제약이 느슨한 테이블: 필드를 검사하는 것이 없습니다
local pet = {name = "Biscuit", age = 3}
print(pet.name)
Luau 소개의 모든 레슨
4함수 다루기
매개변수와 반환값의 타입 지정익명 함수의 타입 지정아무것도 반환하지 않는 함수선택적 매개변수기본 매개변수 값불리언 기본값가변 인자 함수함수 타입 정의하기복습: 타입이 지정된 함수3타입이 지정된 테이블: 배열과 맵
타입이 지정된 배열요소 추가 및 읽기맵 타입이란?맵 선언 및 접근테이블 순회하기혼합 형태의 테이블그리드 읽기그리드 만들기table.unpack복습: 배열과 맵6테이블 셰이프 타입 지정
인라인 셰이프 어노테이션셰이프를 위한 타입 별칭선택적 속성셰이프 vs. 느슨한 테이블셰이프 확장하기셰이프에 메서드 추가하기Self와 콜론 메서드요약: 테이블 셰이프 정의하기직접 연습해 보세요: 온라인 Luau 컴파일러