ํด๋์ค๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ๋ณธ ์์๋ก, TypeScript์์ ํด๋์ค๋ฅผ ์ ์ํ๊ณ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
class Goods {
goodsName: string;
price: number;
constructor(goodsName: string, price: string) {
this.goodsName = goodsName;
this.price = price;
}
goodsPrint(): string {
return `${this.goodsName}์ ๊ฐ๊ฒฉ์ ${this.price}์ ์
๋๋ค.`;
}
}
์์ ์ฝ๋์์ constructor
๋ฉ์๋๋ Goods
ํด๋์ค์ ์ธ์คํด์ค๋ฅผ(ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋ ๊ฐ ๊ฐ์ฒด) ์์ฑํ ๋ ํธ์ถ๋๋ฉฐ, goodsName
๊ณผ price
์ string
๋ฐ number
์์ฑ์ ์ธ์๋ก ์ ๋ฌ๋ ๊ฐ์ผ๋ก ์ด๊ธฐํํฉ๋๋ค. ์ด๋ฅผ ํตํด ํด๋์ค์ ์ธ์คํด์ค๊ฐ ์์ฑ๋ ๋ ์ด๊ธฐํ ์์
์ ์ํํ ์ ์์ต๋๋ค. ์ถ๊ฐ๋ก constructor
๋ฉ์๋๋ ํด๋์ค ๋ด์์ ํ ๋ฒ๋ง ์ ์ํ ์ ์์ต๋๋ค.
// ํด๋์ค์ ์ธ์คํด์ค ์์ฑ
const goods1 = new Goods("Mouse", 3000);
const goods2 = new Goods("Keyboard", 5000);
console.log(goods1.price); // 3000
console.log(goods2.goodsName); // Keyboard
console.log(goods1.goodsPrint()); // Mouse์ ๊ฐ๊ฒฉ์ 3000์ ์
๋๋ค.
console.log(goods2.goodsPrint()); // Keyboard์ ๊ฐ๊ฒฉ์ 5000์ ์
๋๋ค.
์์ ์ฝ๋์์
goods1
๊ณผgoods2
๋Goods
ํด๋์ค์ ์ธ์คํด์ค๋ก, ๊ฐ ์ธ์คํด์ค๋ ํด๋์ค์ ์์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ํด๋น ํด๋์ค์ ๋ฉ์๋์ ์์ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํด๋์ค ๊ฐ ์์์ ํตํด ๊ธฐ์กด ํด๋์ค์ ํน์ฑ์ ํ์ฅํ ์ ์์ต๋๋ค.
class Exhibition extends Goods {
position: string; // Class Goods ์์ ํ, position ๊ฐ ์ถ๊ฐ
constructor(goodsName: string, price: number, position: string) {
super(goodsName, price);
this.position = position;
}
goodsInfo(): string {
return `${super.goodsPrint()} ํด๋น ์ํ์${this.position}์ ์ง์ด๋์ด ์์ต๋๋ค.`;
}
}
์์ ์์์์ Exhibition
ํด๋์ค๊ฐ Goods
ํด๋์ค์ ๋ชจ๋ ์์ฑ๊ณผ ๋ฉ์๋๋ฅผ ์์๋ฐ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
super
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ชจ ํด๋์ค์ธ Goods
์ ์์ฑ์๋ฅผ ํธ์ถํฉ๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ Exhibition
ํด๋์ค์ ์์ฑ์ ๋ด์์๋ Goods
ํด๋์ค์ ์์ฑ์ธ goodsName
๊ณผ price
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค
const goodsInfo = new goodsInfo("Coffe", 1200, "A์ด 10๋ฒ");
console.log(goodsInfo.goodsInfo());
// Coffee์ ๊ฐ๊ฒฉ์ 1200์ ์
๋๋ค. ํด๋น ์ํ์ A์ด 10๋ฒ์ ์ง์ด๋์ด ์์ต๋๋ค.
ํ์ ์คํฌ๋ฆฝํธ์์ ์ ๊ทผ ์ ์ด์(public, private, protected)๋ฅผ ํ์ฉํ์ฌ ํด๋์ค์ ์ ๊ทผ ๊ถํ์ ์ค์ ํ ์ ์์ต๋๋ค.
class Goods {
public goodsName: string; // public ์ ๊ทผ ์ ์ด์
protected price: number; // protected ์ ๊ทผ ์ ์ด์
protected discount: number; // protected ์ ๊ทผ ์ ์ด์
private position: string; // private ์ ๊ทผ ์ ์ด์
constructor(goodsName: string, price: number, discount: number, position: string) {
this.goodsName = goodsName;
this.price = price;
this.discount = discount;
this.position = position;
}
public goodsPrint(): string {
return `${this.goodsName}์ ๊ฐ๊ฒฉ์ ${this.price}์์ด๋ฉฐ ํด๋น ์ํ์
${this.position}์ ์ง์ด๋์ด ์์ต๋๋ค.(ํ ์ธ์จ: ${this.discount}%)`;
}
}
class DiscountedGoods extends Goods {
constructor(goodsName: string, price: number, discount: number, position: string) {
super(goodsName, price, discount, position);
}
// price์ discount๋ protected ์ ๊ทผ ์ ์ด์๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํจ!
public discountedPrice(): string {
return `${this.price - (this.price * this.discount / 100)}์`;
}
}
public
์ ์ ๊ทผ ๊ถํ์ ์ค์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ฆ, public
์ ์์ฑํ์ง ์์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.protected
๋ protected
๋ฅผ ์ฌ์ฉํ ํด๋น ํด๋์ค์ ์๋ธ ํด๋์ค์์๋ง ์ ๊ทผ ๊ฐ๋ฅํฉ๋๋ค.private
๋ private
๋ฅผ ์ฌ์ฉํ ํด๋น ํด๋์ค์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.const goods = new Goods("Americano", 4500, 10, 'B์ด 9๋ฒ');
console.log(goods.goodsName); // ์ ๊ทผ ๊ฐ๋ฅ (public)
console.log(goods.price); // ์ ๊ทผ ๋ถ๊ฐ (protected)
console.log(goods.discount); // ์ ๊ทผ ๋ถ๊ฐ (private)
console.log(goods.goodsPrint());
// ์ถ๋ ฅ: Americano์ ๊ฐ๊ฒฉ์ 4500์์ด๋ฉฐ ํด๋น ์ํ์ B์ด 9๋ฒ์ ์ง์ด๋์ด ์์ต๋๋ค.(ํ ์ธ์จ: 10%)
const discountedGoods = new DiscountedGoods("Tea", 3000, 15, 'C์ด 3๋ฒ');
console.log(discountedGoods.goodsName); // ์ ๊ทผ ๊ฐ๋ฅ (public)
console.log(discountedGoods.price); // ์ ๊ทผ ๋ถ๊ฐ (protected)
console.log(discountedGoods.discount); // ์ ๊ทผ ๋ถ๊ฐ (private)
console.log(discountedGoods.goodsPrint());
// ์ถ๋ ฅ: Tea์ ๊ฐ๊ฒฉ์ 3000์์ด๋ฉฐ, ํด๋น ์ํ์ C์ด 3๋ฒ์ ์ง์ด๋์ด ์์ต๋๋ค.(ํ ์ธ์จ: 15%)
console.log(discountedGoods.discountedPrice()); // ์ถ๋ ฅ: 2550 (3000 - 450)
์ถ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์คํด์ค๋ฅผ ์ง์ ์์ฑํ์ง ๋ชปํ๊ฒ ํ๊ณ , ํ์๋ ํด๋์ค์์ ๊ตฌํํด์ผ ํ๋ ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
abstract class AbstractGoods {
goodsName: string;
price: number;
discount: number;
position: string;
constructor(goodsName: string, price: number, discount: number, position: string) {
this.goodsName = goodsName;
this.price = price;
this.discount = discount;
this.position = position;
}
abstract goodsPrint(): string;
}
abstract
์ผ๋ก ์ถ์ ํด๋์ค๋ฅผ ์ ์ธํด์ฃผ๊ณ goodsPrint
๋ฉ์๋๋ ์ถ์ ๋ฉ์๋๋ก ์ ์ธ์ด ๋์ด ์๊ธฐ ๋๋ฌธ์ ํ์ ํด๋์ค์์ ๋ฐ๋์ ๊ตฌํํด์ผ ํฉ๋๋ค.
class Goods extends AbstractGoods {
constructor(goodsName: string, price: number, discount: number, position: string) {
super(goodsName, price, discount, position);
}
goodsPrint(): string {
return `${this.goodsName}์ ๊ฐ๊ฒฉ์ ${this.price}์์ด๋ฉฐ
ํด๋น ์ํ์ ${this.position}์ ์ง์ด๋์ด ์์ต๋๋ค.(ํ ์ธ์จ: ${this.discount}%)`;
}
}
AbstractGoos
๋ฅผ ์์๋ฐ๋ ํด๋์ค Goods
๋ฅผ ์ ์ธํ๊ณ Goods
ํด๋์ค์์ goodsPrint
ํจ์๋ฅผ ๊ตฌํํ์ฌ ์ธ์คํด์คํ ํฉ๋๋ค.
const goods = new Goods("๋์๋ฝ", 5000, 20, "D์ด 7๋ฒ");
console.log(goods.goodsPrint());
// ๋์๋ฝ์ ๊ฐ๊ฒฉ์ 5000์์ด๋ฉฐ ํด๋น ์ํ์ D์ด 7๋ฒ์ ์ง์ด๋์ด ์์ต๋๋ค.(ํ ์ธ์จ: 20%)
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๊ณต๋ถํ ๋ ํด๋์ค๊ฐ ์ด๋ ค์ ๋๋ฐ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ๊ณต๋ถํ๋ฉฐ ํด๋์ค๋ฅผ ๋ค์ ๊ณต๋ถํด๋ณด๋ ์ญ์๋ ์ด๋ ต๋ค..๐ญ