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 를 사용하면 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
와 마찬가지로 정해진 형식없이 마음껏 추가할수 있는 방법입니다
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' }
클래스의 속성이나 함수를 호출하려면 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 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는 완벽하지않게 구현해도 오류가 발생하지 않고
자식클래스에서 상속받아 활용하기위해 만듭니다.