let's get IT with DAVINA ๐ป
TypeScript(Classes) ๋ณธ๋ฌธ
Pre-Knowledge
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(Object Oriented Programming)
⇒ ๊ฐ์ฒด์ ์ ์ฅ์์ ๋ณด๋๊ฒ!!!
- ์ฌ๋์ด ์ธ๊ณ๋ฅผ ๋ณด๊ณ ์ดํดํ๋ ๋ฐฉ๋ฒ์ ํ๋ด ๋ธ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ๋ฒ๋ก ์ค ํ๋
⇒ ํ์ค ์ธ๊ณ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ์ ๋ง๋ค ๋์ ์ ์ฉํ๋ค!
- “ํด๋์ค”๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ฒญ์ฌ์ง์ ์ด์ฉํด ์ฝ๋ ์์ฑ
โญ 4๊ฐ์ง ์ฃผ์ ๊ฐ๋
1. Encapsulation(์บก์ํ) : ๋ฐ์ดํฐ์ ๊ธฐ๋ฅ์ ํ๋์ ๋จ์๋ก ๋ฌถ๋ ๊ฒ
2. Inheritance(์์) : ๊ธฐ๋ณธ ํด๋์ค์ ํน์ง์ ํ์ ํด๋์ค๊ฐ ์์๋ฐ๋๋ค. (๋ถ๋ชจ/์์)
3. Abstraction(์ถ์ํ) : ๋ด๋ถ ๊ตฌํ์ ์์ฃผ ๋ณต์กํ๋ฐ, ์ค์ ๋ก ๋ ธ์ถ๋๋ ๋ถ๋ถ์ ๋จ์ํ๊ฒ ๋ง๋ ๋ค๋ ๊ฐ๋
4. Polymorphism(๋คํ์ฑ) : ๋๊ฐ์ ๋ฉ์๋์ฌ๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋๋ค.
⇒ ๊ฐ์ฒด ๋ด์๋ “๋ฐ์ดํฐ์ ๊ธฐ๋ฅ์ด ํจ๊ป ์๋ค”๋ผ๋ ์์น์ ๋ฐ๋ผ ๋ฉ์๋์ ์์ฑ์ด ์กด์ฌํฉ๋๋ค.
<ํด๋์ค์ ์ธ์คํด์ค>
- class ⇒ ํ๋์ ๋ชจ๋ธ์ด ๋๋ ์ฒญ์ฌ์ง(blueprint)
- instance ⇒ ๊ทธ ์ฒญ์ฌ์ง์ ๋ฐํ์ผ๋ก ํ ๊ฐ์ฒด(object)๋ฅผ ๋ง๋๋ ํ๋ก๊ทธ๋๋ฐ ํจํด
ES6 class๋ผ๋ ํค์๋๋ฅผ ์ด์ฉํด์ ์ ์ํ๋ค! (์ด์ ์ funtion์ ์ผ์์)
//ES6//
class Car {
constructor (brand, name, color) {} //์์ฑ์ ํจ์ -> return ๊ฐ ์์
}
//instance ์์ฑํ๊ธฐ
new avante = new Car ('hyundai', 'avante', 'black'); //๊ฐ๊ฐ์ ์ธ์คํด์ค๋ Car๋ผ๋ ํด๋์ค์ ๊ณ ์ ํ ์์ฑ๊ณผ, ๋ฉ์๋๋ฅผ ๊ฐ์ต๋๋ค.
new mini = new Car ('bmw', 'mini', 'white');
new beetles = new Car ('volkswagen', 'beetles', 'red');
//์ด์ function์ ์ผ์๋//
function ๊ธฐ๊ณ (๊ตฌ๋ฉ) {
this.q = ๊ตฌ๋ฉ;
this.w = 'snowball';
}
//instance์์ฑํ๊ธฐ
var nunu = new ๊ธฐ๊ณ('consume');
var garen = new ๊ธฐ๊ณ('strike');
โ ํด๋์ค์ ํจ์์ ์ฐจ์ด
BOTH = ๊ธฐ๋ฅ์ ๊ฐ๋ค! ํ๋์ ๋ถ๋ชจ ๊ฐ๋ ์ธ ํด๋ผ์ค๋ฅผ ๋ง๋ค์ด, ์ด๋ก ์ธํด ์์ฑ๋ ์์ ๊ฐ์ฒด๋ค์ ๋์ผํ ํด๋์ค ๋ด์์ ๋ค๋ฅด๊ฒ ๊ตฌํํ๊ฒ๋ ๋ง๋ค์ด์ค๋ค.
DIFF
1. funciton์ ES6์ด์ ๋ฌธ๋ฒ์ผ๋ก classํค์๋์ ๋ค๋ฅด๊ฒ ์์ฑ์ํจ์์ธ constructor์ ๋ฐ๋ก ์์ฑํด์ฃผ์ง ์๋๋ค.
2. hoisting - ํจ์ ์ ์ธ์ ํธ์ด์คํ ์ด ๋ฐ์ํ์ง๋ง, ํด๋์ค ์ ์ธ์ ํธ์ด์คํ ์ด ๋ฐ์ํ์ง ์๋๋ค.
3. ํด๋์ค ์์ฑ์๋ new์ ํจ๊ป ํธ์ถํ์ง ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค!
4. ํด๋์ค๋ ํญ์ ์๊ฒฉ๋ชจ๋๋ก ์คํ๋๋ค.
5. ํด๋์ค ๋ฉ์๋๋ ์ด๊ฑฐํ ์ ์๋ค. for…in์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ํํ ๋, ์์ฑ์ ํจ์๋ prototype ํ๋กํผํฐ์ ์ง์ ๋ ํจ์ ๊ฐ์ ๋ฐํํ์ง๋ง, class๋ key๊ฐ์ผ๋ก ํจ์๋ฅผ ๋ฐํํ์ง ์๋๋ค.
๋ฐ๋ผ์, class๋ฅผ ์ธ ๊ฒฝ์ฐ, ๋ฉ์๋(ํจ์)๋ ๋ค ๋ฐ๋ก ์ผ์ผ์ด ๋นผ์ค์ผํ๋ค.
โ ์์ฑ๊ณผ ๋ฉ์๋
์์ฑ - ex) ์๋์ฐจ ๋ธ๋๋, ์ฐจ ์ด๋ฆ, ์์, ํ์ฌ ์ฐ๋ฃ ์ํ, ์ต๊ณ ์๋ ฅ ๋ฑ
๋ฉ์๋ - ๊ฐ์ฒด์ ๋ธ๋ฆฐ ํจ์ ex) ์ฐ๋ฃ ์ฃผ์ , ์๋ ฅ ์ค์ , ์ด์ ๋ฑ
Contructor
⇒ ์ธ์คํด์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ด๊ธฐํํ๋ ๋ฉ์๋
⇒ ์์ฑ์ ํจ์๋ฅผ ์์ฑํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ์์ฑ์(default constructor)๊ฐ ์ ๊ณต๋๋ค.
⇒ ๋ถ๋ชจ ํด๋์ค๊ฐ ์๊ณ , ์์ ํด๋์ค๊ฐ ์์ฑ์ ํจ์๋ฅผ ์์ฑํ์ง ์์๋ค๋ฉด ๋ถ๋ชจ ์์ฑ์๋ฅผ ๋ถ๋ฅธ๋ค.
⇒ ํด๋์ค ๋ด์์ ์์ฑ์ ํจ์๋ ํ๋๋ง ์์ ์ ์๋ค.
extends
- extends ํค์๋๋ ํด๋์ค๋ฅผ ๋ค๋ฅธ ํด๋์ค์ ์์์ผ๋ก ๋ง๋ค๊ธฐ ์ํด class ์ ์ธ ๋๋ class์์ ์ฌ์ฉ๋ฉ๋๋ค.
class ChildClass extends ParentClass {...}
TypeScript (Classes)
- TS
class Player {
constructor(
private firstName: string,
private lastName: string,
public nickName: string
) {}
}
const vini = new Player("vini", "An", "๋น๋");
vini.nickName //instance ์์ฑํ ๊ฑฐ์์ public๋ง ํธ์ถ/์ ๊ทผ ๊ฐ๋ฅ!!
- JS
class Player {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
this.nickName = nickName;
}
}
Abstract Class
- ๋ค๋ฅธ ํด๋์ค๊ฐ ์์๋ฐ์ ์ ์๋ ํด๋์ค
- BUT!! ์ง์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์๋ ์๋ค!!
Abstract Method
- abstract class ์์ abstract method๋ฅผ ๊ฐ์ง ์ ์๋ค.
- abstract method๋ ์ถ์ ํด๋์ค๋ฅผ ์์๋ฐ๋ ๋ชจ๋ ๊ฒ๋ค์ด ๊ตฌํ์ ํด์ผํ๋ method!
- ๋จ, method๋ฅผ ๊ตฌํํ๋ฉด ์๋๊ณ ,
- ๋ฉ์๋์ call signature๋ง ์ ์ด๋ฌ์ผ ํฉ๋๋ค!
- abstract method๋ abstract class์์๊ฐ ์๋๋ผ ์ ์์ class์์ ๊ตฌํํด์ค์ผํจ!
- ์์ฑํ ์ธ์คํด์ค๋, ๋ค๋ฅธ ์์ ํด๋์ค์์๋ abstract class ๋ด์์ ์๋ private property | method๋ ์ ๊ทผ ๋ถ๊ฐ๋ฅ!
- private ⇒ ๊ทธ ํด๋น Class(User) ๋ด์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ
- protected ⇒ abstract class(User)์์๋ถํฐ ์์ฑ๋ ๋ค๋ฅธ ์์ class = extends๋ class(Player)์์ ์ด์ฉ ๊ฐ๋ฅ
but, instance์์ (vini) ์ด์ฉ ๋ถ๊ฐ๋ฅ
- public ⇒ abstract class, ์์ class, instance์์ ๋ค ์ด์ฉ ๊ฐ๋ฅ
abstract class User {
constructor(
protected firstName: string, //protection level + name + type
protected lastName: string,
protected nickName: string
) {}
abstract getNickName() : void //abstract method๋ abstract class์์ call signature๋ง ํ๊ณ (type๋ง ์ ์ํด์ฃผ๊ณ )
getFullName(){
return `${this.firstName} ${this.lastName}`
}
}
class Player extends User{
getNickName() { //abstract method๋ ํ์ ์์ class์์ ๊ตฌํํด์ค์ผํจ!
console.log(this.nickName)
}
}
const vini = new Player("vini", "An", "๋น๋");
vini.getFullName()
vini.nickName //โ๏ธ 'nickName'์์ฑ์ ๋ณดํธ๋ ์์ฑ์ด๋ฉฐ 'User'ํด๋์ค ๋ฐ ํด๋น ํ์ ํด๋์ค ๋ด์์๋ง ์์ธ์คํ ์ ์์ต๋๋ค.
โญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธ ์ด ๋, protection level์ JS์์ ์๋ณด์ฌ!! โญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธ
Recap
type Words = {
[key:string]:string //string type๋ง์ ๊ฐ์ง๋ property๋ก ๊ฐ์ง๋ object (property์ name์ ๋ชจ๋ฅด๊ณ type๋ง ๋จผ์ ์ ๋ ์ฐ๊ธฐ ์ ์ฉ)
}
class Dict {
private words : Words //1. create property
constructor() { //2. manually initialize property
this.words = {}
}
add(word:Word){ //3. ์์ฑํ class๋ฅผ type์ผ๋ก์จ ์ ์๊ฐ๋ฅ = word๋ Wordํด๋์ค์ ์ธ์คํด์ค
if(this.words[word.term]===undefined){
this.words[word.term]=word.def;
}
}
def(term:string){
return this.words[term]
}
remove(term:string){
delete this.words[term]
}
}
class Word {
constructor(
public term:string,
public def:string
) {}
}
const kimchi = new Word("kimchi", "ํ๊ตญ์์")
const dict = new Dict()
dict.add(kimchi) //{kimchi : ํ๊ตญ์์}
dict.def("kimchi") //"ํ๊ตญ์์"
//์ด ์ฌ์ ์ ๋ฐ๊พธ๊ฒ ํ๊ณ ์ถ์ง ์์!!
kimchi.def="xxx"
//๊ทธ๋ฌ๋ ค๋ฉด ์์ public์ ์ ์งํ๋ฉด์ readonly๊ธฐ๋ฅ ์ถ๊ฐํด์ฃผ๊ธฐ
//private์ด๋ protected๋ก ๋ฐ๊พธ์ง ์๊ณ !
class Word {
constructor(
public readonly term:string,
public readonly def:string
) {}
}
'DEV_IN > TypeScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ๏ธ ์์ฃผ ๋ณผ ์ ์๋ Errors (0) | 2023.02.17 |
---|---|
TypeScript(apply) (2) | 2023.02.17 |
TypeScript(Interface) (4) | 2023.02.16 |
TypeScript (Function) (3) | 2023.02.09 |
TypeScript๋? & Types (0) | 2023.02.09 |
Comments