[TypeScript] 객체지향 스타벅스

2019. 9. 17. 21:48IT/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 이런 객체를 만들 때 보다 훨씬 재미있었다. 앞으로 이런 식으로 재미있게 공부하면 더욱 좋을 것 같다.