[TypeScript] 객체지향 스타벅스
2019. 9. 17. 21:48ㆍIT/Interest
TypeScript 공부 겸 객체를 하나 구성해 보았다.
뻔한 객체는 재미가 없어서 스타벅스를 주제로 Drink 객체와 Coffee 객체를 만들었고 바닐라 라떼를 만들었다.
공들여서 짠 코드도 아니고 예외처리도 없는 재미로 짠 코드이니 그저 재미로 보면 좋을 것 같다.
Interface
Syrup
- name : enum(mocha, vanilla, caramel, dolce ...)
- sugar : boolean
- count : number
Milk
- ratios : number
- type : enum(whole, nonfat, 2 percent, soy, coconut, almond)
Struct
Drink
- size : enum(tall, grande, venti)
- type(cold, hot)
- own_cup : boolean
- takeout : boolean
Coffee
- espresso : number
- water? : number (ratio, 0-10)
- milk? : Milk
- syrup? : Syrup[]
- whipping_cream : number (amount, 0-10)
코드 (TypeScript)
Enum과 Interface
// 시럽 이름
enum syrupName{
mocha,
vanilla,
caramel,
dolce
};
// 우유 종류
enum milkType{
whole,
nonfat,
percent2, // 2 percent
soy,
coconut,
almond
};
// 음료 크기
enum drinkSize{
Tall,
Grande,
Venti
};
// 음료 타입
enum drinkType{
Cold,
Hot
};
// interface
interface Syrup{
name : syrupName; // 시럽 종류
sugar : boolean; // 설탕 유무
count : number; // 시럽 펌프 수
}
interface Milk{
type : milkType; // 우유 종류
ratios : number; // 우유 비율
}
Drink 클래스
// 음료에 대한 기본적인 정보를 담은 객체
class Drink{
size : drinkSize;
type : drinkType;
own_cup : boolean;
takeout : boolean;
constructor(size:drinkSize, type:drinkType, own_cup:boolean, takeout:boolean){
this.size = size;
this.type = type;
this.own_cup = own_cup;
this.takeout = takeout;
}
}
Coffee 클래스 (Drink를 상속받는다)
// Drink를 상속받는 Coffee
class Coffee extends Drink{
espresso : number = 1; // count of espresso shots, default 1 shot
water? : number = 0; // ratios of water(0-10)
milk? : Milk; // data of milk
syrup? : Array<Syrup> = new Array<Syrup>(); // array of Syrups
whipping_cream? : number = 0; // amount of cream(0-10)
name? : string;
constructor(size:drinkSize, type:drinkType, own_cup:boolean, takeout:boolean){
// 부모 객체 생성
super(size, type, own_cup, takeout);
console.log(this.milk);
}
addShot():void{
this.espresso++;
}
addWater(ratios?:number):void{
this.water += (ratios == undefined ? 6 : ratios); // default water is 6
}
addMilk(type:milkType, ratios?:number):void{
var milk:Milk = {
type:type,
ratios:ratios == undefined ? 4 : ratios
};
this.milk = milk;
}
addSyrup(name:syrupName, sugar:boolean, count?:number):void{
var syrup:Syrup = {
name:name,
sugar:sugar,
count:count == undefined ? 2 : count // default count is 2
};
this.syrup.push(syrup);
}
addWhip(count:number):void{
this.whipping_cream += count;
}
setName(name:string):void{
this.name = name;
}
getMilkInfo():string{
if (this.milk == undefined) {
return "X";
}
return `${milkType[this.milk.type]} (${this.milk.ratios} / 10)`;
}
getSyrupInfo():string{
if (this.syrup.length == 0) {
return "X";
}
var infos : string = "";
this.syrup.forEach(function(syrup){
if (infos.length > 0) infos += " / ";
infos += `${syrup.sugar ? '' : 'Non-'}Sugar ${syrupName[syrup.name]} ${syrup.count} Pump${syrup.count > 1 ? 's' : ''}`;
});
return infos;
}
done():void{
// print coffee info
console.log(`${this.name}'s Coffee is Ready!`);
console.log("========== INFO ==========");
console.log(`Espresso : ${this.espresso} shots`);
console.log(`Water : ${this.water} / 10`);
console.log(`Milk : ${this.getMilkInfo()}`);
console.log(`Syrup : ${this.getSyrupInfo()}`);
console.log(`Whipping Cream : ${this.whipping_cream} / 10`);
console.log("==========================");
}
}
커피 만들기
// 그란데 사이즈, 차가운 음료, 개인컵X, 테이크아웃 O
var vanillaLatte = new Coffee(drinkSize.Grande, drinkType.Cold, false, true);
vanillaLatte.addShot(); // 샷 추가
vanillaLatte.addWater(); // 물 추가(기본 비율)
vanillaLatte.addMilk(milkType.percent2, 3); // 우유 추가(2Percent, 비율 3)
vanillaLatte.addSyrup(syrupName.vanilla, false, 3); // 바닐라 시럽 추가(3 펌프, 무설탕)
vanillaLatte.addWhip(2); // 휘핑크림 조금 추가
vanillaLatte.setName("Kent"); // 이름 등록
vanillaLatte.done(); // 바닐라 라떼 완성!
끝으로
TypeScript 연습을 위해 장난으로 스타벅스 객체를 구성해 보았는데 기존에 지루했던 Car - Bus, Suv 이런 객체를 만들 때 보다 훨씬 재미있었다. 앞으로 이런 식으로 재미있게 공부하면 더욱 좋을 것 같다.
'IT > Interest' 카테고리의 다른 글
[Notion] 커스텀 도메인 이미지 오류 수정 (4) | 2020.09.06 |
---|---|
[iOS 단축어] 다회용 렌즈 사용 기록 (0) | 2019.12.19 |
[TypeScript] Object, Interface, Class (0) | 2019.09.14 |
[TypeScript] 타입스크립트 시작하기 (2) | 2019.09.01 |