typescript의 객체지향 프로그래밍
- 프로그래밍에 필요한 데이터를 추상화시켜서 상태와 행위를 가진 객체로 만듭니다.
- 그 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법을 말합니다.
- C++, C#, Java, Python, Javascript, Ruby, Swift 등이 있습니다.
- 추상화, 캡슐화, 상속, 다형성의 4가지의 특성을 가집니다.
- 클래스
- 클래스에서 생성한 빈 객체를 클래스 밖에서 지칭할때, 인스턴스라고 합니다.
- 클래스 내부에 있는 함수를 의미합니다.
- JS에서는 Constructor 함수로 그 안에 생성할 파라미터를 작성하여,
- 원하는 프로퍼티를 가진 빈 객체를 만들 수 있습니다.
- constructor가 포함된 클래스가 작성되면,
- 특정 변수를 할당하여 해당 클래스로 인스턴스(instance)를 만듭니다.
- 인스턴스를 생성하여 원하는 키-값을 가진 오브젝트를 생성할 수 있습니다.
- Student 클래스를 가지고 인스턴스화하여, Student라는 이름의 object를 생성할 수 있습니다.
class Student {
constructor(firstName, lastName){
this.firstName = firstName;
this.lastName = lastName;
}
}
const harry = new Student("harry", "potter");
console.log(harry);
/* Student: {
"firstName": "harry",
"lastName": "potter"
} */
- TS에서는 constructor함수의 프로퍼티 타입만 선언합니다.
- 프로퍼티 필드가 어떠한 보호등급인지(=어떤 접근제어자), 프로퍼티 이름, 타입만 작성합니다.
- 컴파일될 때, 원래 JS에서 표현되는것과 똑같이 구현됩니다.
- private/public 키워드는 JS로 컴파일되면 사라집니다.
- private/public 키워드는 TS가 데이터를 보호하기위해 사용합니다.
- JS에서는 사용되지 않습니다.
- public 키워드를 가진 프로퍼티는 class밖에서 사용할 수 없습니다.
- 추상 클래스에게 상속받은 프로퍼티라도 해당 class밖이라면 사용 불가합니다.
- public 키워드를 가진 프로퍼티는 class밖에서 사용할 수 있습니다.
class Student {
constructor(
private firstName:string,
private lastName:string,
public nickName:string
){}
}
const harry = new Student("harry","potter","hp");
console.log(harry.firstName); // Error
console.log(harry.lastName); // Error
console.log(harry.nickName); // hp
- 추상 클래스 내부에 선언된 메서드를 말합니다.
- 추상 클래스는 새로운 인스턴스를 만들 수 없습니다.
- 다른 클래스에게 상속만 될 수 있습니다.
- 앞에 abstract를 붙여서 사용하며, 추상 클래스 내부에서는 call signature만 작성합니다.
- 함수의 이름과 존재한다면 argument, return값의 타입만 정의합니다.
- 메서드에 대한 구현체(Function Implementation)는 추상 메서드가 아니라
해당 추상 메서드를 상속하는 일반 클래스에서 작성합니다.
- extends 키워드는 일반 클래스가 추상 클래스를 상속받을때 사용합니다.
- class 밖으로부터 프로퍼티가 보호되면서 밖에서도 사용할 수 있습니다.
- 상속받은 자식 클래스에서 사용되기 원할때 사용합니다.
- 그러나, 클래스 밖에서 인스턴스 상태에서 사용은 불가합니다.
abstract User {
constructor(
protected firstName:string,
protected lastName:string,
protected nickName:string
){}
// 추상클래스 내부 메소드
public getFullName(){
return `${this.firstName} ${this.lastName}`;
}
// 추상 메소드 : Call Signature
abstract getNickName():void;
}
class Student extends User {
// 추상 메소드의 구현체
getNickName(){
console.log(this.nickName);
}
}
const harry = new Student("harry","porter","hp");
console.log(harry.getFullName()); // harry potter
harry.getNickName(); // hp