interface IBufferWriter {
write(what: string);
}
class ConsoleWriter extends IBufferWriter {
write(what: string) {
console.log(what);
}
}

interface IStringGenerator {
gen(): string;
}
class Begooni extends IStringGenerator {
gen(minDots, maxDots, minExcls, maxExcls) {
return '하' +
'.'.repeat(Math.random() * (maxDots - minDots) + minDots) +
' 백군이형' +
'!'.repeat(Math.random() * (maxExcls - minExcls) + minExcls)
}
}

class StringPrinterService {
constructor(
private generator: IStringGenerator,
private target: IBufferWriter,
) {}

exec() {
this.target.write(this.generator());
}
}

const sibal = new StringPrinterService(new ConsoleWriter(), new Begooni())
sibal.exec();