Photo by Cristian Palmer on Unsplash
"use strict";
class Player {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
자바스크립트와 달리 파라미터들을 써주기만 하면 TS가 알아서 Constructor 함수를 만들어줌
class Player {
constructor {
private firstName: string,
private lastName: string
} {}
}
public property 추가하고 새로운 플레이어 생성하기
class Player {
constructor {
private firstName: string,
private lastName: string,
public nickName: string
} {}
}
const ulfric = new Player("Ulfric"," Stormcloak","The rebel")
private 변수에 접근하려하면 TS가 막아줌
추상클래스 : 다른 클래스가 상속받을 수 있는 클래스
abstract class User {
constructor (
private firstName:string,
private lastName:string,
public nickName:string
) {}
}
class Player extends User {
}
const ulfric = new Player("Ulfric"," Stormcloak","The rebel");
ex)
const ulfric = new User("Ulfric"," Stormcloak","The rebel"); //error
추상클래스는 오직 다른곳에서 상속받을수만 있는 클래스
추상클래스 User 안에 getFullName이라는 메소드를 추가
abstract class User {
constructor (
private firstName:string,
private lastName:string,
public nickName:string
) {}
getFullName() {
return `${this.firstName} ${this.lastName}`
}
}
class Player extends User {
}
const ulfric = new Player("Ulfric"," Stormcloak","The rebel");
ulfric.getFullName();
User로 부터 상속받았으므로 Plyaer가 getFullName 메소드를 사용가능
추상메소드도 private으로 지정할 수 있음
private getFullName() {
return `${this.firstName} ${this.lastName}`
}
private, public은 property 뿐만 아니라 method에서도 작동함
JavaScript
"use strict";
class User {
constructor(firstName, lastName, nickName) {
this.firstName = firstName;
this.lastName = lastName;
this.nickName = nickName;
}
getFullName() {
return `${this.firstName} ${this.lastName}`;
}
}
class Player extends User {
}
const ulfric = new Player("Ulfric", " Stormcloak", "The rebel");
TypeScript
abstract class User {
constructor (
private firstName:string,
private lastName:string,
public nickName:string
) {}
private getFullName() {
return `${this.firstName} ${this.lastName}`
}
}
class Player extends User {
}
const ulfric = new Player("Ulfric"," Stormcloak","The rebel");
private getFullName() {
return `${this.firstName} ${this.lastName}`
}
이런식으로 메소드를 직접 구현하지 말고
메소드의 콜 시그니처만 적어둬야 함
abstract class User {
constructor (
private firstName:string,
private lastName:string,
private nickName:string
) {}
abstract getNickName():void
private getFullName() {
return `${this.firstName} ${this.lastName}`
}
}
class Player extends User {
}
const ulfric = new Player("Ulfric"," Stormcloak","The rebel");
arguments를 추가할 수 있음
Player가 getNickName 추상메소드를 구현하지 않았다고 나옴
추상메소드는 추상 클래스를 상속받는 모든 것들을 구현해야 하는 메소드
Plyaer에서 getNickName 구현하기
player에서 nickname에 접근하려하면 에러가 뜸
상속받은 클래스일지라도 priavte property에는 접근 불가임
이건 필드를 보호하기 위한 방법이 private과 public 뿐만 아니라 protected라는 방법이 있기 때문
만약 추상 클래스안에 private 필드가 있다면 private 프로퍼티들은 인스턴스 밖에서 접근할 수 없고, 다른 서브 클래스에서도 접근할 수 없음
원래는 User 클래스의 인스턴스나 메소드에서 접근 할 수 있으나,
User는 추상클래스이기 때문에 인스턴스화 할 수 없고 때문에 User를 상속받아도 private 필드는 사용할 방법이 없음
만약 추상클래스안의 private필드를 외부에서 접근은 막고, 인스턴스나 서브클래스에서 사용하고 싶다면 protected 필드를 사용해야함.
이제 Player에서 getNickName을 구현하기 위해 this.를 입력하면 나머지 프로퍼티들에 접근할 수 있음
클래스밖에서는 User 프로퍼티에 접근할 수 없도록 보호해줌
클래스 밖에서 nickname에 직접 접근할 순 없지만 User로부터 상속받은 getNickName()을 이용해 nickname에 접근가능
protectField properyName: type,
abstract getLastName():void
abstract getArg(arg:number):number
class Player extends User {
getLastName() {
console.log(this.lastName);
}
getArg(arg:number):number {
console.log(arg);
return arg;
}
}
abstract class 유저 {
constructor (
private 오직User안에서만접근가능:string,
protected 상속하면접근가능:string,
public 모든곳에서접근가능:string,
//이것도모든곳에서접근가능:string <- 이건 안됨
) {}
// 이렇게는 public없이도 됨
프라이빗접근하기() {
console.log(this.오직User안에서만접근가능)
return this.오직User안에서만접근가능;
}
}
class 플레이어 extends 유저 {
}
const 새플레이어 = new 플레이어 ("오직유저안에서만","상속하면접근가능","모든곳에서접근가능")
// 새플레이어.오직User안에서만접근가능 // error
새플레이어.프라이빗접근하기()
console.log(새플레이어.모든곳에서접근가능,"추상클래스안의프라이빗프로퍼티")
ts playground 참고
abstract class User {
constructor (
protected firstName:string,
protected lastName:string,
protected nickName:string,
private 오직유저안에서만접근가능?:string,
public 모든곳에서접근가능?:string
) {}
abstract getArg(arg:number):number
abstract getNickName():void
접근할래() {
console.log(this.오직유저안에서만접근가능,"<-뭐라고나옴?")
return this.오직유저안에서만접근가능
}
public getLastName() {
return `$(this.lastName} `
}
private getFullName() {
return `${this.firstName} ${this.lastName}`
}
}
class Player extends User {
nickname!: string;
getNickName() {
console.log(this.nickName);
console.log(this.firstName);
}
getArg(arg:number) {
console.log(arg)
return arg
}
}
const ulfric = new Player("Ulfric"," Stormcloak","The rebel","프라이빗이얌","모든곳에공개");
ulfric.nickname
// ulfric.getFullName()
ulfric.getLastName()
ulfric.getNickName()
ulfric.getArg(1)
// ulfric.오직유저안에서만접근가능
ulfric.접근할래()
ulfric.모든곳에서접근가능
실행값