2. Class
- 객체지향 프로그래밍(OOP)를 할 때 주로 사용됌
- 프로그램의 유연하며 변경이 용이해지고 개발과 보수를 간편하게 만든다. 직관적인 코드 분석이 가능하다.
- 코드의 강한 응집력, 약한 결합력이 특징
- field, constructor, method로 이루어져 있고 이를 통틀어 member라 부른다.
- 인스턴스(instance): new 연산자에 의해 생성된 객체
class Person {
name: string;
constructor(name: string) {
this.name = name;
}
say() {
return `Hello, My name is ${this.name}`;
}
}
const p1 = new Person('park');
2.1 접근 제어자 / 상속
2.1.1 접근 제어자
- 속성 또는 메소드로의 접근을 제한하기 위해 사용한다.
- public > protected > private (package 개념이 존재하지 않기 때문에 default는 존재하지 않음)
class Animal {
public name: string;
constructor(name: string) {
this.name = name;
}
}
new Animal('cat').name;
class Animal {
private name: string;
constructor(name: string) {
this.name = name;
}
getName() {
return this.name;
}
}
new Animal('cat').name;
new Animal('dog').getName();
2.1.2 상속
- 존재하는 클래스를 확장해 새로운 클래스를 생성할 수 있음.
- 파생된 클래스는 하위클래스(subclass), 기초 클래스는 상위클래스(superclass)라고 부른다.
- 만약 부모클래스에 생성자가 있다면 자식클래스는 super()를 이용해서 반드시 호출해줘야 한다.
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
move(distance: number) {
console.log(`Animal moved ${distance}m.`);
}
}
class Dog extends Animal {
constructor(name: string) {
super(name);
}
makeSound() {
console.log('bark!');
}
}
class Cat extends Animal {
constructor(name: string) {
super(name);
}
makeSound() {
console.log('meow!');
}
}
const dog = new Dog('dog');
dog.move(10);
dog.makeSound();
const cat = new Cat('cat');
cat.move(5);
cat.makeSound();
2.2 getter & setter / readonly / static
2.2.1 getter & setter
- 비공개로 설정하려는 속성을 private로 설정하고 읽고 수정하는 getter, setter 함수를 구현하는 것
class Person {
private _name: string;
get name() {
return this._name;
}
set name(name: string) {
this._name = name;
}
}
let person = new Person();
console.log(person.name);
person.name = 'son';
2.2.2 readonly
- 읽기만 가능한 속성을 선언할 때 사용
- readonly로 설정된 값은 선언할 때나 생성자에서 초기화할 때 아니면 수정이 불가능하다.
class Person {
readonly age: number = 20;
constructor(age: number) {
this.age = age;
}
}
let person = new Person(10);
person.age = 20;
2.2.3 static
- 전역 멤버를 선언할 때 사용, 전역멤버란 객체마다 할당되지 않고 클래스의 모든 객체가 공유하는 멤버를 말한다.
class Grid {
static origin = { x:0, y:0 }
calculateDistance(): void {
console.log(Grid.origin.x * Grid.origin.y);
}
}
const grid = new Grid();
Grid.origin = { x:3, y:3 }
grid.calculateDistance();
2.3 추상 클래스(abstract class)
- 다른 클래스들이 파생될 수 있는 기초 클래스, 직접 인스턴스화 할 수 없다.
abstract class Animal {
protected name: string;
constructor(name: string) {
this.name = name;
}
abstract makeSound(): void
move(): void {
console.log('move!');
}
}
class Dog extends Animal {
constructor(name: string) {
super(name);
}
makeSound(): void {
console.log(`${this.name} 멍멍!`);
}
}
const animal = new Animal('animal')
const dog = new Dog('진돗개');
dog.makeSound();