(typescript) class

Youje0·2023년 2월 16일

1. 접근 제한자

JS와는 다르게 TS에선 접근을 제한을 할 수 있으며 다음과 같은 접근 제한자가 있다.

  • public : 접근을 제한하지 않으며 모든 곳에서 접근 가능하다.
  • private : 선언된 class 내부에서만 접근이 가능함.
  • protected : 선언된 class와 해당 class를 상속받은 자식 class만 접근이 가능하다.
<-- public과 private -->
class Player {
	constructor(
    	private firstName : string,
        private nickName : string,
        public lastName : string
    ) {}
	
}

const person = new Player("choi","Yu","jin")

let men = person.lastName = "jun" 
let men2 = person.nickName = "jun"

console.log(men) // jun
console.log(men2) // error private로 선언하면 외부에서 접근 할 수 없다.

2. 추상 클래스 (abstract class)

추상 클래스(abstract class)란 오로지 상속만 받을 수 있는 class이고, 스스로 instance를 생성 할 수 없다. 만약 instance를 생성하고 싶다면 상속 받은 자식 class를 이용하여야 한다.

abstract class User {
  constructor(
          private firstName : string,
          private nickName : string,
          public lastName : string
      ) {}
}

class Player extends User {
	
	
}

const person = new Player("choi","Yu","jin")
let men = person.lastName = "jun" 

3. 추상 메소드 (abstract method)

추상 메소드는 실제 메소드를 구현하는것이 아닌 call signature만을 작성한다. 이는 상속받은 모든 클래스가 구현해야하는 메소드이다.

abstract class User {
  constructor(
          private firstName : string,
          private nickName : string,
          public lastName : string
      ) {}
      <-- 추상 메소드의 call signature -->
      abstract getNickName() : void
}

class Player extends User {
	<-- class Player는 User를 상속 받았고 User엔 추상 메소드인  -->
    <-- getNickName()이 존재하기 때문에 해당 메소드를 강제적으로 작성하여야한다. -->
    getNickName(){
    	console.log(this.nickname)
    }
}    
	

위처럼 추상 클래스 내에서 추상 메소드를 작성 할 수 있고 그 추상 메소드는 call signature를 작성하는데 상속받은 모든 클래스들은 위의 Player class 처럼 추상 메소드를 강제적으로 작성하는걸 알 수 있는데
위의 코드엔 한가지 문제점이 있다. 그건 바로 Player class 의 getNickName() 메소드에서 consoloe로 찍은 nickname이 부모인 User class에서 private로 돼있다는것.
이러한 문제를 해결하기 위해 접근 제한자인 protected를 사용하면 된다.

abstract class User {
  constructor(
          private firstName : string,
          protected nickName : string,
          public lastName : string
      ) {}
      <-- 추상 메소드의 call signature -->
      abstract getNickName() : void
}

class Player extends User {
	
    getNickName(){
    <-- protected 선언된 클래스 멤버는 자식 클래스에서도 접근이 가능하다. -->
    	console.log(this.nickname) 
    }
}    
	
profile
ㅠㅠ

0개의 댓글