[TypeScript] 타입스크립트 클래스 사용하기 - 상속, 추상 클래스, 추상 클래스를 활용한 디자인 패턴(Template Method Pattern)
글 작성자: 망고좋아
반응형
🎯 TypeScript 클래스 사용하기
class Person {
name: string; // 객체와 달리 쉼표가 아닌 것에 유의!!
constructor(name: string) {
this.name = name; // 이 클래스의 생성자로 처음 클래스가 만들어질 때 해당 구문이 실행됨!
}
say() {
return "안녕 " + this.name
} // 클래스 내부의 메서드(객체 내부의 함수)는 일반적인 함수와 유사하게 선언함
}
let person = new Person("John");
- new를 사용하여 Person 클래스의 인스턴스 생성
- Person class의 필드는 name
- 생성자 constructor
- 메소드 say()가 있다.
- 클래스 안에
this.
를 앞에 붙이면 클래스 필드를 의미
📝 클래스 상속받기
class Person {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
introduce(): void {
console.log(`이름은 ${this.name}이며 나이는 ${this.age}입니다.`);
}
}
class man extends Person {
sex: string; // 추가적인 데이터에 한해서만 넣으면 된다.
constructor(name: string, age: number) {
super(name, age); // 상위 클래스의 생성자를 활용할 경우, super 키워드 사용
this.sex = "남자";
}
// 하위 클래스에서 메소드를 다시 정의하는 것을 오버라이딩이
introduce(): void {
console.log(`이름은 ${this.name}이며 나이는 ${this.age}이며 성별은 ${this.sex}입니다.`);
} // 기존 클래스 생성자, 메서드 등을 변경할 수 있다.
}
const test: man = new man('홍길동', 20);
console.log(test.introduce()); // "이름은 홍길동이며 나이는 20이며 성별은 남자입니다.
- 클래스를 활용하여 객체를 만들 수 있지만, 또 다른 클래스도 만들 수 있음 => 상속
- OOP는 상속을 이용하여 존재하는 클래스를 확장해 새로운 클래스를 생성할 수 있다.
extends
키워드 사용- 기존 클래스의 정보를 모두 살리고, 추가적인 정보를 넣을 수 있다.
- 파생된 클래스는 하위 클래스(subclass), 기초 클래스는 상위 클래스(superclass)라고 부른다.
- 즉, 기존 거를 받고 새로운 것을 추가해서 새로운 클래스 생성
super()
꼭 작성!
📝 추상 클래스(Abstract Class)
abstract class Developer {
// 추상 메서드
abstract coding(): void; // 'abstract'가 붙으면 상속 받은 클래스에서 무조건 구현해야 함
// 일반 메서드
drink(): void {
console.log('drink sth');
}
} // 직접 인스턴스를 생성할 수 없다.
class FrontEndDeveloper extends Developer {
coding(): void {
// 추상 클래스를 상속한 클래스는 추상 클래스의 추상 메소드를 반드시 구현하여야 한다
console.log('develop web');
}
design(): void {
console.log('design web');
}
}
const dev = new Developer(); // error: cannot create an instance of an abstract class
const josh = new FrontEndDeveloper();
josh.coding(); // develop web
josh.drink(); // drink sth
josh.design(); // design web
abstract class Animal {
protected name: string
constructor(name: string) {
this.name = name
}
abstract makeSound(): void
}
class Dog extends Animal {
constructor(name: string) {
super(name);
}
makeSound(): void {
console.log(`${this.name} 멍멍!!`)
}
}
const dog = new Dog("진돗개")
dog.makeSound(); // 진돗개 멍멍!!
abstract class Department {
constructor(public name: string) {}
printName(): void {
console.log("Department name: " + this.name);
}
abstract printMeeting(): void; // 반드시 파생된 클래스에서 구현되어야 합니다.
}
class AccountingDepartment extends Department {
constructor() {
super("Accounting and Auditing"); // 파생된 클래스의 생성자는 반드시 super()를 호출해야 합니다.
}
printMeeting(): void {
console.log("The Accounting Department meets each Monday at 10am.");
}
generateReports(): void {
console.log("Generating accounting reports...");
}
}
let department: Department; // 추상 타입의 레퍼런스를 생성합니다
department = new Department(); // 오류: 추상 클래스는 인스턴스화 할 수 없습니다
department = new AccountingDepartment(); // 추상이 아닌 하위 클래스를 생성하고 할당합니다
department.printName();
department.printMeeting();
department.generateReports(); // 오류: 선언된 추상 타입에 메서드가 존재하지 않습니다
- 추상 클래스는 다른 클래스들이 파생될 수 있는 기초 클래스이다.
- 상속을 강제하게 됨
- 작은 규모의 프로젝트에서는 거의 없음
- 직접 인스턴스화 할 수 없다.
abstract
키워드는 추상 클래스뿐만 아니라 추상 클래스 내에서 추상 메서드를 정의하는 데 사용된다.- 추상 메소드는 클래스에 구현되어 있지 않고, 파생된 클래스에서 구현해야 한다.
- 추상 클래스(abstract class)는 하나 이상의 추상 메소드를 포함하며 일반 메소드도 포함할 수 있다.
- 추상 메소드는 내용이 없이 메소드 이름과 타입만이 선언된 메소드를 말하며 선언할 때
abstract
키워드를 사용한다. => 추상 클래스는 다른 클래스들이 파생될 수 있는 기초 클래스이다. - 추상 클래스를 정의할 때는
abstract
키워드를 사용하며, 직접 인스턴스를 생성할 수 없고 상속만을 위해 사용된다. =>abstract
클래스를 사용할 경우, 해당 클래스로 직접 객체를 만들 수 없다. - 추상 클래스를 상속한 클래스는 추상 클래스의 추상 메소드를 반드시 구현하여야 한다.
📝 추상 클래스를 활용한 디자인 패턴(Template Method Pattern)
📕 디자인 패턴이란?
- 소프트웨어 설계 시 공통으로 발생되는 문제에 대해 자주 쓰이는 설계 방법을 정리한 것
- 디자인 패턴을 사용하면 개발의 효율성, 유지 보수성, 운용성이 높아져 프로그램 최적화에 도움이 됨
abstract class Parent {
// 템플릿 메소드 : 자식에서 공통적으로 사용하는 부분(someMethod)
public do() {
console.log("Parent에서 실행 - 상");
this.hook(); // 훅 메소드 : Child에서 구현해야 할 부분
console.log("Parent에서 실행 - 하");
}
abstract hook(): void
}
class Child extends Parent {
hook(): void {
console.log("Child");
}
}
const child = new Child();
child.do();
// 실행 결과
// Parent에서 실행 - 상
// Child
// Parent에서 실행 - 하
- 템플릿 메소드 패턴, 소프트웨어 공학에서 동작상의 알고리즘 프로그램 뼈대를 정의하는 행위
- 상위 클래스(추상 클래스)에서 추상 메서드를 통해 기능의 골격 제공, 하위 클래스(구체 클래스) 메서드의 세부처리 구체화
- 즉, 전체적인 알고리즘은 상위 클래스에서 구현하고 다른 부분은 하위 클래스에서 구현한다.
- 프로그램의 일부분을 서브 클래스로 캡슐화해 전체 구조를 바꾸지 않고 특정 단계의 기능을 바꾸는 것을 디자인 패턴이라고 한다.
- 전체 구조는 유사하지만 부분적으로 다른 구문으로 구성된 메소드의 코드 중복을 최소 할 수 있다.
📌 참고
반응형
'프로그래밍 > TypeScript' 카테고리의 다른 글
[TypeScript] 타입스크립트 Getter & Setter / readonly / static (0) | 2021.11.24 |
---|---|
[TypeScript] 타입스크립트 Class 접근 제어자 (0) | 2021.11.24 |
[TypeScript] 타입스크립트 함수 사용하기 (0) | 2021.11.24 |
[TypeScript] 타입스크립트 인터페이스(interface)와 타입 별칭 (alias) (0) | 2021.11.24 |
[TypeScript] 타입스크립트 12개 타입 (0) | 2021.11.23 |
댓글
이 글 공유하기
다른 글
-
[TypeScript] 타입스크립트 Getter & Setter / readonly / static
[TypeScript] 타입스크립트 Getter & Setter / readonly / static
2021.11.24 -
[TypeScript] 타입스크립트 Class 접근 제어자
[TypeScript] 타입스크립트 Class 접근 제어자
2021.11.24 -
[TypeScript] 타입스크립트 함수 사용하기
[TypeScript] 타입스크립트 함수 사용하기
2021.11.24 -
[TypeScript] 타입스크립트 인터페이스(interface)와 타입 별칭 (alias)
[TypeScript] 타입스크립트 인터페이스(interface)와 타입 별칭 (alias)
2021.11.24