[TypeScript] ๐ณ 3.2 ์ธํฐํ์ด์ค ์ฌ์ฉ
๐ณ 3.2 ์ธํฐํ์ด์ค ์ฌ์ฉ
์์ฑ์๋ฅผ ํฌํจ์ํจ ์ปค์คํ ํ์ ์ด ํ์ํ ๊ฒฝ์ฐ ์ผ๋ฐํด๋์ค๋ฅผ ์ฌ์ฉ / ๊ทธ๋ ์ง ์์ผ๋ฉด ์ธํฐํ์ด์ค ์ฌ์ฉํจ
๐ 3.2.1 ์ธํฐํ์ด์ค ๊ฐ์
์์ฑ ๋ฟ๋ง ์๋๋ผ ๋ฉ์๋์ ์ธ๋ ํฌํจํ ์ ์๋ค. ( โ ๋ฉ์๋ ๊ตฌํ์ ์๋. )
implementsํค์๋์ ์ธํฐํ์ด์ค ์ด๋ฆ์ ์ฌ์ฉํ ์ ์์.
=> ๋ฉ์๋ ์๊ทธ๋์ฒ๋ง์ ํฌํจํ์ง๋ง, ํด๋์ค๋ ๋ฉ์๋ ๊ตฌํ์ด ํฌํจ๋ ์ ์๋ค.
๐ Example
// 3_13.ts
interface MotorVeghicle3_13{
startEngine(): boolean;
stopEngine(): boolean;
brake(): boolean;
accelate(speed: number);
hank(HowLong: number): void;
}
๋ฉ์๋ ๊ตฌํ์ ์์.
์ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ ํด๋์ค Car๋ฅผ ๋ง๋ค์ด๋ณด์.
class Car3_13 implements MotorVehicle3_13{
}
์ด ๊ฒฝ์ฐ ํด๋์ค ์ ์ธ์ ์ปดํ์ผ๋์ง ์์ ์ค๋ฅ๊ฐ ๋ฐ์.
์ธํฐํ์ด์ค๋ก ํด๋์ค๋ฅผ ์ ์ธํ ๋, ์ธํฐํ์ด์ค ๋ด ๊ฐ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผํจ.
// 3_14.ts
interface MotorVehicle3_14{
startEngine(): boolean;
stopEngine(): boolean;
brake(): boolean;
accelate(speed: number);
hank(HowLong: number): void;
}
class Car3_14 implements MotorVehicle3_14{
startEngine(): boolean{
return true;
}
stopEngine(): boolean{
return true;
}
brake(): boolean{
return true;
}
accelate(speed: number){
console.log(`Driving faster`);
}
hank(HowLong: number): void {
console.log(`Beep beep yeah!`);
}
}
const car = new Car3_14();
car.startEngine();
car์ ํ์ ์ ๋ช ์์ ์ผ๋ก ์ ์ธํ์ง ์์์ต๋๋ค.
const car: Car3_14 = new Car3_14();
์ด ์ฒ๋ผ ๋ช ์์ ์ผ๋ก ์ ์ธ ๊ฐ๋ฅ.
const car:MotorVehicle3_14 = new Car3_14();
Carํด๋์ค๋ ์ปค์คํ ํ์ ์ ๊ตฌํํ๋ฏ๋ก ์์ car์ Motor Vehicleํ์ ์ ์ธ ๊ฐ๋ฅ
๐ ์ฐจ์ด์
์ ๋๊ฐ์ง์ ์ฐจ์ด์ ์ ์์๋ณด์.
๋ง์ฝ Car๊ฐ 8๊ฐ์ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผํ๋ค๊ณ ํ๋ฉด, Carํ์
์ด๋ฉด, ๊ฐ์ฒด ์ธ์คํด์ค๋ด 8๊ฐ๋ฅผ ๋ชจ๋ ํธ์ถ ๊ฐ๋ฅ.
MotorVehicleํ์
์ด๋ฉด ์ธ์คํด์ค์ ์ ์ธ๋ ๋ฉ์๋๋ง ํธ์ถ ๊ฐ๋ฅ
์ด๋ฅผ ์ธํฐํ์ด์ค๋ ํน์ ๊ท์ฝ์ ๊ฐ์ ํ๋ค๊ณ ๋งํ ์ ์๋ค.
// 3_15.ts
interface Flyable3_15{
fly(howHigh: number);
land();
}
interface Swimmable3_15{
swim(howFar: number);
}
์์ 3๊ฐ์ง๋ฅผ ํฉ์ณ๋ณด์.
// 3_16.ts
class Car3_16 implements MotorVehicle3_16, Flyable3_16, Swimmable3_16{
// 3๊ฐ์ ์ธํฐํ์ด์ค ๋ด ๋ชจ๋ ๋ฉ์๋๋ฅผ ๊ตฌํ
}
Car์ ์ฒด์ Flyable๊ณผ Swimmable์ ๊ฐ๋ฅํ๋๋ก ํ๋๊ฑด ์ข์ ๋ฐฉ๋ฒ์ด ์๋.
์์๊ฐ๋ ์ ์ ์ฉํด Carํด๋์ค๋ฅผ ํ์ฅํ๊ณ , ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ณด์.
class SecretServiceCar3_17 extends Car3_17 implements Flyable3_17, Swimmable3_17{
// flyable๊ณผ swimmable ๋ด ๋ชจ๋ ๋ฉ์๋๋ฅผ ๊ตฌํ
}
Carํด๋์ค๊ฐ MotorVehicle ์ธํฐํ์ด์ค์ ์ ์๋ ๊ธฐ๋ฅ์ ๊ฐ์ง.
๐ 3.2.2 ์ธํฐํ์ด์ค ํ์ฅ
MotorVehicle์ธํฐํ์ด์ค ๋ด์ ๊ฐ ๋ฉ์๋๋ฅผ ๋ค๋ฅด๊ฒ ๊ตฌํํ ์๋ ์์ต๋๋ค.
// 3_18.tsclass SecretServiceCar3_18 implements MotorVehicle3_18, Flyable3_18, Swimmable3_18{ // 3๊ฐ์ง ์ธํฐํ์ด์ค ๋ด ๋ชจ๋ ๋ฉ์๋๋ฅผ ๊ตฌํ}
์ธํฐํ์ด์ค ํ์ฅ
// 3_19.tsinterface MotorVehicle3_19{ startEngine(): boolean; stopEngine(): boolean; brake(): boolean; accelate(speed: number); hank(HowLong: number): void;}interface Flyable3_19 extends MotorVehicle3_19{ // ํด๋์ค๋ฅผ ๊ตฌํํ๋ ๋ฉ์๋ ์๊ทธ๋์ฒ fly(howHigh: number); land();}
์ด ํ ํด๋์ค ์ ์ธ์ implements Flyable ๊ตฌ๋ฌธ์ด ํฌํจ๋ ์์ผ๋ฉด MotorVehicle ์ธํฐํ์ด์ค์ ์ ์ธ๋ 5๊ฐ ๋ฉ์๋์ Flyable์ ๋ ๋ฉ์๋๋ฅผ ํฉ์น ์ด 7๊ฐ์ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผํจ.
// 3_20.tsclass SecretServiceCar3_20 implements Flyable3_20, Swimmable3_20{ startEngine(): boolean{ return true; } stopEngine(): boolean{ return true; } brake(): boolean{ return true; } accelate(speed: number){ console.log(`Driving faster`); } hank(howLong: number): void{ console.log(`Beep Beep!!`) } fly(howHigh: number){ console.log(`Flying ${howHigh} feet high`); } land(){ console.log(`Landing. Fasten your belts`); } swim(howFar: number){ console.log(`Swimming ${howFar} feet`); }}
๋ฉ์๋ ์๊ทธ๋์ฒ๋ฅผ ํฌํจํ ์ธํฐํ์ด์ค ์ ์ธ์ ์ฝ๋ ๊ฐ๋ ์ฑ์ ๋์ฌ์ค.
์ธํฐํ์ด์ค๋ ๊ฐ ๊ธฐ๋ฅ์ด ์ ์ ์๋ ์งํฉ์ผ๋ก ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํด ๊ตฌ์ฒด์ ์ธ ํด๋์ค๋ฅผ ๊ตฌํํ ์ ์๋ค.
๐ 3.2.3 ์ธํฐํ์ด์ค ํ๋ก๊ทธ๋๋ฐ
๋จผ์ ์ธํฐํ์ด์ค ํ๋ก๊ทธ๋๋ฐ์ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋ณด์.
ํ๊ฐ์ง ๋๋ ๋ชจ๋ ์ ํ ์ ๋ณด๋ฅผ ์ฝ๋ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค๊ณ ํ ๋, ๋จผ์ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ๊ฐ ๊ธฐ๋ฅ์ ๋ฐ๋ก ๊ตฌํํ๋ ๋ฐ ์ง์คํ ๊ฒ์ ๋๋ค.
๐ Example
class Product{ id: number; description: string;}class ProductService{ getProducts(): Product[]{ // ๋ชจ๋ products ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ด. return []; } getProductById(id: number): Product{ // id๋ฅผ ์กฐํํด product์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ด. return {id: 123, description: 'Good product'}; }}
๊ทธ๋ฌ๊ณ ๋์ ์๋์ ๊ฐ์ด ProductService ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
const productService = new ProductService();const products = productService.getProducts();
์๋ฒ๊ฐ์์ผ๋ ๋์ผํ API๋ฅผ ์ฌ์ฉํ๋ MockProductServiceํด๋์ค๋ฅผ ์์ฑํ๊ณ ์ ํ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ ์ ์๊ฒ ๋ง๋ค์ด ๋ณด์.
// 3_22.tsclass MockProductService3_22{ getProducts(): Product3_22[]{ // ํ๋ ์ฝ๋ฉ๋ ์ ํ ์ ๋ณด๋ฅผ ๋ฐ๋ ์ฝ๋ ์์ฑ. return []; } getProductById(id: number): Product3_22{ return {id: 456, description: 'Not a real product'}; }}
MockProductServiceํด๋์ค๋ ProductService ํด๋์ค์ ๋์ผํ ๋ ๋ฉ์๋๋ฅผ ์ ์ธํ์ง๋ง, ๋ฐ๋์ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
=> ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด MockProductService ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค.
implementsํค์๋๋ก ๋ค๋ฅธ ํด๋์ค๋ฅผ ๊ตฌํํ๋ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ด MockProductServiceํด๋์ค๋ฅผ ์์ ํ๋ ๊ฒ์ด ๋ฐ๋์งํจ.
class MockProductService3_22 implements ProductService{ // ๊ตฌํ}
ํ์ ์คํฌ๋ฆฝํธ๋ implements ํค์๋๋ค์ ํด๋์ค์ด๋ฆ์ ์ ๋ ฅํ๋ฉด ProductService์ ๋ชจ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ ๋ก ๊ตฌํํ๋๋ก ๋ง๋ญ๋๋ค. => ์๋ฒฝํ๊ฒ ๊ตฌํ๋ ๋๊น์ง ์ปดํ์ผ๋์ง ์์
โ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ฒ์๋ถํฐ ์ธํฐํ์ด์ค์ ์ง์คํด ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ.
2๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ProductService๋ฅผ ์์ฑํด์ผ ํ๋ ๊ฒฝ์ฐ, ๊ตฌํ์ ๋ํ ๊ฑฑ์ ์์ด ์ด๋ฌํ ๋ฉ์๋๋ก ์ธํฐํ์ด์ค๋ฅผ ์ ์ธํ๋ ๊ฒ์ผ๋ก ์์ํด์ผํจ.
// 3_23interface Product3_23{ // ์ธํฐํ์ด์ค๋ฅผ ํตํ ์ปค์คํ
ํ์
์ ์ธ id: number; description: string;}interface IProductService3_23{ // API๋ฅผ ์ธํฐํ์ด์ค๋ก ์ ์ธ getProducts(): Product3_23[]; getProductById(id: number):Product3_23;}class ProductService3_23 implements IProductService3_23{ getProducts(): Product3_23[]{ // ์ค์ ๋ฐ์ดํฐ์์ ์ ํ์ ๋ฐ์ต๋๋ค. return []; } getProductById(id: number): Product3_23{ // id๋ก ์ ํ์ ์กฐํํจ. return {id: 123, description: 'Good product'}; }}
API๋ฅผ ์ธํฐํ์ด์ค๋ก ์ ์ธํ๋ค. = ํ์ํ ๊ธฐ๋ฅ์ ๋ํด ์์ธํ๊ฒ ๊ตฌํํ๋ค. ๋ ์๋ฏธ
MockProductService๊ฐ์ ์ ํด๋์ค๋ฅผ ๊ตฌํํด์ผํ๋ค๋ฉด?
class MockProductService implements IProductService{ // ๋ฉ์๋ ๊ตฌํ}
์ปค์คํ ํ์ ์ ์ด๊ธฐํ ํ ํ์๊ฐ ์์ ๋ class ๋์ interface ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด JS์ฝ๋์์ด ์ค์ด๋ฌ
์ธํฐํ์ด์ค ํ๋ก๊ทธ๋๋ฐ์ ์ข์ ์๋ ํฉํ ๋ฆฌํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ.
โ ํฉํ ๋ฆฌ ํจ์๋ ๋น์ฆ๋์ค ๋ก์ง์ ๊ตฌํํ๊ณ ๊ฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ๋ฐํํ๋ ํจ์.
// 3_24function getProductService3_24(isProduction: boolean): IProductService3_24{ if( isProduction){ return new ProductService3_10(); }else{ return new MockProductService3_24 }}const productService3_24: IProductService3_24; // ์ธํฐํ์ด์ค ํ์
์ ๋ํ๋ด๋ ์์...const isProd = true; // ํ์ฌ ํ๋ก๋์
์ํ์์ ๋ํ๋productService3_24 = getProductService3_24(isProd); // productService ์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ์ดconst products3_24[] = productService3_24.getProducts(); // productService ๋ด ๋ฉ์๋๋ฅผ ํธ์ถ.
isProd๋ true๋ก ํ๋์ฝ๋ฉ๋์์ง๋ง, ์ค์ ์ฑ์์๋ ์์ฑ ํ์ผ ๋๋ ํ๊ฒฝ ๋ณ์๋ฅผ ํตํด ์ด ๊ฐ์ ๊ฐ์ ธ์ด.
ProductService or Mock ProductService๊ฐ ๋ฐํ๋๋๋ผ๋ ํจ์ ์๊ทธ๋์ฒ์๋ IProductService๋ฅผ ๋ฐํํ๋ค๊ณ ์์ฑ๋์๋ค. => ๋์ค์ Another ProductService ๋ผ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋๋ก ์์ ํด์ผํ๋ ๊ฒฝ์ฐ, ์ ํด๋์ค ์ ์ธ์ implements IProductService๋ฅผ ์ ๋ ฅํจ์ผ๋ก์จ ํฉํ ๋ฆฌ ํจ์๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๊ฐ ์ถ๊ฐ ๋ณ๊ฒฝ ์์ด ์ปดํ์ผ๋จ.
(์์ง ์ ๋ชจ๋ฅด๊ฒ ์.)
๐ ์์ฝ
- ํด๋์ค ์์์ด๋ ๊ธฐ์กด์ ์ ์๋์๋ ํด๋์ค์ ๋ชจ๋ ๋ฉค๋ฒ๋ฅผ ๋ฌผ๋ ค๋ฐ์ ์๋ก์ด ํด๋์ค๋ฅผ ์์ฑํ๋ ๊ฒ.
- ์๋ธ ํด๋์ค์์ ์ํผ ํด๋์ค์ public ๋๋ protected ํ๋กํผํฐ ์ฌ์ฉO
- ํด๋์ค ํ๋กํผํฐ๊ฐ private๋ก ์ ์ธ๋ ๊ฒฝ์ฐ ํด๋์ค ๋ด๋ถ์์๋ง ์ฌ์ฉ๊ฐ๋ฅ
- private ์์ฑ์๋ฅผ ์ฌ์ฉํด ํ๋ฒ๋ง ์ธ์คํด์คํํ ์ ์๋ ํด๋์ค ๋ง๋ค ์ ์์.
- ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ์๋ธ ํด๋์ค๊ฐ ์ํผ ํด๋์ค์ ๋ฉ์๋๋ฅผ ํน์ ํํ๋ก ๊ตฌํํ์ฌ ์ฌ์ ์ ํ๋ ๊ฒ.
- ํด๋์ค ์์ฑ์๋ ์ฌ์ ์ ๊ฐ๋ฅ
- superํค์๋์ super() ๋ฉ์๋๋ก ์๋ธ ํด๋์ค๊ฐ ์ํผํด๋์ค์ ํด๋์ค ๋ฉค๋ฒ๋ฅผ ํธ์ถํ ์ ์์.
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ([TypeScript] ๐ณ 3.2 ์ธํฐํ์ด์ค ์ฌ์ฉ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@cjh951114/TypeScript-3.2-์ธํฐํ์ด์ค-์ฌ์ฉ์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค