타입스크립트 클래스 - 2

hb-developer·2021년 4월 28일
0

TypeScript

목록 보기
6/6

getter setter

private 속성을 가진 클래스에서 인스턴스를 만들면

인스턴스 전체에는 접근할수 있지만 인스턴스의 속성에는 접근할수 없습니다.

class Person {
  constructor(private name:string,private age : number) {}
}
const user1 = new Person("Tim",20);
console.log(user1);        //  { name: 'Tim', age: 20 }
console.log(user1.name);  // 오류 'name' 속성은 private이며 'Person' 클래스 내에서만 액세스할 수 있습니다.

이때 게터와 세터를 사용하면 private 을 유지하면서도 접근이 가능합니다.

get - 인수가 없는 함수로, 프로퍼티를 읽을 때 동작함
set – 인수가 하나인 함수로, 프로퍼티에 값을 쓸 때 호출됨

get 의 name 과 private name 이 중복되므로 한쪽을 바꿔야 하는데

개발자 사이에서는 암묵적으로 속성값을_이름 으로 바꿔줍니다.

class Person {
  constructor(private _name:string,private age : number) {}    // _name

  get name():string{
    return this._name
  }
}
const user1 = new Person("Tim",20);
const a = user1.name
console.log(a);              // Tim

set은 프로퍼티에 값을 입력할때 사용

class Person {
  constructor(private _name:string,private age : number) {}

  set name(value:string){
    this._name = value
  }
}
const user1 = new Person("Tim",20);

user1.name= "Elon"
console.log(user1);        // { _name: 'Elon', age: 20 }

readonly

readonly 를 사용하면 public 이라 할지라도 외부에서 바꿀수 없습니다.

class Person {
public readonly name:string = "Tim"
}

const user1 = new Person()
user1.name = "hello"            //   오류

선언시 혹은 생성자 내부에서만 변경이 가능합니다.

class Person {
  readonly name:string = "Tim"
   constructor(name:string){          
    this.name = name;             
}
  }
  const user1 = new Person("hello")
  console.log(user1.name);              // hello

Index Signatures in class

인터페이스 Index Signatures 와 마찬가지로 정해진 형식없이 마음껏 추가할수 있는 방법입니다

class Person{
  [index:string]:'A'|'B'|'C'
}
const a = new Person
a.Alice = "A"
a.Mark = "B"
a.Tim = "C" 
console.log(a);    // { Alice: 'A', Mark: 'B', Tim: 'C' }

static

클래스의 속성이나 함수를 호출하려면 new 연산자를 사용해
인스턴스를 만든뒤 인스턴스에서 불러왔습니다.

하지만 static 을 사용하면 클래스 자체에서 불러올수 있습니다.

class Person {
static Country:string = "Korea"
}
console.log(Person.Country);   // Korea

함수에도 사용 가능

class Person {
 static hello(){
    console.log("안녕하세요");
  }
}
Person.hello();  // 안녕하세요

private 일땐 외부에서 접근할수 없지만 내부에선 사용이 가능합니다.

class Person {
private static Country:string = "Korea"
 static hello(){
    console.log("안녕하세요 " + Person.Country);
  }
}
Person.hello();        // 안녕하세요 korea

정적 스태틱은 인스턴스 끼리 공유를 합니다.
따라서 함수를 통해 스태틱 속성을 바꾸면 다른 인스턴스에도 영향을 미칩니다.

class Person {
 static Country:string = "Korea"
  hello(){
    console.log("안녕하세요 " + Person.Country);
  }
  change(){
    Person.Country = "USA"
  }
}
const user1 = new Person;
const user2 = new Person;

user2.hello();          // 안녕하세요 Korea
user1.change();         // user1 의 함수를 실행
user2.hello();          // 안녕하세요 USA  

abstract

abstract 란 추상 클래스를 만들때 사용합니다.
abstract class를 완벽하게 구현하지 않고 만든다음 자식 클래스에서 제대로 구현합니다.

abstract class Person{
protected  abstract name:string ;
 abstract hello():void;
}

혹시라도 abstract가 붙지않는 속성과 메서드가 있으면 그부분은 구현해야 합니다.

그후 상속을 이용해 자식클래스에서 모두 구현합니다.

abstract class Person{
protected  abstract name:string ;
 abstract hello():void;
}

class User extends Person {
  protected name: string="Tim"     // protected 는 자식클래스에서 접근 가능
  hello(): void {
    console.log("안녕하세요 " + this.name);
  }
}
const a = new User()
a.hello()                     // 안녕하세요 Tim

즉 abstract는 완벽하지않게 구현해도 오류가 발생하지 않고

자식클래스에서 상속받아 활용하기위해 만듭니다.

profile
배우면 바뀐다

0개의 댓글