What is OOP

CCY·2020년 8월 11일
0

Javascript 모음

목록 보기
7/11
post-thumbnail

OOP(Object oriented programming) 이해하기

객체 지향 프로그래밍이란:
프로그램을 객체들로 구성하고 객체들 간에 서로 상호작용하도록 작성하는 방법이다. 그래서 객체가 무엇인지 이해해야 한다.

객체란: 객체 값들을 그룹으로 묶은 데이터 모음이라고 한다. (Dictionary라고 생각하면 편하다)
객체는 자신의 key 와 value 가 존재한다.

let dictionary = {
  inspiration: 'Meaning of inspiration',
  coffee: 'Meaning of coffee'
};
let inspirationMeaning = dictionary.inspiration;

inspirationMeaning 을 console.log 해보면 'Meaning of inspiration' 이 출력된다.

객체는 특정적인 행동 과 변경가능한 상태 를 가진다.
자바스크립트에서는 함수 값으로 가지는 속성을 메소드(method) 라고 하는데. 이 메소드는 특정적인 행동이며, 그외 다른 값들을 변경가능한 상태라고 한다.

자바스크립트의 객체를 객체지향에서 말하는 객체로 사용하려면 코드를 작성하는 프로그래머가 그에 맞게 작성해야 합니다. 단순히 객체를 정의하였다고 객체지향 프로그래밍을 하는것은 아닙니다..

Example 1

const teacher={
  name:'john',
  age:30,
  teachJavascript:function(student){
    student.gainExp()
  }
}

const student ={
  name:'kim',
  age:20,
  exp:0,
  gainExp:function(){
    this.exp++
  }
}

console.log(student.exp)
teacher.teachJavascript(student)
console.log(student.exp)

결과는
0,
1
이 출력된다.

해설:
1. 우리는 teacher라는 객체(object)를 생성하였고. 이름과 나이 라는 속성(property)를 부여하였다.
추가적으로 teachJavascript 라는 행위(function)을 만들었다.
teachJavascript 는 method 안에 student 이라는 parameter 를 지정하였습니다.
즉 => teacher.teachJavascript객체는 student 객체를 사용하게 되었다.
객체지향 프로그래밍에서는 객체들이 서로 의사소통을 하게 되는데, 메서드를 통해 서로 메세지를 전달합니다.

  1. 우리는 student 라는 객체를 만들었다. 학생은 이름, 나이, 경험치를 상태(state)로 가지고있다.
    우리가 teacher.teachJavascript 객체는 student 이라는 객체를 사용하게 하여, 경험치를 얻는 행위를 하였다.
    이렇게 하여 student 내부에 있는 상태의 경험치를 변경시킬 수 있게 되었다.

객체지향 더 자세히 (prototype)

객체지향에서는 무수히 많은 객체들을 공통적인 특성을 기준으로 객체를 묶어서 하나의 타입(type)으로 정의한다.
이렇게 type을 분류하는 것을 classification 이라고 한다.
세상에는 많은 javascript을 가르치는 선생이 존재한다. 그중에서 우리는 teachJavascript 이라는 타입을 분류하고 모든 자바스크립트 선생을 가리키는 공통적인 특징을 정의한것이다.

자바스크립트는 프로토타입 기반으로 객체지향 프로그래밍을 지원한다. 자바의 클래스(class) 기반으로 만들어졌지만 특이사항으로 프로토타입으로 객체의 공통 사항을 적용할 수있게 되었다.
즉. 모든 객체는 다른객체의 원형(prototype) 이 될 수 있다.

우리는 프로토타입 객체를 만들어 이 프로토타입 객체를 base 로 잡아 같은 특징의 객체들을 만들수 있다.
example 1


const studentProto= {
  gainExp:function(){
    this.exp++
  }
}

const lisa ={
  name:'lisa',
  age:20,
  exp:0,
  __proto__:studentProto
}

const john={
  name:'john',
  age:30,
  exp:10,
  __proto__:studentProto
}

john.gainExp()
lisa.gainExp()
lisa.gainExp()
console.log(lisa)
console.log(john)

결과:
{ name: 'lisa', age: 20, exp: 2 }
{ name: 'john', age: 30, exp: 11 }
john에게 경험치를 주었고, lisa에게 경험치를 주었다.

gainExp 라는 행위(method)를 작성하여 prototype 객체를 정의하였다.
자바스크립트에서는 proto 라는 속성으로 prototype(원형)의 객체를 정의 할 수 있다.

해설:
lisa, john 은 각자 다른 객체이지만, proto 라는 속성(property)에 studentProto 객체를 연결했기 때문에 경험치를 얻는 행위가 가능하게 되었다.
위 두개의 객체 안에 name,age,exp 는 서로 다르지만 모두 공통된 원형(base prototype)으로 연결되어있기 때문에 두 객체는 같은 type 인 student으로 묶여졌다.
그래서 경험치를 한 행위 때문에 경험치를 얻게되는 행위가 가능해졌다.

설명하지 않은 개념들

this 및 prototype 관련해서는 더 자세히 다루기 위해 새로운 블로그 포스팅 할 예정

profile
✍️ 기록을 습관화 하자 ✍️ 나는 할 수 있다, 나는 개발자가 될거다 💪🙌😎

0개의 댓글