OOP(Object Oriented Programing, 객체지향 프로그래밍)

조양권·2021년 5월 18일
0

JS

목록 보기
8/17

객체 지향 프로그래밍(OOP, Object Oriented Programing)은 어떤 동작이나 로직보다는 객체를 중심으로 프로그래밍 하는 패러다임을 의미한다. 초기의 프로그래밍은 순차적인 명령의 조합으로 진행되는 절차적 프로그래밍이였다. 이젠 현대의 많은 언어들은 객체지향 특징을 지닌다. 객체 지향 프로그래밍은 일종의 설계 철학이다.

객체 지향 프로그래밍에서 클래스와 인스턴스를 살펴보자. 클래스는 일종의 원형으로써, 객체를 생성하기 위한 아이디어나 청사진을 의미한다. 인스턴스는 클래스에 세부사항을 불어 넣어 완성된 객체이다. 간단한 예시를 살펴보자.

let character_status = {
  str : 0,
  dex : 0,
  int : 0,
  str_up : function(){
    this.str++
  },
  dex_up : function(){
    this.dex++
  },
  int_up : function(){
    this.int++
  },
  show_stat : function(){
    return [this.str, this.dex, this,int]
}

게임 캐릭터의 스탯을 설정하고(객체, 청사진) 여기서 캐릭터의 스탯을 조절할수 있는 메소드를 설정했다.

character_status.str_up(); // str = 1
character_status.dex_up(); // dex = 1
character_status.str_up(); // str = 2
character_status.show_stat(); // [2,1,0]

이제 캐릭터의 스탯을 메소드를 통해 외부에서 접근할 수 있다. 그런데 이렇게 하면 character_status.str 을 통해 외부에서 손쉽게 변수를 변경할 수 있다. 이런것을 방지 하기 위한 캡슐화 라는 개념이 있다.

객체 지향 프로그래밍은 캡슐화를 포함해 4가지의 특징이 있다. 캡슐화, 추상화, 상속성, 다형성이 그것이다.

캡슐화(Encapsulation)

let character_status = (function(){
  let str = 0
  let dex = 0
  let int = 0
  return {
    str_up : function(){
      str++
    },
    dex_up : function(){
      dex++
    },
    int_up : function(){
      int++
    }
  }
})();
character_status.str_up()
character_Status.dex_up()

이제 외부에서 str,dex,int 변수에 직접적으로 접근하여 변경할 수는 없지만 str_up등과 같은 메소드를 사용해서 변경할 수 있다.

이렇게 외부에서 내부 변수를 함부로 바꿀 수 없도록 하는 것, 외부로부터 내부정보를 은폐하는것을 캡슐화 라고 한다.

추상화(Abstraction)

let level = (function(){
  let level = 0
  let exp = 0
  return {
    level_up : function(){
      if(exp >= 100){
        level++
        exp = 0
      }
  }
})()
level.level_up()

위의 예시에서 level 이라는 객체를 사용하는 사용자들은 어떤 방식으로 레벨이 오르는지 알수 없다. 이처럼 객체를 만들 때에 복잡한 원리나 구동방식을 사용자로부터 추상화 시켜주는 작업을 추상화라고 한다. 우리가 만든 객체를 사용자가 쉽게 사용할 수 있게 해주는 것이다.

상속성(Inheritance)

function raid_member(level, pre_stage){
  this.level = level
  this.pre_stage = pre_stage
}
function raid_member_warrior(level, pre_stage){
  raid_member.call(this, level, pre_stage)
  this.job = 'warrior'
}
let tanker = new raid_member_warrior(105, 'done')
console.log(tanker)
//
raid_member_warrior { level: 105, pre_stage: 'done', job: 'warrior' }

raid_member라는 constructor를 만들었다. 여기는 level과 pre_stage라는 정보를 담고 있다.

raid_member_warrior라는 constructor는 raid_member와 비슷한 점이 많기에 기존 raid_member의 정보를 그대로 가져오기로 했다. 이렇게 비슷한 부분을 새로 만들어 주는 것이 아니라 기존에 만들어 두었던 것을 이어받아 코드의 재사용성을 향상시켜주는것을 상속이라고 한다.

다형성(Polymorphism)

다양한 형태를 가질 수 있음을 다형성이라고 한다. 예컨데 html tag중 textbox, select, checkbox는 모두 element라는 클래스에서 생성된 객체들이다. 이들은 모두 element에서 물려받은 render라는 메소드를 가지고 있는데 3가지 태그 다 render는 조금씩 다르게 작동한다. 이를 다형성이라고 하며, 다형성이 없다면 부모클래스에 조건문을 달아 분기별로 하나하나 다르게 만들어야 할것이다.

profile
할 수 있는 것이 늘어나는 즐거움

0개의 댓글