일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 자바스크립트
- 모던 자바스크립트
- api 비동기처리
- TypeORM
- 프론트엔드 과제
- bucket4j
- concurrency limit
- 프리코스
- 유효시간 설정 url
- AWS
- 우아한 테크코스
- Deep Dive
- compateto
- redis
- invalid_grant
- Dev-Matching
- 음악 url 파일 다운로드
- 우아한테크코스
- 프로그래머스
- 코멘토 #코멘토실무PT #실무PT후기 #실무강의 #리액트강의 #웹프로그래밍 #react #웹개발실무
- 프론트엔드
- 파일 url
- NestJS
- api 요청 수 제한
- 스프링부트
- 검색
- this
- 딥다이브
- oauth
- 타입스크립트
- Today
- Total
개발 알다가도 모르겠네요
타입스크립트의 Class 본문
ES6 클래스는 클래스 몸체에 메소드만을 포함할 수 있습니다.
클래스 몸체에 클래스 프로퍼티를 선언할 수 없고 반드시 생성자 내부에서 클래스 프로퍼티를 선언하고 초기화합니다.
// person.js
class Person {
constructor(name) {
// 클래스 프로퍼티의 선언과 초기화
this.name = name;
}
walk() {
console.log(`${this.name} is walking.`);
}
}
Typescript 클래스는 클래스 몸체에 클래스 프로퍼티를 사전 선언해야 합니다.
// person.ts
class Person {
// 클래스 프로퍼티를 사전 선언하여야 한다
name: string;
constructor(name: string) {
// 클래스 프로퍼티수에 값을 할당
this.name = name;
}
walk() {
console.log(`${this.name} is walking.`);
}
}
const person = new Person('Lee');
person.walk(); // Lee is walking
접근 제한자
Typescript 클래스는 접근 제한자 public, private, protected 를 지원하며 의미 또한 기본적으로 동일합니다.
Typescript의 경우, 접근 제한자를 생략한 클래스 프로퍼티와 메소드는 암묵적으로 public이 선언됩니다.
따라서 public으로 지정하고자 하는 멤버 변수와 메소드는 접근 제한자를 생략합니다.
접근 가능성 | public | protected | private |
클래스 내부 | O | O | O |
자식 클래스 내부 | O | O | X |
클래스 인스턴스 | O | X | X |
생성자 파라미터에 접근 제한자 선언
접근 제한자는 생성자 파라미터에도 선언할 수 있습니다.
접근 제한자가 사용된 생성자 파라미터는 암묵적으로 클래스 프로퍼티로 선언되고 생성자 내부에서 별도의 초기화가 없어도 암묵적으로 초기화가 수행됩니다.
class Foo {
/*
접근 제한자가 선언된 생성자 파라미터 x는 클래스 프로퍼티로 선언되고 지동으로 초기화된다.
public이 선언되었으므로 x는 클래스 외부에서도 참조가 가능하다.
*/
constructor(public x: string) { }
}
const foo = new Foo('Hello');
console.log(foo); // Foo { x: 'Hello' }
console.log(foo.x); // Hello
class Bar {
/*
접근 제한자가 선언된 생성자 파라미터 x는 멤버 변수로 선언되고 자동으로 초기화된다.
private이 선언되었으므로 x는 클래스 내부에서만 참조 가능하다.
*/
constructor(private x: string) { }
}
const bar = new Bar('Hello');
console.log(bar); // Bar { x: 'Hello' }
// private이 선언된 bar.x는 클래스 내부에서만 참조 가능하다
console.log(bar.x); // Property 'x' is private and only accessible within class 'Bar'.
readonly 키워드
readonly가 선언된 클래스 프로퍼티는 선언 시 또는 생성자 내부에서만 값을 할당할 수 있습니다.
그 외의 경우에는 값을 할당할 수 없고 오직 읽기만 가능한 상태가 되며 이를 이용하여 상수의 선언에 사용합니다.
class Foo {
private readonly MAX_LEN: number = 5;
private readonly MSG: string;
constructor() {
this.MSG = 'hello';
}
log() {
// readonly가 선언된 프로퍼티는 재할당이 금지된다.
this.MAX_LEN = 10; // Cannot assign to 'MAX_LEN' because it is a constant or a read-only property.
this.MSG = 'Hi'; // Cannot assign to 'MSG' because it is a constant or a read-only property.
console.log(`MAX_LEN: ${this.MAX_LEN}`); // MAX_LEN: 5
console.log(`MSG: ${this.MSG}`); // MSG: hello
}
}
new Foo().log();
static 키워드
ES6 클래스에서 static 키워드는 클래스의 정적(static) 메소드를 정의합니다.
정적 메소드는 클래스의 인스턴스가 아닌 클래스 이름으로 호출되며 클래스의 인스턴스를 생성하지 않아도 호출할 수 있습니다.
class Foo {
constructor(prop) {
this.prop = prop;
}
static staticMethod() {
/*
정적 메소드는 this를 사용할 수 없다.
정적 메소드 내부에서 this는 클래스의 인스턴스가 아닌 클래스 자신을 가리킨다.
*/
return 'staticMethod';
}
prototypeMethod() {
return this.prop;
}
}
// 정적 메소드는 클래스 이름으로 호출한다.
console.log(Foo.staticMethod());
const foo = new Foo(123);
// 정적 메소드는 인스턴스로 호출할 수 없다.
console.log(foo.staticMethod()); // Uncaught TypeError: foo.staticMethod is not a function
Typescript에서는 static 키워드를 클래스 프로퍼티에도 사용할 수 있습니다.
정적 클래스 프로퍼티 또한 인스턴스가 아닌 클래스 이름으로 호출하며 클래스의 인스턴스를 생성하지 않아도 호출할 수 있습니다.
class Foo {
// 생성된 인스턴스의 갯수
static instanceCounter = 0;
constructor() {
// 생성자가 호출될 때마다 카운터를 1씩 증가시킨다.
Foo.instanceCounter++;
}
}
var foo1 = new Foo();
var foo2 = new Foo();
console.log(Foo.instanceCounter); // 2
console.log(foo2.instanceCounter); // error TS2339: Property 'instanceCounter' does not exist on type 'Foo'.
추상 클래스
추상 클래스(abstract class)는 하나 이상의 추상 메소드를 포함하며 일반 메소드도 포함할 수 있습니다.
추상 메소드는 내용이 없이 메소드 이름과 타입만이 선언된 메소드를 말하며 선언할 때 abstract 키워드를 사용합니다.
추상 클래스를 정의할 때는 abstract 키워드를 사용하며, 직접 인스턴스를 생성할 수 없고 상속만을 위해 사용됩니다.
추상 클래스를 상속한 클래스는 추상 클래스의 추상 메소드를 반드시 구현하여야 한다.
abstract class Animal {
// 추상 메소드
abstract makeSound(): void;
// 일반 메소드
move(): void {
console.log('roaming the earth...');
}
}
// 직접 인스턴스를 생성할 수 없다.
// new Animal();
// error TS2511: Cannot create an instance of the abstract class 'Animal'.
class Dog extends Animal {
// 추상 클래스를 상속한 클래스는 추상 클래스의 추상 메소드를 반드시 구현하여야 한다
makeSound() {
console.log('bowwow~~');
}
}
const myDog = new Dog();
myDog.makeSound();
myDog.move();
'웹 > Typescript' 카테고리의 다른 글
타입스크립트의 Enum (0) | 2022.06.19 |
---|---|
타입스크립트의 함수 (0) | 2022.06.18 |
타입스크립트의 인터페이스 (0) | 2022.06.18 |
타입스크립트의 제네릭 (0) | 2022.06.18 |
타입스크립트란 무엇인가? (0) | 2022.06.17 |