// 상속 방식 — 부모 변경이 자식에 영향을 줌classAnimal{move(){console.log('이동');}}classBirdextendsAnimal{fly(){console.log('날기');}}classDogextendsAnimal{swim(){console.log('수영');}}// FlyingFish는 날기도 하고 수영도 해야 하는데// 단일 상속만 가능하므로 표현이 어렵다
// 기능을 독립 인터페이스로 분리interfaceFlyable{fly():void;}interfaceSwimmable{swim():void;}// 기능 구현체classFlyBehaviorimplementsFlyable{fly(){console.log('날개로 날기');}}classSwimBehaviorimplementsSwimmable{swim(){console.log('지느러미로 수영');}}// 조합으로 FlyingFish 구성classFlyingFish{private flyer: Flyable;private swimmer: Swimmable;constructor(){this.flyer =newFlyBehavior();this.swimmer =newSwimBehavior();}fly(){this.flyer.fly();}swim(){this.swimmer.swim();}}const fish =newFlyingFish();fish.fly();// 날개로 날기fish.swim();// 지느러미로 수영
interfaceLogger{log(message:string):void;}classConsoleLoggerimplementsLogger{log(message:string){console.log(`[LOG] ${message}`);}}classUserService{constructor(private logger: Logger){}createUser(name:string){// 로직 수행this.logger.log(`사용자 생성: ${name}`);}}const service =newUserService(newConsoleLogger());service.createUser('홍길동');