//in JS
class Player {
constructor(firstName, lastName, nickName) {
this.firstName = firstName;
this.lastName = lastName;
this.nickName = nickName;
}
}
//in TS
class Player{
constructor(
private firstName:string,
private lastName:string,
private readonly nickName:string
){}
}
TS는 생성자함수를 통해 초기화를 시켜줄필요 없이 인자에 원하는 타입 + 엑세스 수정자를 지정만해주면 알아서 초기화를 해준다.
나는 private,public,protected등 이런것들이 뭐라고 불리는지 궁금했는데. 위와같이 불리는 거였다..
추상클래스는 일반적으로 확장할 파생 클래스의 동작을 정의하는데 사용한다.
이렇게 이해했다. 즉 앞으로 이 추상클래스를 상속할 클래스들은 ~~한 동작을 꼭 정의해줘야하는거야! 라고 이해했다.
그렇기때문에 일반적으로 최소 하나이상의 추상메서드가 포함되는것 같다.
추상클래스'만' 으로 인스턴스 객체를 만들수는 없다 -> 그 추상클래스를 상속해서 새로운 클래스를 만들어야한다.
abstract class Player2{ //생성할 클래스 앞에 abstract
constructor(
protected name:string
){}
abstract getNickName():void //추상메서드
}
const test = new Player2('foo') //err 추상클래스로 직접 인스턴스객체를 만들순 없다.
구현을 포함하지 않으며 파생 클래스 에서는 추상메서드를 구현'해야'한다.
추상클래스 코드 예시를 보면 추상메서드의 body(구현부분 -> {})가 비어있는걸 볼수있다
=>call signature만 적혀있다. 파생클래스들에게 이런 call signature을 가진 메소드를 반드시 포함해야해! 라고 말하는 느낌.
인스턴스객체를 만들지 않고도 클래스 내부의 인자+함수를 사용할수 있는 방법
class Exam{
constructor(name:string){}
static getName(){ //static method
return this.name
}
Exam.getName() // 클래스에서 접근
type Exam = {
[key:string]:string //구조를 보면 느낌이 올것같다 (당연히 key는 원하는 이름으로 커스텀이 가능할거다)
}
//문제의 코드
class Exam{
private exam:Exam // 생성자함수로 exam필드를 초기화시키지 않아서 생기는 오류
}
// after
class Exam{
private exam:Exam
}
constructor(){
this.exam = {} // 초기화시켜주면 해결됨.
}
}
에러핸들링보단 사실 왜 저렇게 클래스를 생성해줄까? 무슨차이일까? 나름대로 생각을 해봤다 왜냐면 맨위의 클래스 생성 방법과 다르기때문인데.
class Player{
constructor(
private nickName:string
){}
}
//
class Player{
private nickName:string
constructor(){
this.nickName = ""
}
나름대로 콘솔에 찍어보면서 확인한결과 전자는 인스턴스객체를 만들때 인자를 받고, 그 기반으로 필드가 생성되고.
후자는 인자가 없이 생성자함수내에 초기화시키는 코드로 만들어지는데 (어찌보면 같은말일거다)
본인 나름의 예를들어서 이해한바로는 이렇다. 캔음료 생산을 예를 들자면
이렇게 이해한게 맞길 바란다.
객체지향프로그래밍 언어를 배우지도 + 짜보지도 않아서 개념만 알고가는 내용인것같아
머리에 흡수도 느리고 해서 답답하긴 한데 실제로 쓰이는 모습이 어떤 모습일지 너무 궁금하다..그래도 중요한 개념을배운것같아 기분이좋다ㅎㅎ