๐งฉ 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๋ก ๋ง๋ค๊น์?" ๋ผ๊ณ ์์ฒ ์ด๊ฐ ๋ฌผ์ด๋ด
๋๋ค. ์ํธ ๋ฆฌ๋๋ ์ด๋ฅผ ์ด๋ป๊ฒ ๊ต์ ํด ์ค๊น์?
โ
์ ๋ต: "์์ฒ ๋, ์ํฉ์ ๋ฐ๋ผ ํํ๊ฐ ์์ ๋ฌ๋ผ์ง๋ '์ ๋์ธ(Union)' ๊ตฌ์กฐ๋ interface๊ฐ ์๋๋ผ type์ผ๋ก ์ ์ธํ๋ ๊ฒ ์ ๋ต์
๋๋ค."
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
:
interface๋ 'ํ๋์ ๊ณ ์ ๋ ๊ฐ์ฒด ํํ'๋ฅผ ๋ฌ์ฌํ๋ ๋ฐ ํนํ๋์ด ์์ต๋๋ค. ๋ฐ๋ฉด"์ฑ๊ณต ์ํ ๊ฐ์ฒด" | "์คํจ ์ํ ๊ฐ์ฒด"์ฒ๋ผ ๋ ์ค ํ๋๊ฐ ๋๋ ์ ๋์ธ(OR) ํ์ ์ ์ค์งtypeํค์๋๋ก๋ง ๋ฌถ์ ์ ์์ต๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์ด๊ฑธ ๊ตณ์ด interface ํ๋์ ๋ชฐ์๋ฃ๊ณ
data?: any, errorMessage?: string์ฒ๋ผ ์ ๋ถ ์ต์ ๋๋ก ์ฒ๋ฆฌํ๋ฉด, ์ฑ๊ณตํ๋๋ฐ๋ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ฒดํฌํด์ผ ํ๋ ์ง์ฅ์ด ํผ์ณ์ง๋๋ค." - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: ๊ณ ์ ๋ ๋ผ๋๋ Interface! ์ด๊ฒ ๋๋ ์ ๊ฒ(Union) ์กฐ๊ฑด์ ๊ฒฐํฉ์ Type!
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
๐ก "Interface๋ ์ธ์ ๋ ์ฆ์ถ ๊ฐ๋ฅํ ์กฐ๋ฆฝ์ ํ๋ฌ ์ง์ด๊ณ , Type์ ์ค๊ณ๋๊ฐ ๊ตณ์ด๋ฒ๋ฆฐ ์ฃผ๋ฌผ(Casting)์ด๋ค."
์ค๋๋ ์ํธ ๋ฆฌ๋ ๋์ ๋น์ ์ ์ด๋ง๋ฅผ ํ ์ณค๋ค. ๊ทธ๋์ ์ปจ๋ฒค์
๋
ผ์ ๋ฐ ๋๋ง๋ค ๊ฟ๋จน์ ๋ฒ์ด๋ฆฌ์๋๋ฐ, ์ด์ ๋๊ฐ ๋ฌผ์ด๋ณด๋ฉด '์ ์ธ ๋ณํฉ'์ด๋ผ๋ ๊ณ ๊ธ ์ดํ๋ฅผ ์ฐ๋ฉด์ ์ค๋ช
ํ ์ ์๊ฒ ์ง? (๋ฟ๋ฏ)
๋ฐฑ์๋ API ๋ชจ๋ธ์ interface๋ก ์ซ ๋ง์ถ๊ณ , ๋ฆฌ๋์ค ์ก์
์ด๋ ์ปดํฌ๋ํธ ์ํ ๊ฐ์ ์ ๋์ธ ํ์
๋ค์ type์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ฑธ๋ก ๋ด์ผ ๊ธฐ์ ๋ธ๋ก๊ทธ์ ํ๋ ์จ๋์ผ๊ฒ ๋ค. ์ ๋ชฉ๋ง๋ฅด๋ค, ์ง ๊ฐ๋ ๊ธธ์ ์ ๋ก ์ฝ๋ผ ํ๋ ์ฌ์ ์ค๋ ์ง ์ปจ๋ฒค์
๋ฌธ์ ํ ๋ฒ ๋ ์ ๋
ํด์ผ์ง!