class ์์ฑ ์์ TypeScript์ ํด๋์ค ๋ฌธ๋ฒ๊ณผ JavaScript์ ๋ฌธ๋ฒ์ ๋น๊ตํด๋ณด์.
# JS์์ ํด๋์ค๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ค.
class   MyClass   {   publicProp  =   'value' ;     #privateProp  =   'value' ;     _protectedProp  =   'value' ;   
    constructor ( ... )   {           } 
    static   staticMethod ( ... )   { }   
    publicMethod ( ... )   { }      #privateMethod ( ... )   { }   
    get   publicProp ( ... )   { }      set   publicProp ( ... )   { }   
    get   privateProp ( ... )   { }      set   privateProp ( ... )   { }   
    get   protectedProp ( ... )   { }      set   protectedProp ( ... )   { }   } ๋ณต์ฌ # JS์์๋ ํด๋์ค ์์์ ์ง์ํ๊ธฐ ๋๋ฌธ์, ๊ธฐ์กด ํด๋์ค๋ฅผ ํ์ฅํ์ฌ ํด๋์ค๋ฅผ ์์ฑํ ์์๋ค.
class   Animal   {      constructor ( name )   {          this . speed   =   0 ;          this . name   =  name ;      }      run ( speed )   {          this . speed   =  speed ;          alert ( ` ${ this . name }  ์/๋ ์๋  ${ this . speed } ๋ก ๋ฌ๋ฆฝ๋๋ค. ` ) ;      }      stop ( )   {          this . speed   =   0 ;          alert ( ` ${ this . name }  ์ด/๊ฐ ๋ฉ์ท์ต๋๋ค. ` ) ;      } } 
 let  animal  =   new   Animal ( '๋๋ฌผ' ) ; 
 class   Rabbit   extends   Animal   {      hide ( )   {          alert ( ` ${ this . name }  ์ด/๊ฐ ์จ์์ต๋๋ค! ` ) ;      } } 
 let  rabbit  =   new   Rabbit ( 'ํฐ ํ ๋ผ' ) ; 
 rabbit . run ( 5 ) ;   rabbit . hide ( ) ;   ๋ณต์ฌ 
ํด๋์ค Rabbit์ผ๋ก ๋ง๋  ๊ฐ์ฒด๋ rabbit.hide()์ ๊ฐ์ Rabbit์ ์ ์๋ ๋ฉ์๋์๋ ์ ๊ทผํ  ์ ์๊ณ , rabbit.run()๊ณผ ๊ฐ์ Animal์ ์ ์๋ ๋ฉ์๋์๋ ์ ๊ทผํ ์์๋ค.
extends ํค์๋๋ ์ด๋ ๊ฒ ํ๋กํ ํ์
 ๊ธฐ๋ฐ์ผ๋ก ๋์ํ์ฌ, ๊ฐ์ฒด rabbit -> Rabbit.prototype -> Animal.prototype ์์ผ๋ก ๋ฉ์๋๋ฅผ ์ฐพ์์ ์คํํ๋ค.
# ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์๋ ์ ๊ทผ ์ ์ด์๋ฅผ ํ์ฉํด ๋ด๋ถ ์ธํฐํ์ด์ค์ ์ธ๋ถ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ๋ถํ์ฌ ์บก์ํ ํ๋ค.
public : ์ด๋์๋ ์ง ์ ๊ทผํ  ์ ์์ผ๋ฉฐ ์ธ๋ถ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ฑํ๋ค.protected : ํด๋์ค ์์ ๊ณผ ์์ ํด๋์ค์์๋ง ์ ๊ทผํ  ์ ์์ผ๋ฉฐ ๋ด๋ถ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ฑํ๋ค.private : ํด๋์ค ์์ ์์๋ง ์ ๊ทผํ  ์ ์์ผ๋ฉฐ ๋ด๋ถ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ฑํ๋ค.JS์์๋ public, protected ์ ๋ํ ๋ฌธ๋ฒ์  ์ง์์ด ์์ผ๋ฉฐ, ๊ด์ต์ ์ผ๋ก _ ์ ๋์ฌ๋ฅผ ์ฌ์ฉํ์ฌ protected ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ค.
private ์์ฑ
static# ์ ์  ํ๋กํผํฐ์ ๋ฉ์๋๋ ์ด๋ค ํน์ ํ ๊ฐ์ฒด๊ฐ ์๋ ํด๋์ค์ ์ํ ํจ์๋ฅผ ๊ตฌํํ๊ณ ์ํ  ๋ ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
์ ์  ๋ฉค๋ฒ๋ ์์๋๋ค.
class   Article   {      constructor ( title ,  date )   {          this . title   =  title ;          this . date   =  date ;      } 
      static   createTodays ( )   {                   return   new   this ( "Today's digest" ,   new   Date ( ) ) ;      } } 
 let  article  =   Article . createTodays ( ) ; 
 alert ( article . title ) ;   ๋ณต์ฌ # TS๋ JS์ ๋ชจ๋  ํด๋์ค ๋ฌธ๋ฒ์ ์ง์ํ๋ฉฐ, ๊ทธ์ ๋ํด์ ๋ช ๊ฐ์ง ๋ฌธ๋ฒ์ ์ธ ์ง์์ ์ถ๊ฐํด์ค๋ค. ํ์ง๋ง ๋ชจ๋  ๋ฌธ๋ฒ์ ์ปดํ์ผ ํ์์ ๋ํด์๋ง ์ ์ฉ๋๊ณ , ๋ฐํ์์๋ ๊ฒฐ๊ตญ JS๊ฐ์ง์ํ๋ ๊ธฐ๋ฅ๋ง์ ์ฌ์ฉํด ๋์ํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์.
๋ค์์ JS์์ ์ง์ํ์ง ์์ง๋ง, TS์์ ์ฌ์ฉํ  ์ ์๋ Class์ ๊ด๋ จ๋ ๊ธฐ๋ฅ๋ค์ด๋ค.
ํ๋์๋ readonly ์ ์ด์๋ฅผ ์ ๋์ฌ๋ก ์ฌ์ฉํ  ์ ์๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์์ฑ์ ํจ์๊ฐ์๋ ๊ณณ์์ ํ ๋น์ ๋ฐฉ์งํ  ์ ์๋ค.
class   Greeter   {      readonly  name :   string   =   'world' ; 
      constructor ( otherName ? :   string )   {          if   ( otherName  !==   undefined )   {              this . name   =  otherName ;          }      } 
      err ( )   {          this . name   =   'not ok' ;               } } const  g  =   new   Greeter ( ) ; g . name   =   'also not ok' ; ๋ณต์ฌ JS๋ ํจ์์ ๋งค๊ฐ๋ณ์์ ๊ฐฏ์์ ์๋ฃํ์ด ์์ ๋กญ๊ธฐ ๋๋ฌธ์, ์ค๋ฒ๋ก๋์ ๋ํ ๊ฐ๋
์ด์ฌ์ค์ ์๋ค. (๋จ์ง, ๋งค๊ฐ๋ณ์์ ์กฐ๊ฑด์ ๋ฐ๋ฅธ ๋ถ๊ธฐ๋ฅผ ์์ฑํ๋ ์ ๋)
TS์์๋ ๋ค์ํ ๋ฐฉ์์ผ๋ก ํธ์ถํ  ์ ์๋ ํจ์์ ๋ํด ๊ตฌ์ฒด์ ์ผ๋ก ์ค๋ฒ๋ก๋ signature๋ฅผ ์์ฑํ  ์ ์๋ค.
class   Point   {           constructor ( x :   number ,  y :   string ) ;      constructor ( s :   string ) ;      constructor ( xs :   any ,  y ? :   any )   {               } } 
 class   Util   {           len ( s :   string ) :   number ;      len ( arr :   any [ ] ) :   number ;      len ( x :   any )   {          return  x . length ;      } } ๋ณต์ฌ TypeScript์์๋ ํ์ ํด๋์ค๊ฐ ํญ์ ๊ธฐ๋ณธ ํด๋์ค์ ํ์ ์ ํ์ด ๋๋๋ก ํ๋ค.
class   Base   {      greet ( )   {          console . log ( 'Hello, world!' ) ;      } } 
 class   Derived   extends   Base   {      greet ( name ? :   string )   {          if   ( name  ===   undefined )   {              super . greet ( ) ;          }   else   {              console . log ( ` Hello,  ${ name . toUpperCase ( ) } ` ) ;          }      } } 
 const  d  =   new   Derived ( ) ; d . greet ( ) ; d . greet ( 'reader' ) ; ๋ณต์ฌ ํ์ ํด๋์ค๊ฐ ๊ธฐ๋ณธ ํด๋์ค์ ๊ท์น์ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ค์ํ๋ฐ, ๊ธฐ๋ณธ ํด๋์ค๊ฐ ํ์ ํด๋์ค ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ  ์ ์์ด์ผ ํ๋ค.
const  b :   Base   =  d ; b . greet ( ) ; ๋ณต์ฌ ๋ง์ฝ ํ์ ํด๋์ค๊ฐ ๊ธฐ๋ณธ ํด๋์ค๋ฅผ ๋ฐ๋ฅด์ง ์๋๋ค๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
class   Base   {      greet ( )   {          console . log ( 'Hello, world!' ) ;      } } 
 class   Derived   extends   Base   {           greet ( name :   string )   {                            console . log ( ` Hello,  ${ name . toUpperCase ( ) } ` ) ;      } } 
 const  b :   Base   =   new   Derived ( ) ; b . greet ( ) ; ๋ณต์ฌ # Member Visibility 
public : ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋  ๋ฉค๋ฒ๋ public์ผ๋ก ์ด๋์๋ ์ ๊ทผํ  ์ ์๋ค.protected : ํด๋์ค ์์ ๊ณผ ์์ ํด๋์ค์์๋ง ์ ๊ทผํ  ์ ์๋ค.private : protected์ ์ ์ฌํ๊ฒ ํด๋์ค ์์ ์์๋ง ์ ๊ทผํ  ์ ์์ง๋ง, ์์ ํด๋์ค์์๋ ์ ๊ทผํ  ์ ์๋ค.TS(JS)๋ Java๋ C#์์ ์ฌ์ฉํ๋ static class ๋ผ๊ณ  ๋ถ๋ฆฌ๋ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค. (static class๋ ์ธ์คํด์คํ ํ  ์ ์๋ค.)
๋ฐ๋ผ์, static class ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ถํ์ํ๋ค. ๋จ์ง ๋จ์ ๋ฆฌํฐ๋ด ๊ฐ์ฒด๋ฅผ์ฐ๋ ๊ฒ๊ณผ ๋์ผํ๋ค.
class   MyStaticClass   {      static   doSomething ( )   { } } 
 function   doSomething ( )   { } 
 const   MyHelperObject   =   {      dosomething ( )   { } , } ; ๋ณต์ฌ ์์ง ๊ตฌํํ์ง ์์ ๋ฉ์๋์ ํ๋กํผํฐ์ abstract ํค์๋๋ฅผ ์ฌ์ฉํ  ์ ์๋ค. abstract ๋ฉค๋ฒ๋ฅผ ๊ฐ์ง ํด๋์ค๋ ๋ฐ๋์ abstarct class ์ฌ์ผ ํ๋ค.
abstract class์ ์ญํ ์ abstract ๋ฉค๋ฒ๋ฅผ ๊ตฌํํ  ์๋ธ ํด๋์ค์ ๊ธฐ์ด ํด๋์ค๊ฐ๋๋ ๊ฒ์ด๋ค.
abstract   class   Base   {      abstract   getName ( ) :   string ; 
      printName ( )   {          console . log ( 'Hello, '   +   this . getName ( ) ) ;      } } 
 class   Derived   extends   Base   {      getName ( )   {          return   'world' ;      } } 
 const  d  =   new   Derived ( ) ; d . printName ( ) ; ๋ณต์ฌ #