
class는 typescript로 객체지향 코드를 만드는 방법이라구 한다.
class를 사용한다면 constructor를 자동으로 생성해주고 private기능을 사용할 수 있다..!
사실 class는 익숙해서... abstract class에 더 자세히 알아보자!
abstract class란 다른 class가 상속받을 수 있는 class이다. 그래서 직접 새로운 instance를 만들지는 못한다.
abstract class User{
constructor(
private firstName:string,
private lastName:string,
public nickname:string
){}
getFullName(){
return `${this.firstName} ${this.lastName}`
}
}
class Player extends User{
}
const example = new Player("first", "last", "nickname");
위의 코드를 보면 User라는 추상 클래스는 직접 instance를 만들지 못하고 이 User를 상속한 Player로 instance를 만드는 것을 볼 수 있다.
추상 메소드라는 것도 있다. 추상 메소드는 추상 클래스를 상속받는 모든 것들이 구현을 해야하는 메소드이다.
추상 메소드는 추상 클래스안에서 생성가능하지만 메소드를 구현해서는 안된다. 즉 call signature만 적어야한다.
abstract class User{
constructor(
private firstName:string,
private lastName:string,
public nickname:string
){}
abstract getNickName():void //abstract method
getFullName(){
return `${this.firstName} ${this.lastName}`
}
}
class Player extends User{
getNickName(){
console.log(this.nickname);
}
}
const example = new Player("first", "last", "nickname");
위의 코드를 보면 getNickName이라는 메소드가 추가되었다. 하지만 추상 메소드 내에서는 call signature만 선언되어있고 실제 구현은 User를 상속받는 Player 클래스 내에서 구현되어있다.
private, public, protected, 추상 클래스, 추상 메소드는 javascript에는 없고 typescript에서만 가능한 기능들이다.
그리고 class는 type처럼 사용가능하다.
type Words={
[key:string]:string
}
class Word{
constructor(
public term:string,
public def:string
){
}
}
class Dict{
private words:Words //type 사용
constructor(){
this.words={};
}
add (word:Word){ //class 사용
//...
}
}
propertyfmf public으로 두고 readonly 속성을 주면 수정이 불가하다. 다른 누군가가 데이터를 덮어쓰는 것을 방지하기 위해 private, protected property를 사용한다.
type과 interface는 비슷하지만 2가지 부분에 대해서 다르다.
여러 방향으로 사용가능하다. object의 모양을 알려주고 alias로 사용하고, 특정값을 가지도록 제한하는 역할을 하다. 따라서 다양한 목적을 가지며 더 유연하다.
객체지향 프로그래밍 개념 활용을 위해 디자인 되었다. 따라서 object 모양을 알려주는 단 한가지의 목적을 가진다. 또한 interface는 상속이 가능하다.
주로 interface코드가 더 깔끔하기 때문에 더 선호된다. 그리고 같은 이름의 interface를 여러개 선언하면 자동으로 하나로 합쳐준다.
abstract class는 js에는 없는 개념이다. 결국 js코드로 변환될때는 일반 class로 변환된다. 그런데도 추상 클래스를 사용하는 이유는 다른 클래스들이 표준화된 모양, 표준화된 property, method를 가지도록 해주는 청사진을 만들기 위해 사용한다.
원하는 method와 property를 클래스가 가지도록 강제할 수 있게 해준다. 하지만 js로 컴파일 되지 않는다. => 추상 클래스와 비슷한 보호를 제공하지만 js파일에서는 보이지 않음.
추상클래스를 사용하면 js에서 일반적인 class로 바뀐다.
따라서, 추상클래스를 다른 클래스들이 특정 모양을 따르도록 하기 위한 용도로만 사용한다면 interface를 사용하는것이 더 좋다. 왜냐면..? 상속시키는 방법이 더 직관적이다.
다형성 : 다른 모양의 코드를 가질 수 있다.=> generic사용(placeholder type을 가진다)
interface SStorage<T>{
[key:string]:T
}
class LocalStorage<T>{
private storage:SStorage<T>={}
set(key:string,value:T){
this.storage[key]=value;
}
remove(key:string){
delete this.storage[key]
}
get(key:string):T{
return this.storage[key];
}
clear(){
this.storage={};
}
}
const stringsStorage = new LocalStorage<string>();
const booleansStorage = new LocalStorage<boolean>();
이제 타입스크립트 개념은 많이 아는거같구...? 실제 개발에서 사용을 해봐야겠다!