[34] TS - Class
접근제어자
기본적으로 자바스크립트는 언어에서 제공되지않았기에 네이밍앞에 _ 를 붙여서 암묵적으로 사용했다
타입스크립트 에서는 언어적으로 접근제어자를 제공하게되었는데
외부에서 접근할수있도록 키워드를 통해서 제어를 할수있다.
public
private
protected
가 있다 defualt 값은 public 이다.
클래스 내부에 모든곳에 생성자, 프로퍼티 , 메서드 등에 설정 가능하다.
public
은 외부에서 접근할수있는 제어자이다.
private
는 클래스 외부에서 접근 할수없다.
protexted
외부에서는 접근이 불가능하지만 상속관계에서는 접근가능하다.
getters & setters
어떤 객체의 프로퍼티를 접근해서 get 하는 것 과 프로퍼티의 재할당하는 set 하는 행위들을 함수로 표현하는것이다.
class Person {
constructor(public name: string, public age: number) {}
}
// object 생성
const p1 = new Person("jaehyun", 29);
**console.log(p1.name); // get 을 하는 함수를 getter
p1.name = "jaehee"; // set 을 하는 함수를 setter**
이런것들을 따로 함수로 만들수가있다.
함수로만들고 내부프로퍼티를 private를 설정하게되면 동일하게 프로퍼티에 접근해서 get 과 set을 할수있지만 외부자가 객체 내부의 데이터에 접근하는것을 방지할수있다.
class Person {
constructor(private _name: string, private age: number) {}
get name() {
console.log("get");
/
return this._name;
}
set name(n: string) {
console.log("set");
this._name = n;
}
}
// object 생성
const p1 = new Person("jaehyun", 29);
console.log(p1.name); // get 을 하는 함수를 getter
p1.name = "jaehee"; // set 을 하는 함수를 setter
console.log(p1.name);
readonly
프로퍼티에 readonly 를 붙이게되면 set은 할수없고 get만할수있게된다.
정확히는 선언되는 부분, 초기화되는 영역에서만 변경이 가능하다.
클래스 내부 에서도 public 이든 private 이든 변경이 불가능하다.
class Person {
**//선언 or 초기화 -----**
**public readonly name: string = "jaehyun";
private readonly city: string;
constructor(private _name: string, private age: number) {
this.city = 'seoul';
}
// ---------**
change() {
this.city = 'busan';
// 에러 발생
}
}
}
index signatures
프로퍼티가 고정된형태가 아닌 동적으로 들어오는 프로퍼티이름이 들어오는 경우에 사용된다.
// class => object
class Students {
//index signatures
[index: string]: string;
}
const a = new Students();
a.mark = "male";
a.jade = "male";
console.log(a);
static properties & methods
class 를 new 를 통해 object를 만들어서 사용했다
object.프로퍼티 를 통해서 사용을했었는데 class.프로퍼티를 사용할수있도록 만들어볼수있다.
클래스를 통해 만든 object 들에서 공유하여 사용해야되는것이 있다면 static으로 만들어 사용한다.
싱글톤 패턴
어플리케이션이 실행되는 중간에 클래스로부터 하나의 오브젝트만 생성을 해서 사용하는것을 말한다.
class ClassName {
private static instance: ClassName | null = null;
public static getInstance() : ClassName {
// ClassName 으로부터 만든 object 가 있으면 그것을 리턴
// 없다면 , 만들어서 리턴
if (ClassName.instance === null) {
ClassName.instance = new ClassName();
}
return ClassName.instance;
}
private constructor() {}
}
// new 라는 키워드로 생성x
const a = ClassName.getInstance();
const b = ClassName.getInstance();