Class?
서로 관련 있는 data, 기능을 모아주는 역할 ! template
만들기 !
constructor( )
는 object
/ instance
를 만들 때 항상 호출되는 함수이다.
✅ class, object, instance
class
: 객체가 가지는 속성( 필드 )와 동작( 메서드 )으로 이루어져 있다object
: 물리적/추상적인 모든 것에서 자신의 속성을 가지고 있고, 다른 것과 식별 가능한 것instance
: 클래스를 사용하여Heap Area
에 새로운instance
생성
즉, 현실의 객체를 소프트웨어 내에서 구현한 실체 !
대체로object
와instance
는 혼용되어 표현됨
member variable
멤버 변수: 클래스가 한번 정의되고 클래스 사이에서 공유될 수 있는 data
-> 새로운 instance
마다 계속 다시 호출 및 저장되므로 메모리가 낭비될 가능성 ⬆
static
키워드를 통해 선언된 변수, object 마다 생성되지 않도록 !this.
대신 class명.
static
이 아닌 변수public: 기본 !
private: 외부 조회/접근 불가한 data
protected: 외부에서는 접근/조회가 불가하나 이 class를 상속한 자식 class에서는 접근 가능
setter/getter: 일반 멤버 변수처럼 사용이 가능하지만 어떤 계산이 필요할 때 사용됨
interface
✅
interface에서 규정해 놓은 것을 implements( 구현 ) 하는 class는 반드시 해당하는 내용을 모두 구현해야 함
implements
interface
를 구현하는 class !
// interface 와 implements 사용 예시 !
type Coffee = {
shots: number;
addWater: boolean;
};
interface CoffeeMaker {
makeCoffee(shots: number): Coffee;
}
class CoffeeMachine implements CoffeeMaker {
private makeAmericano(shots: number): Coffee{
console.log(`Making Americano... ☕️`);
return {
shots, // 값이 중복될 경우 생략할 수 있음 ex) shots: shots
addWater: true,
};
makeCoffee(shots: number): Coffee {
return this.makeAmericano(shots);
}
extends
extends
로 다른 class를 상속한 자식 class에서 다른 constructor
를 생성할 경우?super( );
-> 반드시 super
로 호출해야 한다 !class CoffeeMachine implements CoffeeMaker {
public constructor(coffeeBeans: number) {
this.coffeeBeans = coffeeBeans;
}
// ...code
}
class CaffeLatteMachine extends CoffeeMachine {
constructor(beans: number, serialNumber: string) {
super(beans);
}
inheritance / polymorphism
inheritance( 상속 )
, polymorphism( 다형성 )
을 활용하면 내부적으로 구현된 class들이 한가지 interface를 구현하거나 하나의 부모를 상속했을 때, 동일한 함수를 어떤 class인지 구분하지 않고 공통된 API를 호출할 수 있다 ! 하나의 interface나 부모를 상속한 자식 class들이 interface나 부모안의 함수들을 다른 방식으로 다양하게 구성함으로써 다형성을 만들 수 있다.
하지만 상속의 깊이가 깊어질 수록 서로간의 관계가 점점 복잡해지고, 상속은 수직적인 관계를 형성하는 것이므로 부모 class의 행동을 수정할 경우 이 수정사항으로 인해 이것을 상속하는 모든 자식 class에 영향을 줄 수 있다. 이는 유지보수에 있어, 치명적인 단점으로 이어진다 !
또한 새로운 기능을 도입하고자 할 때 상속 구조를 어떻게 가져올 지에 대한 깊은 고민이 필요하다. 그리고 typeScript
는 하나의 부모만 상속이 가능하다 !
✅
상위 클래스의 구현이 하위 클래스에게 노출되는 상속은 캡슐화를 깨뜨린다.
캡슐화가 깨짐으로써 하위 클래스가 상위 클래스에 강하게 결합, 의존하게 되고
강한 결합, 의존은 변화에 유연하게 대처하기 어려워진다.
composition
composition
: 구성, 구성요소들inheritance
/ polymorphism
의 단점을 보완/개선한 방법interface
를 활용하여 decoupling 할 수 있도록 한다 !dependency injection
composition
개념을 활용할 때 각각의 class들의 결합도를 낮추기 위해 활용된다 !