enum과 객체 리터럴
- enum 상수 값을 그룹화해서 관리할 때 사용
- 컴파일 시에 자동으로 숫자 값으로 매핑되기 때문에 값을 할당할 필요 없
- 객체 리터럴은 복잡한 구조와 데이터 타입을 사용해야 할 때 사용
- 어떤 타입의 값도 대입 가능
유틸리티 타입
- Partial<T>
- 기존 타입의 일부 속성만 제공하는 객체 생성시 사용
- 기존 속성이 name, age일 경우 >> name / age / name, age 세 가지 경우 가능
- Required<T>
- T 타입 객체에 정의된 모든 속성이 반드시 전부 제공되는 객체 생성시 사용
- Readonly<T>
- 타입 T의 모든 속성을 읽기 전용으로 만듦 : 완전한 불변 객체 취급
- Pick<T, K>
- 타입 T에서 K 속성들만 선택하여 새로운 타입을 만듦
- Omit<T, K>
- 타입 T에서 K 속성들만 제외하여 새로운 타입을 만듦
- Pick으로 사용할 속성을 선택하는 것보다 사용하지 않을 속성을 제거하는 것이 더 편리할 때 사용
클래스
객체를 만들기 위한 틀
같은 종류의 객체들이 공통으로 가지는 속성과 메서드를 정의한다.
- 속성 (attribute) : 객체의 성질
- 메서드 (method) : 객체의 성질을 변화시키거나 객체에서 제공하는 기능들을 사용
- 객체 : 클래스를 기반으로 생성되며 클래스의 인스턴스(instance)라고도 한다.
클래스 접근 제한자
- public
- 클래스 외부에서도 접근이 가능
- 선언이 안된 경우 기본적으로 public
- private
- 클래스 내부에서만 접근 가능
- 보통 private로 설정하는 경우가 많음
- getter / setter 메서드로 클래스의 속성을 보거나 편집할 수 있음
- protected
- 클래스 내부와 상속받은 자식 클래스에서만 접근 가능
클래스 상속
- 기존 클래스 속성과 메서드를 물려받아 새로운 클래스 정의할 수 있음
- extends 키워드 사용
- super 키워드를 통해 부모 클래스를 참조할 수 있음
- 오버라이딩
- upcasting : 타입 변환이 암시적으로 이루어짐
- downcasting : as 키워드로 명시적으로 타입 변환을 해야함 (서브타입의 메서드를 사용해야 할 경우...)
추상 클래스
인스턴스화를 할 수 없는 클래스
- 상속을 통해 자식 클래스에서 메서드를 제각각 구현하도록 강제하는 용도
- 핵심 기능 구현을 전부 자식 클래스로 위임하는 것
- abstract 키워드
- 1개 이상의 추상 함수가 있는 것이 일반
abstract class Shape {
abstract getArea(): number;
}
}
Shape 클래스를 상속 받은 자식 클래스들은 반드시 getArea 함수를 구현해야 한다!
인터페이스
객체가 가져야 하는 속성과 메서드를 정의
추상 클래스와 인터페이스의 차이
- 인터페이스는 기본 구현 제공 X
- 인터페이스는 다중 상속 지원 >> 하나의 클래스는 여러 인터페이스를 구현할 수 있음
- 추상 클래스를 상속받은 자식 클래스는 반드시 추상 함수를 구현해야 함
- 인터페이스를 구현하는 클래스는 인터페이스에 정의된 모든 메서드를 전부 구현해야 한다.
- 기본 구현을 제공하고 상속을 통해 확장하고 싶다면, 추상 클래스
- 객체가 특정 구조를 준수하도록 강제하고 싶다면, 인터페이스
객체 지향 설계 원칙 S.O.L.I.D
- S(SRP) 원칙
- 클래스는 하나의 책임만 가져하 한다.
- 유저 서비스라면 유저 관련된 액션만 해야하는 것
- O(OCP) 개방 폐쇄 원칙
- 확장에 대해서는 열려있고, 수정에 대해서는 닫혀 있어야 한다.
- 기존 코드를 변경하지 않고도 기능 확장할 수 있어야 한다.
- 인터페이스 또는 상속
- L(LSP) 리스코프 치환 원칙
- 서브타입은 기반이 되는 슈퍼타입을 대체할 수 있어야 한다.
- 자식 클래스는 부모 클래스의 기능을 수정하지 않아도 부모 클래스와 호환되어야 한다.
- I(ISP) 인터페이스 분리 원칙
- 클래스는 자신이 사용하지 않는 인터페이스의 영향을 받디 않아야 한다.
- 인터페이스를 필요한 만큼만 정의하는 것
- D(DIP) 의존성 역전 원칙
- 상위 수준 모듈(인터페이스)에 의존 해야한다.