๐ก ์ ์ฐํ๊ณ ! ํ์ ์ด ๋ณด์ฅ๋๊ณ , ์ฌ์ฌ์ฉ์ฑ์ด ๋์ ์ ๋ค๋ฆญ(Generics)!!
์ ๋ค๋ฆญ์ด๋?
์ ์ธ ์์ ์ด ์๋๋ผ ์์ฑ ์์ ์ ํ์ ์ ๋ช ์ํ์ฌ ํ๋์ ํ์ ๋ง์ด ์๋ ๋ค์ํ ํ์ ์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ธฐ๋ฒ
- Generic์ด๋ ๋ฐ์ดํฐ์ ํ์ ์ ์ผ๋ฐํํ๋ค(generalize)ํ๋ค๋ ์๋ฏธ
- ํ์
์ ๋ณด๊ฐ ๋์ ์ผ๋ก ๊ฒฐ์ ๋๋ ํ์
- ๊ฐ์ ๊ท์น์ ์ฌ๋ฌ ํ์ ์ ์ ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์
- ํ์ ์ฝ๋๋ฅผ ์์ฑํ ๋ ๋ฐ์ํ ์ ์๋ ์ค๋ณต ์ฝ๋๋ฅผ ์ ๊ฑฐํ ์ ์๋ค
C#
๊ณผJava
๊ฐ์ ์ธ์ด์์, ์ฌ์ฌ์ฉ์ฑ์ด ๋์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ๋ ์์ฃผ ํ์ฉํ๋ ์ ๋ค๋ฆญ(Generics)!!!- ์ฆ, ๋จ์ผ ํ์ ์ด ์๋ ๋ค์ํ ํ์ ์์ ์๋ํ๋ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ ์ ์๋ค.
- ์ ๋ค๋ฆญ์ ํตํด ์ฌ๋ฌ ํ์ ์ ์ปดํฌ๋ํธ๋ ์์ ๋ง์ ํ์ ์ ์ฌ์ฉํ ์ ์๋ค.
์ ๋ค๋ฆญ ๊ธฐ๋ณธ ๋ฌธ๋ฒ
โ๏ธ ๊ธฐ๋ณธ ์ฝ๋
// text๋ผ๋ ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ๋๊ฒจ ๋ฐ์ text๋ฅผ ๋ฐํํ๋ ํจ์
const getText = (text) => {
return text;
};
// ํ๋ผ๋ฏธํฐ์ ์ด๋ค ๊ฐ์ ๋๊ฒจ์ฃผ๋๋ผ๋ ๊ทธ๋๋ก ๋ฐํ๋๋ค.
getText("april"); // 'april'
getText(20); // 10
getText(true); // true
โ๏ธ ์ ๋ค๋ฆญ ์ฝ๋
// ์ ๋ค๋ฆญ ๊ธฐ๋ณธ ๋ฌธ๋ฒ์ด ์ ์ฉ๋ ํจ์
const getText = <T>(text: T): T => {
return text;
};
// ํจ์๋ฅผ ํธ์ถํ ๋, ํจ์ ์์์ ์ฌ์ฉํ ํ์
์ ๋๊ฒจ์ค ์ ์๋ค
getText<string>("april"); // 'april'
getText<number>(20); // 10
getText<boolean>(true); // true
โ๏ธ ๋ ๊ฐ ์ด์์ ์ ๋ค๋ฆญ ์ฌ์ฉํ ์ฝ๋
// ๋ ๊ฐ์ ์ ๋ค๋ฆญ์ด ์ ์ฉ๋ ํจ์
const getUserInfo = <T, K>(name: T, age: K): [T, K] => {
return [name, age];
};
// ํจ์๋ฅผ ํธ์ถํ ๋, ํจ์ ์์์ ์ฌ์ฉํ ํ์
์ ๋๊ฒจ์ค ์ ์๋ค
getUserInfo("april", 20);
์ ๋ค๋ฆญ์ ์ฌ์ฉํ๋ ์ด์ ? ๐ค
ํ๋ผ๋ฏธํฐ์ ํ์
์ด ์ฌ๋ฌ ์ข
๋ฅ์ผ ๋ any
๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋๋ฐ,
any
ํ์
์ ํ์
๊ฒ์ฌ๋ฅผ ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค
์ ๋ค๋ฆญ์ ์ฌ์ฉํ์ง ์์ ์ฝ๋
const getText = (text: any): any => {
return text;
};
์ ๋ค๋ฆญ ์ ์ฉ ์ฝ๋
๋จผ์ ํจ์์ ์ด๋ฆ ๋ฐ๋ก ๋ค์ <T>
๋ผ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๊ณ ํจ์์ ์ธ์์ ๋ฐํ ๊ฐ์ ๋ชจ๋ T
๋ผ๋ ํ์
์ ์ถ๊ฐํ๋ฉด,
ํจ์๋ฅผ ํธ์ถํ ๋ ๋๊ธด ํ์
์ ๋ํด ํ์
์คํฌ๋ฆฝํธ๊ฐ ์ถ์ ํ ์ ์๊ฒ ๋๋ค.
๐ก ๋ฐ๋ผ์, ํจ์์ ์ ๋ ฅ ๊ฐ์ ๋ํ ํ์ ๊ณผ ์ถ๋ ฅ ๊ฐ์ ๋ํ ํ์ ์ด ๋์ผํ์ง ๊ฒ์ฆํ ์ ์๊ฒ ๋๋ค.
const getText = <T>(text: T): T => {
return text;
};
์ ๋ค๋ฆญ ์์ ์ฝ๋
๋ฐฐ์ด์ ์์ฑํ๋ ํจ์๋ก ์ตํ๋, ์ ๋ค๋ฆญ ์์ ์ฝ๋
โ๏ธ ์ ๋ค๋ฆญ ์ฌ์ฉ ์
์ซ์ ๋ฐฐ์ด์ ์์ฑํ๋ ํจ์์ ๋ฌธ์ ๋ฐฐ์ด์ ์์ฑํ๋ ํจ์ ๐ณ ์ค๋ณต๋ ์ฝ๋๊ฐ ๋ง๋คโฆ ๐ฌ๐ฎโ๐จ
const makeNumberArray = (defaultValue: number, size: number): number[] => {
const arr: number[] = [];
for (let i = 0; i < size; i++) {
arr.push(defaultValue);
}
return arr;
};
const makeStringArray = (defaultValue: string, size: number): string[] => {
const arr: string[] = [];
for (let i = 0; i < size; i++) {
arr.push(defaultValue);
}
return arr;
};
const arr1 = makeNumberArray(1, 10);
const arr2 = makeStringArray("empty", 10);
โ๏ธ ์ ๋ค๋ฆญ์ผ๋ก ์ฝ๋ ๋ฆฌํํ ๋ง ํ๊ธฐ
const makeArray = <T>(defaultValue: T, size: number): T[] => {
const arr: T[] = [];
for (let i = 0; i < size; i++) {
arr.push(defaultValue);
}
return arr;
};
const arr1 = makeArray<number>(1, 10);
const arr2 = makeArray<string>("empty", 5);
// makeArray ํจ์์ ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ฅผ ์๋ฉด ํ์
T๋ ์ ์ ์๊ธฐ ๋๋ฌธ์,
// ํธ์ถ ์ ํ์
T์ ์ ๋ณด๋ฅผ ๋ช
์์ ์ผ๋ก ์ ๋ฌํ์ง ์์๋ ๋๋ค.
const arr3 = makeArray(1, 10);
const arr4 = makeArray(1, 10);
extends
ํค์๋๋ก ์ ๋ค๋ฆญ ํ์
์ ํํ๊ธฐ
๋ฆฌ์กํธ์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ API๋ ์ ๋ ฅ ๊ฐ๋ฅํ ๊ฐ์ ๋ฒ์๋ฅผ ์ ํํ๋ค. ์๋ฅผ ๋ค์ด, ๋ฆฌ์กํธ์ ์์ฑ๊ฐ ์ ์ฒด๋ ๊ฐ์ฒด ํ์ ๋ง ํ์ฉ๋๋ค. ์ด๋ฅผ ์ํด ํ์ ์คํฌ๋ฆฝํธ์ ์ ๋ค๋ฆญ์ **ํ์ ์ ์ข ๋ฅ๋ฅผ ์ ํ**ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
โ๏ธ ์์ ์ฝ๋
// ์ ๋ค๋ฆญ T ํ์
์ number | string์ ํ ๋น ๊ฐ๋ฅํ ํ์
์ผ๋ก ์ ํ
const identity = <T extends number>(p1: T): T => {
return p1;
};
identity(1);
identity("a");
identity([]); // ํ์
์๋ฌ
โ๏ธ ์์ ์ฝ๋
// ์ ๋ค๋ฆญ T ํ์
์ number | string์ ํ ๋น ๊ฐ๋ฅํ ํ์
์ผ๋ก ์ ํ
const identity = <T extends number>(p1: T): T => {
return p1;
};
identity(1);
identity("a");
identity([]); // ํ์
์๋ฌ
โ๏ธ ์์ ์ฝ๋2
interface IPerson {
name: string;
age: number;
}
interface IKorean extends IPerson {
liveInSeoul: boolean;
}
// ์ ๋ค๋ฆญ T๋ IPerson์ ํ ๋น ๊ฐ๋ฅํ ํ์
์ด์ด์ผ ํ๋ค
// ์ ๋ค๋ฆญ K๋ IPerson์ ์์ฑ ์ด๋ฆ์ด์ด์ผ ํ๋ค.
// ์ฐธ๊ณ ๋ก keyof๋ ์ธํฐํ์ด์ค์ ๋ชจ๋ ์์ฑ ์ด๋ฆ์ ์ ๋์จ ํ์
์ผ๋ก ๋ง๋ค์ด ์ค๋ค.
const swapProperty = <T extends IPerson, K extends keyof IPerson>(
p1: T,
p2: T,
name: K
): void => {
const temp = p1[name];
p1[name] = p2[name];
p2[name] = temp;
};
const p1: IKorean = {
name: "april",
age: 20,
liveInSeoul: true,
};
const p2: IKorean = {
name: "yrkim",
age: 20,
liveInSeoul: true,
};
swapProperty(p1, p2, "age"); // p1, p2๋ IPerson์ ํ ๋น ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ํ์
์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค