//TypeScriptclassUserA{
constructor(first:string, last:string, age:number){
this.first = first
this.last = last
this.age = age
}
getAge(){
return`${this.first}${this.last} is ${this.age}`
}
}
클래스를 선언하는 위의 문법은 자바스크립트 문법에서는 문제가 없습니다.
하지만 타입스크립트에서 위와 같이 클래스를 선언하면 문제가 생깁니다
UserA안에 first의 내용이 없다고 나옵니다. last와 age 또한 마찬가지 입니다
//TypeScriptclassUserA{
first: stringlast: stringage: numberconstructor(first:string, last:string, age:number){
this.first = first
this.last = last
this.age = age
}
getAge(){
return`${this.first}${this.last} is ${this.age}`
}
}
constructor 윗부분에 생성자 함수의 속성 타입을 정의해주면 코드상 에러가 사라집니다
클래스 초기화
//TypeScriptclassUserA{
first: string = ''last: string = ''age: number = 0constructor(first:string, last:string, age:number){
this.first = first
this.last = last
this.age = age
}
getAge(){
return`${this.first}${this.last} is ${this.age}`
}
}
first: string = ''last: string = ''age: number = 0
초기화가 필요하면 “=” 연산자를 이용하여 초기화 하면 됩니다.
접근 제어자 Access modifier
💡
1. 접근 제어자란 클래스의 설계를 위해 클래스의 필드나 메서드에 대한 접근을 제어하기 위해 사용하는 키워드 입니다.
2. 이러한 제어자를 사용해 클래스 내부의 맴버를 외부에서 어떻게 접근 할 수 있는지 결정할 수 있습니다
public 제어자
💡
1. 해당 멤버는 어디서든지 접근할 수 있습니다
2. 클래스 멤버의 접근 제어자가 public인 경우 별도로 명시하지 않아도 됩니다.
✅
클래스 멤버는 클래스 내부에 정의된 변수, 메서드 또는 속성을 가리킵니다
//TypeScriptclassUserA{
first: string = ''last: string = ''age: number = 0constructor(first:string, last:string, age:number){
this.first = first
this.last = last
this.age = age
}
getAge(){
return`${this.first}${this.last} is ${this.age}`
}
}
위 코드에서
first: string = ''last: string = ''age: number = 0
부분에 public이라는 접근 제어자를 붙여도 같은 내용 입니다
publicfirst: string = ''publiclast: string = ''publicage: number = 0
위와 같이 public 접근 제어자를 넣는다면
//TypeScriptclassUserA{
publicfirst: string = ''publiclast: string = ''publicage: number = 0constructor(first:string, last:string, age:number){
this.first = first
this.last = last
this.age = age
}
getAge(){
return`${this.first}${this.last} is ${this.age}`
}
}
classUserBextendsUserA{
getAge(){
return`${this.first}${this.last} is ${this.age}`
}
}
classUserCextendsUserB{
getAge(){
return`${this.first}${this.last} is ${this.age}`
}
}
const neo = newUserA('Neo','Anderson', 102)
console.log(neo.first)
console.log(neo.last)
console.log(neo.age)
위의 코드에서
✅
1. UserB는 UserA에서 상속받아서 생성된 클래스 입니다.
UserB의 this.first, this.last, this.age는 UserA 의 first, last, age 속성에서 받아왔습니다.
UserA 속성들의 접근 제어자가 public이기에 어디서든 자유롭게 접근이 가능하여 코드상 문제가 없습니다
✅
2. UserA 생성자를 이용해 생성된 neo 인스턴스 또한 문제 없이 public 속성에 접근 가능합니다
protected
💡
1. 클래스 자신, 파생된 후손 클래스 내에서 접근이 가능합니다
//TypeScriptclassUserA{
publicfirst: string = ''protectedlast: string = ''publicage: number = 0constructor(first:string, last:string, age:number){
this.first = first
this.last = last
this.age = age
}
getAge(){
return`${this.first}${this.last} is ${this.age}`
}
}
classUserBextendsUserA{
getAge(){
return`${this.first}${this.last} is ${this.age}`
}
}
classUserCextendsUserB{
getAge(){
return`${this.first}${this.last} is ${this.age}`
}
}
const neo = newUserA('Neo','Anderson', 102)
console.log(neo.first)
console.log(neo.last)
console.log(neo.age)
protectedlast: string = ''
UserA 클래스의 last 속성을 protected로 접근제어 한다면
classUserBextendsUserA{
getAge(){
return`${this.first}${this.last} is ${this.age}`
}
}
classUserCextendsUserB{
getAge(){
return`${this.first}${this.last} is ${this.age}`
}
}
파생 클래스인 UserB,UserC 는 UserA의 last 속성에 접근이 가능하니 문제가 생기지 않지만