What are Classes
class?
- object 를 만드는 blueprint(청사진, 설계도)
- 클래스 이전에 object 를 만드는 기본적인 방법은 fucntion
- JavaScript 에도 class 는 es6 부터 사용 가능
- OOP 을 위한 초석
- TypeScript 에서는 클래스도 사용자가 만드는 타입의 하나
Quick Start - class
class Person {}
const p1 = new Person();
console.log(p1);
"use strict";
var Person = (function () {
function Person() {
}
return Person;
}());
var p1 = new Person();
console.log(p1);
"use strict";
class Person {
}
const p1 = new Person();
console.log(p1);
class Person {
name;
constructor(name: string) {
this.name = name;
}
}
const p1 = new Person("Mark");
console.log(p1);
- class 키워드를 이용하여 클래스를 만들 수 있다.
- class 이름은 보통 대문자를 이용한다.
- new 를 이용하여 class 를 통해 object 를 만들 수 있다.
- constructor 를 이용하여 object 를 생성하면서 값을 전달할 수 있다.
- this 를 이용해서 만들어진 object 를 가리킬 수 있다.
- JS 로 컴파일되면 es5 의 경우 function 으로 변경된다.
constructor & initialize
class Person {
name: string;
age: number;
}
class Person {
name: string = "Mark";
age: number = 39;
}
const p1: Person = new Person();
console.log(p1);
console.log(p1.age);
class Person {
name: string = "Mark";
age: number;
}
const p1: Person = new Person();
console.log(p1.age);
class Person {
name: string = "Mark";
age!: number;
}
const p1: Person = new Person();
p1.age = 39;
console.log(p1.age);
class Person {
name: string = "Mark";
age: number;
constructor(age?: number) {
if(age === undefined) {
this.age = 20;
} else {
this.age = age;
}
}
}
const p1: Person = new Person(39);
const p2: Person = new Person();
console.log(p1);
console.log(p1.age);
class Person {
name: string = "Mark";
age!: number;
constructor(age?: number) {
if(age === undefined) {
this.age = 20;
} else {
this.age = age;
}
}
async init() {
}
}
const p1: Person = new Person(39);
const p2: Person = new Person();
console.log(p1);
console.log(p1.age);
- 생성자 함수가 없으면, 디폴트 생성자가 불린다.
- 프로그래머가 만든 생성자가 하나라도 있으면, 디폴트 생성자는 사라진다.
- strict 모드에서는 프로퍼티를 선언하는 곳 또는 생성자에서 값을 할당해야 한다.
- property 를 선언하는 곳 또는 생성자에서 값을 할당하지 않는 경우에는 !를 붙여서 위험을 표현한다.
- 클래스의 property 가 정의되어 있지만, 값을 대입하지 않으면 undefined 이다.
- 생성자에는 async 를 설정할 수 없다.
접근제어자(Access Modifiers)
class Person {
public name: string = "Mark";
public age!: number;
public constructor(age?: number) {
if(age === undefined) {
this.age = 20;
} else {
this.age = age;
}
}
public async init() {}
}
const p1: Person = new Person(39);
console.log(p1);
class Person {
public name: string = "Mark";
public age!: number;
private constructor(age?: number) {
if(age === undefined) {
this.age = 20;
} else {
this.age = age;
}
}
public async init() {}
}
const p1: Person = new Person(39);
console.log(p1);
class Person {
public name: string = "Mark";
private _age!: number;
public constructor(age?: number) {
if(age === undefined) {
this.age = 20;
} else {
this.age = age;
}
}
public async init() {}
}
const p1: Person = new Person(39);
console.log(p1.age);
- 접근 제어자에는 public, private, protected 가 있다.
- 설정하지 않으면 public 이다
- 클래스 내부의 모든 곳에서 (생성자, 프로퍼티, 메서드) 설정 가능하다.
- private 으로 설정하면 클래스 외부에서 접근할 수 없다.
- JavaScript 에서 private 를 지원하지 않아 오랫동안 property 나 method 이름 앞에 _ 를 붙여서 표현했다.
initialization in constructor parameters
class Person {
public constructor(public name: string, public age: number) {}
}
const p1: Person = new Person("Mark", 39);
console.log(p1);
class Person {
public constructor(public name: string, private age: number) {}
}
const p1: Person = new Person("Mark", 39);
console.log(p1);
console.log(p1.age);
Getters & Setters
class Person {
public constructor(public name: string, private age: number) {}
}
const p1: Person = new Person("Mark", 39);
console.log(p1.name);
p1.name = "Anna";
class Person {
public constructor(public _name: string, private age: number) {}
get name() {
console.log('get');
return this._name;
}
set name(n: string) {
console.log('set');
this._name = n;
}
}
const p1: Person = new Person("Mark", 39);
console.log(p1.name);
p1.name = "Anna";
console.log(p1.name);
class Person {
public constructor(private _name: string, private age: number) {}
get name() {
return this._name + "Lee";
}
set name(n: string) {
console.log('set');
this._name = n;
}
}
const p1: Person = new Person("Mark", 39);
console.log(p1.name);
p1.name = "Anna";
console.log(p1.name);
class Person {
public constructor(private _name: string, private age: number) {}
set name(n: string) {
this._name = n;
}
}
const p1: Person = new Person("Mark", 39);
console.log(p1.name);
p1.name = "Anna";
console.log(p1.name);
class Person {
public constructor(private _name: string, private age: number) {}
get name() {
return this._name + "Lee";
}
}
const p1: Person = new Person("Mark", 39);
console.log(p1.name);
p1.name = "Anna";
console.log(p1.name);