๐งฉ 02. Interface vs Type: ์์๋ค ์ปค๋ฎค๋ํฐ ๋ฐ์ดํฐ ์ค๊ณ์ ๋๋ ๋ง
๐ ๊ฐ์
๊ฐ์ฒด ํ์ฅ์ ๋ ๊ฐ์ง ๋ฐฉ์: Declaration Merging๊ณผ Intersection์ ์ฐจ์ด์ ์๋ฒฝ ๋น๊ต
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 10๋ถ(์ ์ฒด) / ํต์ฌ ํํธ๋ง: 6๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
[๋ฌด์์ด ๊ฐ๊ณ ๋ฌด์์ด ๋ค๋ฅธ๊ฐ?] โ [ํ์ฅ(extends) vs ๊ต์ฐจ(&)์ ๋ฏธ๋ฌํ ์ฐจ์ด] โ [์ค๋ฌด ๊ฐ์ด๋๋ผ์ธ (์ด๋จ ๋ ๋ญ ์ฐ์ง?)]
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
-
interface์type์ ๊ณตํต์ ๊ณผ ํต์ฌ ์ฐจ์ด์ ์ ์ค๋ช ํ ์ ์๋ค. - ๊ฐ์ฒด ์งํฅ์ ํ์ฅ๊ณผ ํจ์ํ ๊ต์ฐจ์ ์ฐจ์ด๋ฅผ ํ๋ก์ ํธ ๊ท๋ชจ์ ๋ง๊ฒ ์ ํํ ์ ์๋ค.
- ์์๋ค ์ปค๋ฎค๋ํฐ์ฒ๋ผ ๋ฐฑ์๋ API๊ฐ ์์๋ก ๋ณํ๋ ํ๊ฒฝ์์ ์ด๋ค ์ค๊ณ๊ฐ ์ ๋ฆฌํ์ง ํ๋จํ ์ ์๋ค.
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ ( ํ์
์ค๊ณ ๊ธฐ์ค์ ์ก๋ ์ค ): "์ํธ ๋ฆฌ๋ ๋! ํ์๋ค๋ง๋ค API ์๋ต๊ฐ ํ์
์ ์ ์ํ๋ ๋ฐฉ์์ด ๋ฌ๋ผ์. ๋๊ตฌ๋
interface๋ฅผ ์ฐ๊ณ , ๋๊ตฌ๋type์ ์ฐ๋๋ฐ, ๋ฆฌ๋ทฐํ ๋๋ง๋ค '์ด๊ฑฐ ํต์ผํฉ์๋ค'๋ผ๊ณ ํ๋ ค๋ ์ ๊ฐ ๋ช ํํ ๊ธฐ์ค์ด ์์ด์ ๋ง๋ฌธ์ด ๋งํ๋๋ค. ๋ ๋ค ๊ฐ์ฒด ๋ง๋๋ ๊ฑฐ ๋๊ฐ์ง ์๋์?" - ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "ํ๋ฉด์ ์ผ๋ก๋ ๋น์ทํด ๋ณด์ด์ง๋ง, ๊น์ ๊ณณ์ ์ฒ ํ์ด ๋ค๋ฆ ๋๋ค. ํ๋๋ '๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋ผ๋'๋ฅผ ๋ง๋๋ ๊ฐ์ฒด ์งํฅ์ ์ฐ๋ฌผ์ด๊ณ , ๋ค๋ฅธ ํ๋๋ '๋ณํ์ง ์๋ ์ํ์ ์งํฉ'์ ๋๋ค. ์ค๋ ๊ทธ ๋ฏธ๋ฌํ ์ ์ ๊ทธ์ด๋ณด์ฃ ."
๐ค ์ ์์์ผ ํ๋๊ฐ: '์ค๊ณ'์ ์ถ๋ฐ์
interface์ type ๋
ผ์์ ํ๋ก ํธ์๋ ํ์์ ํญ(Tab) vs ์คํ์ด์ค(Space)๋งํผ ํํ ์ฃผ์ ์
๋๋ค.
์ต๊ทผ์ ํ์ ์คํฌ๋ฆฝํธ๋ ์ด ๋์ ๊ฒฉ์ฐจ๋ฅผ ๋ง์ด ์ค์ฌ๋์์, ์ฌ์ค ์ค๋ฌด์์๋ 80% ์ด์ ํผ์ฉํด์ ์จ๋ ๋น์ฅ์ ๋ฒ๊ทธ๋ ๋์ง ์์ต๋๋ค. ํ์ง๋ง, ํ๋ก์ ํธ๊ฐ ์ปค์ง๊ณ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ ธ์์ ๋ด ์ฝ๋๋ก ํ์ ํ์ฅ์ ์๋ํ๋ ์๊ฐ, ์ด ๋์ ์ค๊ณ์ ์ฐจ์ด๋ฅผ ๋ชจ๋ฅด๋ ๊ฐ๋ฐ์๋ ๋ฒฝ์ ๋ถ๋ชํ๋๋ค.
5๋ ์ฐจ ์ด์์ ์ํคํ ์ฒ ๋ ๋ฒจ๋ก ๊ฐ๊ธฐ ์ํด์๋ ๋จ์ํ '๊ธฐ๋ฅ ๊ตฌํ'์ ๋์ด, ๋๋ฃ๋ค์ด ํ์ฅํ๊ธฐ ํธํ๊ณ ์ผ๊ด๋ ํ์ ์ค๊ณ ๊ธฐ์ค์ ์ธ์ธ ์ ์์ด์ผ ํฉ๋๋ค.
๐ญ 1. ๊ณตํต์ : ๋ ๋ค ์ค๋ฆฌ(Duck)๋ฅผ ๋ง๋ค ์ ์๋ค
์์ 1๊ฐ์์ ๋ฐฐ์ด **๊ตฌ์กฐ์ ํ์ดํ(Duck Typing)**์ ๊ด์ ์์ ๋ณด๋ฉด, ๋ ๋ฐฉ์์ ์๋ฒฝํ ๋์ผํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ ๋๋ค.
// ๐ฃ ์์ฒ : "๋ณด์ธ์! ๋ ๋ค ์์ ํ ๋๊ฐ์ด ๋์ํ์์์!"
// 1. Interface ๋ฐฉ์
interface UserInterface {
id: number;
nickname: string;
}
// 2. Type Alias ๋ฐฉ์
type UserType = {
id: number;
nickname: string;
};
const userA: UserInterface = { id: 1, nickname: "์ํธ" };
const userB: UserType = { id: 2, nickname: "์์" };
// ๊ตฌ์กฐ๊ฐ ๊ฐ์ผ๋ฉด ํธํ๋๋ค!
const test: UserType = userA; // โ
ํต๊ณผ์ฌ์ง์ด ์๋ก๋ฅผ ์์(ํ์ฅ)ํ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค. (Interface๊ฐ Type์ extendsํ ์ ์๊ณ , Type์ด Interface์ & ๊ต์ฐจํ ์ ์์ต๋๋ค.)
์ฌ๊ธฐ๊น์ง๋ง ๋ณด๋ฉด "์๋ฌด๊ฑฐ๋ ์ฐ๋ฉด ๋๋ ๊ฑฐ ์๋?"๋ผ๋ ์์ฒ ์ด์ ๋ง์ด ๋ง์ ๋ณด์
๋๋ค.
โก 2. ๊ฒฐ์ ์ ์ฐจ์ด 1: ํ์ฅ ๋ฐฉ์ (Extends vs Intersection)
๊ฐ์ฅ ๋น๋ฒํ๊ฒ ๋ง๋๋ ์ฐจ์ด์ ์ ๊ธฐ์กด ํ์ ์ ํ์ฅ(์์)ํ์ฌ ์๋ก์ด ํ์ ์ ๋ง๋ค ๋ ๋ํ๋ฉ๋๋ค.
๐ฆ ์ํธ์ ์ํคํ
์ฒ ์ค๊ณ: Interface์ ์์ (extends)
๊ฐ์ฒด ์งํฅ์ ์ธ ๋ฐฉ์์ ๋๋ค. ๊ธฐ์กด ๋ผ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด ์ด์ ๋ถ์ ๋๋ค.
interface BaseComment {
id: string;
content: string;
}
// ๊ธฐ์กด ๋๊ธ์ ์ข์์ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ์๋ก์ด ์ธํฐํ์ด์ค
interface LikedComment extends BaseComment {
likeCount: number;
}ํน์ง:
- ์ปดํ์ผ๋ฌ๊ฐ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ณด์ฌ์ค ๋, ์ต์ข
์ด๋ฆ์ธ
LikedComment๋ก ๊น๋ํ๊ฒ ๋ณด์ฌ์ค๋๋ค. - ์ปดํ์ผ ์๋๊ฐ (๋ฏธ์ธํ์ง๋ง) ๋ ๋น ๋ฆ ๋๋ค. TS๊ฐ ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ ์บ์ฑํ๊ณ ํฉ์น๋ ๋ฐ ์ต์ ํ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ์์ฑ ์ด๋ฆ์ด ์ถฉ๋ํ ๋, ๋ถ๋ชจ์ ์์ ๊ฐ์ ์๊ฒฉํ ์๋ฌ๋ฅผ ๋ฟ์ด๋ด์ด ์ค์๋ฅผ ๋ง์์ค๋๋ค.
๐ฃ ์์ฒ ์ ์กฐํฉ ๋ฐฉ์: Type์ ๊ต์ฐจ (& Intersection)
ํจ์ํ์ด๊ณ ์ํ์ ์ธ ์ ๊ทผ์ ๋๋ค. ๋ ๊ฐ์ ์งํฉ์ ํ๋๋ก ๋ญ์ณ๋ฒ๋ฆฝ๋๋ค.
type BasePost = {
id: string;
title: string;
};
// ๊ธฐ์กด ๊ฒ์๊ธ ํ์
๊ณผ ์๋ก์ด ์ข์์ ํ์
์ '๊ต์งํฉ'์ผ๋ก ๋ฌถ์
type LikedPost = BasePost & {
likeCount: number;
};ํน์ง:
- ์ด๋ฆ ์ถฉ๋์ด ๋ฐ์ํ์ ๋ ์๋ฌ๋ฅผ ๋ฟ์ง ์๊ณ , ๋ฌด๋ฆฌํ๊ฒ
neverํ์ (์กด์ฌํ ์ ์๋ ํ์ )์ ๋ง๋ค์ด ๋ฒ๋ ค ๋์ค์ ์์ธ์ ์ฐพ๊ธฐ ํ๋ ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค. - ์๋ฌ ํดํ์์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ ธ์ ๋
{ id: string, title: string } & { likeCount: number }์ฒ๋ผ ํ์ด์ ๋ณด์ฌ์ฃผ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง ์ ์์ต๋๋ค.
๐ 3. ๊ฒฐ์ ์ ์ฐจ์ด 2: ์ ์ธ ๋ณํฉ (Declaration Merging)
๊ฐ์ฅ ์ค์ํ ์ฐจ์ด์ ์ ๋๋ค. ์์ฒ ์ด๊ฐ ๋ฐ๋์ ์์์ผ ํ ํ์ ์คํฌ๋ฆฝํธ์ ์ ์ธ ๋ณํฉ ๊ท์น์ ๋๋ค.
๐ Interface: ์ด๋ ค์๋ ๋ฌธ (Open)
๊ฐ์ ์ด๋ฆ์ interface๋ฅผ ์ฌ๋ฌ ๋ฒ ์ ์ธํ๋ฉด, ํ์
์คํฌ๋ฆฝํธ๊ฐ ์์์ ํ๋๋ก ํฉ์ณ์ค๋๋ค(Merge).
// ๐ฆ ์ํธ: "์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Window ๊ฐ์ฒด ๋ฑ)์ ๋ด๊ฐ ๋ง๋ ์์ฑ์ ๋ผ์๋ฃ์ ๋ ์ต๊ณ ์ฃ ."
// 1. ์ฒซ ๋ฒ์งธ ์ ์ธ
interface UserProfile {
id: number;
}
// 2. ๋ค๋ฅธ ํ์ผ, ํน์ ๋์ค์ ๋ ๋ฒ์งธ ์ ์ธ
interface UserProfile {
nickname: string;
}
// โ
์๋์ผ๋ก ๋ ๊ฐ๊ฐ ํฉ์ณ์ง!
const myProfile: UserProfile = {
id: 1,
nickname: "๋ฉ์์ด์์ฒ ",
};๐ Type Alias: ๋ซํ์๋ ๋ฌธ (Closed)
type์ ํ ๋ฒ ์ง๊ณ ๋๋ฉด ์ ๋ ๋ณ๊ฒฝํ ์ ์๋ ์๋ณ์(Alias) ์
๋๋ค.
// ๐ฃ ์์ฒ : "ํ์
์ ์ ๋ ๋ฒ ์ ์ธํ๋ฉด ํ๋ฅผ ๋ด์ฃ ?"
type UserInfo = {
id: number;
};
// โ ์๋ฌ: ์๋ณ์ 'UserInfo'๊ฐ ์ค๋ณต ์ ์ธ๋์์ต๋๋ค.
type UserInfo = {
nickname: string;
};๐ฏ 4. ์์๋ค ์ปค๋ฎค๋ํฐ ์ค๋ฌด ๊ฐ์ด๋๋ผ์ธ
๊ทธ๋ ๋ค๋ฉด ์์ฒ ์ด๋ ๋ด์ผ ํ ํ์์์ ์ด๋ป๊ฒ ์ฝ๋ฉ ์ปจ๋ฒค์
์ ํฝ์คํด์ผ ํ ๊น์?
ํ์
์คํฌ๋ฆฝํธ ๊ณต์ ๋ฌธ์์ ๊ธ๋ก๋ฒ ๋ฒ ์คํธ ํ๋ํฐ์ค๋ฅผ ํฉ์น ์์๋ค ์ปค๋ฎค๋ํฐ ๋ฃฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊ฐ์ฒด๋ฅผ ์ ์ํ ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก
interface๋ฅผ ๋ฒ ์ด์ค๋ก ์ผ๋๋ค.- API ์๋ต๊ฐ, ์ปดํฌ๋ํธ์ Props, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๋ชจ๋ธ ๋ฑ์ ๋ชจ๋ ๊ฐ์ฒด์ด๋ฏ๋ก
interface๊ฐ ๊น๋ํ๊ณ ์๋ฌ ๋ฉ์์ง๋ ์ง๊ด์ ์ ๋๋ค.
- API ์๋ต๊ฐ, ์ปดํฌ๋ํธ์ Props, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๋ชจ๋ธ ๋ฑ์ ๋ชจ๋ ๊ฐ์ฒด์ด๋ฏ๋ก
type(ํ์ ๋ณ์นญ)์ ์๋์ ๊ฐ์ 'ํน์ํ ๊ฒฝ์ฐ'์๋ง ์ฌ์ฉํ๋ค.- ์์๊ฐ์ ์ด๋ฆํ๋ฅผ ๋ถ์ผ ๋:
type UserId = string; - ์ ๋์ธ ํ์
์ ์ธ ๋:
type Status = "IDLE" | "LOADING" | "ERROR"; - ๊ต์ฐจ๋ ํํ ๊ฐ์ ๋ณต์กํ ์ฐ์ฐ์ด ํ์ํ ๋:
type Response = [number, string];
- ์์๊ฐ์ ์ด๋ฆํ๋ฅผ ๋ถ์ผ ๋:
- ์ผ๊ด์ฑ(Consistency)์ด ์ต์ฐ์ ์ด๋ค.
- ์ด๋ฏธ ํ์ด ์ ๋ถ
type์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ์๋ค๋ฉด, ๊ตณ์ด ํผ์interface๋ก ๋ฐ๊พธ๋ ํฌ์์ ํ์ง ๋ง์ธ์. ์ ์ผ ๋์ ๊ฑด ํ ํ์ผ ์์์ ๋ ๊ฐ๋ฅผ ์์ด ์ฐ๋ ๊ฒ์ ๋๋ค.
- ์ด๋ฏธ ํ์ด ์ ๋ถ
๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. interface์ type์ ํ์ฉํด ๊ฐ์ฒด๋ฅผ ํ์ฅํ ๋ ์ฌ์ฉํ๋ ํค์๋/์ฐ์ฐ์๋ ๊ฐ๊ฐ ๋ฌด์์ธ๊ฐ์?
โ
์ ๋ต: interface๋ extends ํค์๋๋ฅผ, type์ & (Intersection) ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
๐ก ์์ธ ํด์ค:
interface A extends B๋ ๊ฐ์ฒด ์งํฅ์ ์ธ ์์์ ๊ฐ๋ ์ผ๋ก, ์์ฑ ์ถฉ๋ ์ ์ปดํ์ผ๋ฌ๊ฐ ์น์ ํ๊ฒ ์๋ฌ๋ฅผ ์ก์์ค๋๋ค.type A = B & C๋ ๋ ํ์ ์ ์ํ์ ์ผ๋ก ๊ฒฐํฉํ๋ ๊ต์ฐจ ํ์ ์ผ๋ก ๋ฌถ์ ๋๋ค.
Q2. ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์: ์ ์ญ window ๊ฐ์ฒด)๋ ๊ธฐ์กด์ ์ ์๋ ๊ฐ์ฒด์ ํ์
์ ํ์ฅํ์ฌ ์๋ก์ด ํ๋กํผํฐ๋ฅผ ๋ผ์ ๋ฃ์ผ๋ ค๊ณ ํฉ๋๋ค. ์ด๋๋ ์ด๋ค ๋ฐฉ์์ ์ฌ์ฉํด์ผ ํ ๊น์?
โ
์ ๋ต: interface์ ์ ์ธ ๋ณํฉ(Declaration Merging)์ ์ฌ์ฉํ๋ค.
๐ก ์์ธ ํด์ค:
type์ ํ ๋ฒ ์ ์ธ๋๋ฉด ์คํ์ด ๊ณ ์ ๋์ง๋ง,interface๋ ๋์ผํ ์ด๋ฆ์ผ๋ก ์ด์ด๋๋ฉด ์๋์ผ๋ก ๋ณํฉ(Merge)๋๋ ํน์ง์ด ์์ต๋๋ค.- ์ด๋ฅผ ํ์ฉํด
interface Window { myGlobalVar: string; }์ฒ๋ผ ๊ธฐ์กด ์ ์ญ ๊ฐ์ฒด์ ๋ด ์ปค์คํ ํ๋กํผํฐ๋ฅผ ๋ผ์๋ฃ๋ ๊ธฐ๋ฒ์ด ์ค๋ฌด์์ ์์ฃผ ์ฐ์ ๋๋ค.
Q3. [์์ฒ ์ด์ ํ
์คํธ ํ์: ์ค๋ฌด ๋๋ ๋ง] ์์ฒ ์ด๊ฐ ๋ฐฑ์๋ ์์ ๋๊ณผ ์์ํ๋ฉฐ API ๊ณตํต ์๋ต ํฌ๋งท์ ์ก๊ณ ์์ต๋๋ค. "์ฑ๊ณตํ์ ๋๋ data๊ฐ ์ค๊ณ , ์คํจํ์ ๋๋ errorMessage๊ฐ ์ค๋ ๊ตฌ์กฐ์
๋๋ค. ์ด๊ฑธ interface๋ก ๋ง๋ค๊น์?" ๋ผ๊ณ ์์ฒ ์ด๊ฐ ๋ฌผ์ด๋ด
๋๋ค. ์ํธ ๋ฆฌ๋๋ ์ด๋ฅผ ์ด๋ป๊ฒ ๊ต์ ํด ์ค๊น์?
โ
์ ๋ต: ์ฑ๊ณต๊ณผ ์คํจ๊ฐ ์๋ก ๋ค๋ฅธ ํํ๋ผ๋ฉด type ์ ๋์ธ์ผ๋ก ์ํ๋ฅผ ๋ถ๋ฆฌํ๋ค.
๐ก ์์ธ ํด์ค:
interface๋ ํ๋์ ๊ฐ์ฒด ํํ๋ฅผ ํ์ฅํ๊ธฐ ์ข์ง๋ง,"success"์ํ์"error"์ํ์ฒ๋ผ ๋ ์ค ํ๋๋ฅผ ํํํ๋ ์ ๋์ธ์type์ด ํ์ํฉ๋๋ค.type ApiResult = { status: "success"; data: Post[] } | { status: "error"; errorMessage: string }์ฒ๋ผ ๋ง๋ค๋ฉด ์ฑ๊ณต ๋ถ๊ธฐ์์๋data, ์คํจ ๋ถ๊ธฐ์์๋errorMessage๋ง ์์ ํ๊ฒ ๋ค๋ฃฐ ์ ์์ต๋๋ค.- ๋ชจ๋ ํ๋๋ฅผ
data?: ...,errorMessage?: ...๋ก ํ ๊ฐ์ฒด์ ๋ชฐ์๋ฃ์ผ๋ฉด "์ฑ๊ณต์ธ๋ฐ data๊ฐ ์์ ์๋ ์๋" ์ ๋งคํ ํ์ ์ด ๋์ด ์ค์ ์๊ตฌ์ฌํญ์ ํ๋ฆฝ๋๋ค.
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
์ค๋์ interface์ type์ "์ทจํฅ ์ฐจ์ด"๋ก๋ง ๋๊ธฐ๋ฉด ์ ๋๋ค๋ ๊ฑธ ๋ฐฐ์ ๋ค. ๊ฐ์ฒด ๋ชจ๋ธ์ ๊ณ์ ํ์ฅํด์ผ ํ๋ API ์๋ต์ด๋ Props๋ interface๊ฐ ์ฝ๊ธฐ ์ข๊ณ , ์ฑ๊ณต/์คํจ์ฒ๋ผ ํํ๊ฐ ๊ฐ๋ผ์ง๋ ๊ฐ์ type ์ ๋์ธ์ด ํจ์ฌ ์ ํํ๋ค.
ํนํ ์ ์ธ ๋ณํฉ์ ๊ธฐ์ตํด๋ ๋งํ๋ค. ์ ์ญ Window๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์
์ ๋ณด๊ฐํ ๋๋ interface๊ฐ ์ด๋ ค ์๋ค๋ ์ ์ด ์ฅ์ ์ด ๋๋ค. ๋ฐ๋๋ก ์ํ ๋จธ์ ์ด๋ API ๊ฒฐ๊ณผ์ฒ๋ผ "์ด๊ฒ ๋๋ ์ ๊ฒ"์ ๋งํด์ผ ํ ๋๋ type์ด ๋ ์์งํ ํํ์ด์๋ค.
๐ก "๊ฐ์ฒด์ ๋ผ๋๋ฅผ ํ์ฅํ ๋๋
interface, ์ ํ์ง์ ์กฐํฉ์ ํํํ ๋๋type. ๊ธฐ์ค์ ๋ฌธ๋ฒ ์ทจํฅ์ด ์๋๋ผ ๋ฐ์ดํฐ๊ฐ ๋ณํ๋ ๋ฐฉ์์ด๋ค."
๋ด์ผ ํ ์ปจ๋ฒค์ ๋ฌธ์์๋ "๋ฌด์กฐ๊ฑด ํ๋๋ง ์ฐ์"๊ฐ ์๋๋ผ "์ธ์ ์ด๋ค ๊ธฐ์ค์ผ๋ก ๊ณ ๋ฅผ์ง"๋ฅผ ์ ์ด์ผ๊ฒ ๋ค. ์์ฒ ์ด๋ ์ด์ ๋ฆฌ๋ทฐ์์ ๋จ์ ํต์ผ๋ณด๋ค ์ค๊ณ ์๋๋ฅผ ๋จผ์ ๋ฌผ์ด๋ณผ ์ ์์ ๊ฒ ๊ฐ๋ค.