class Person {
name:string;
constructor(name:string){
this.name=name;
}
say(){
return `hello, my name is ${this.name}`
}
}
let person = new Person('Kim');
: 속성 또는 메소드로의 접근을 제한하기 위해 사용
class Animal{
public name:string;
constructor(theName:string){
this.name=theName;
}
}
new Animal('cat').name;
class Animal{
private name:string;
constructor(theName:string){
this.name=theName;
}
}
new Animal('cat').name; // error
class Person {
protected name : string
constructor(name:string){
this.name=name;
}
}
class Employee extends Person{
private department : string
constructor(name:string,department:string){
super(name);
this.department=department;
}
public getElevatorPitch(){
return `hello my name is ${this.name} and I work in ${this.department}`
}
}
let howard = new Employee('howard','sales');
console.log(howard.getElevatorPitch()); // 인스턴스 메서드로는 사용가능
console.log(howard.name); // error
// person의 name property에 protected가 선언되었기 떄문에 직접적으로 호출이 불가능
class Person {
private _name: string
get name(){
return this._name;
}
set name(name:string){
if(name.length>10){
throw new Error('name too long')
}
this._name = name;
}
}
let person = new Person()
console.log(person.name) // undefined
person.name = 'kim';
console.log(person.name) // 'kim'
person.name = 'assdsdsdsdsd' // error
class Person{
readonly age : number = 20 // 선언 초기화
constructor(age:number){
this.age=age;
}
}
let person = new Person(10); // 생성자 초기화
person.age=30; // error
class Grid{
static origin={x:0,y:0}
calculateDistanceFromOrigin(point:{x:number,y:number}) {
let xDist = point.x-Grid.origin.x;
let yDist = point.y-Grid.origin.y;
return Math.sqrt(xDist*xDist+yDist*yDist) / this.scale;
}
constructor(public scale:number){}
}
let grid1 = new Grid(1.0);
let grid2 = new Grid(5.0);
console.log(grid1.calculateDistanceFromOrigin({x:10,y:10}));
console.log(grid2.calculateDistanceFromOrigin({x:10,y:10}))
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) // 파생된 클래스의 생성자는 반드시 super()를 호출
}
makeSound():void{ // 반드시 파생된 클래스에서 구현해줘야 함
console.log(this.name);
}
}
const animal = new Animal('animal'); // error 추상클래스이기 때문에 직접 선언하면 에러가 발생.
const dog = new Dog('강아지');
dog.makeSound(); // 강아지
abstract class Parent{
public do(){
console.log('parent에서 실행-a')
this.hook();
console.log('parent에서 실행-b')
}
abstract hook():void // 추상메서드 선언
}
class Child extends Parent {
hook(): void { // 추상 메서드 재구현
console.log('child');
}
}
const child = new Child();
child.do(); // 상위 클래스의 뼈대는 가져오되 특정 메서드(or 변수)를 수정할 수 있음. 재사용성이 높아짐