728x90

이제 Encapsulation(캡슐화)에 대하여 알아보고 이전코드에 적용하도록 해보자.

캡슐화란 클래스 내에서 수정하거나 보여서는 안될 중요한 데이터를 보호할 수 있게 만드는 개념이다.

기본적으로 class에서 선언되는 변수는 모두 public 변수인데 이 옵션외에

protected,private를 적용하면 클래스 내 변수가 클래스 외부 코드에서 마음대로 변경되거나 참조되는 것을 막을 수 있다.

 


 

이전코드

type Pokemon = {
  name:string;
  level: number;
};
const pokemonArr : Pokemon[] = [{name:'이상해꽃'
                                 level:50},
                                {name:'리자몽'
                                 level:50},
                                {name:'거북왕',
                                 level;50}
                               ];
type Party= {
  pokemon : integer; //파티 포켓몬수
  hasLegendary:boolean; // 전설의 포켓몬 포함여부
};

class WeakParty{
  static MINIMUM_LEVEL_REQUIRED : number = 50;
  pokemon : Pokemon[];

  constructor(pokemon:readonly Pokemon[]){
    this.pokemon = pokemon;
  }

  makeWeakParty(pokemon:number):Party{
    if(pokemon.length()<1){
      throw new Error("no pokemon to participate");
    }
    pokemon.forEach((item)=>{
      if(item.level<WeakParty.MINIMUM_LEVEL_REQUIRED){
        throw new Error("too low level");
      }
    })
    return{
      pokemon,
      hasLegendary:false
    }
  }
}


const myParty = new WeakParty(pokemonArr);
console.log(myParty.makeWeakParty);

 


 

캡슐화를 적용한 코드

type Pokemon = {
  name:string;
  level: number;
};
const pokemonArr : Pokemon[] = [{name:'이상해꽃'
                                 level:50},
                                {name:'리자몽'
                                 level:50},
                                {name:'거북왕',
                                 level;50}
                               ];
type Party= {
  pokemon : integer; //파티 포켓몬수
  hasLegendary:boolean; // 전설의 포켓몬 포함여부
};

class WeakParty{
  private static MINIMUM_LEVEL_REQUIRED : number = 50; // class level에서 생성하여 instance마다 생성을 안하기때문에 메모리 소비 감소
  private pokemon : Pokemon[]; // instance level
  private constructor(pokemon:readonly Pokemon[]){
    this.pokemon = pokemon;
  }

  get pokemon(): Pokemon[]:{
      return pokemon;
  }

  set pokemon(pokemon : Pokemon[]){
    this.pokemon = pokemon;
  }

  public fillPokemon(pokemon : Pokemon){
    if(pokemon == null) throw new Error("no pokemon to fill");
    this.pokemon.push(pokemon);
  }

  public makeInstance(pokemon: Pokemon[]){
    return new WeakParty(pokemon);
  }

  public makeWeakParty(pokemon:number):Party{
    if(pokemon.length()<1){
      throw new Error("no pokemon to participate");
    }
    pokemon.forEach((item)=>{
      if(item.level<WeakParty.MINIMUM_LEVEL_REQUIRED){
        throw new Error("too low level");
      }
    })
    return{
      pokemon.length(),
      hasLegendary:false
    }
  }
}


//const myParty = new WeakParty(pokemonArr); // 이제 작동하지 않음
const myParty = WeakParty.makeWeakParty(pokemonArr);
console.log(myParty.makeWeakParty); // {3,false}

myParty.fillPokemon({name:'피카츄'
                     level:50})
console.log(myParty.makeWeakParty); // {4,false}
   

protected, private

  • protected : 상속관계에서 자식에게까지 공유된다.
    private : 해당 클래스내부까지만 공유된다
  • static 변수, 일반 변수, 함수에 적용할 수 있다.

getter, setter

  • 클래스내에서 private,protected 변수의 반환과 변환을 위한 get,set 함수가 있다.

+ Recent posts