OOP 코딩하기 !

Yeonn·2023년 8월 23일
0

TypeScript

목록 보기
4/4
post-thumbnail

Class?

서로 관련 있는 data, 기능을 모아주는 역할 ! template 만들기 !
constructor( )object / instance를 만들 때 항상 호출되는 함수이다.

✅ class, object, instance

  • class: 객체가 가지는 속성( 필드 )와 동작( 메서드 )으로 이루어져 있다
  • object: 물리적/추상적인 모든 것에서 자신의 속성을 가지고 있고, 다른 것과 식별 가능한 것
  • instance: 클래스를 사용하여 Heap Area에 새로운 instance 생성
    즉, 현실의 객체를 소프트웨어 내에서 구현한 실체 !
    대체로 objectinstance는 혼용되어 표현됨

member variable

멤버 변수: 클래스가 한번 정의되고 클래스 사이에서 공유될 수 있는 data
-> 새로운 instance마다 계속 다시 호출 및 저장되므로 메모리가 낭비될 가능성 ⬆

  • class level: static 키워드를 통해 선언된 변수, object 마다 생성되지 않도록 !
    - 부를 때는 this.대신 class명.
  • instance(object level): static이 아닌 변수

접근 제어자를 통한 ( Encapsulation ) 추상화

클래스 정보 은닉화

  • 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

  • 다른 class를 상속할 때 !
  • 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의 단점을 보완/개선한 방법
  • 기능 별로 class를 구현하여 코드의 재사용성을 높여준다.
  • 기존 class가 새로운 class의 구성요소로 쓰이고 새로운 class를 만들어 private 필드로 기존 클래스의 인스턴스를 참조한다.
  • class 와 class 사이에 coupling 이 발생? -> 앞의 커플된 class 수정 시 이후 class 모두 업데이트가 필요 ! 😤
  • 그러므로 ! class 끼리의 상호작용은 class 를 직접적으로 호출하지 않고 interface를 활용하여 decoupling 할 수 있도록 한다 !

dependency injection

  • 의존성 주입: 하나의 객체가 다른 객체의 의존성을 제공하는 테크닉 !
  • 각각의 class 에서는 필요한 것을 매번 구현하는 것이 아니라 각각의 기능별로 class를 따로 만들어둠으로써 필요한 곳에서 불러와서 사용한다 !
  • composition개념을 활용할 때 각각의 class들의 결합도를 낮추기 위해 활용된다 !

0개의 댓글