TIL_OOP

김진경·2020년 3월 21일

IM19

목록 보기
6/21

객체 지향적 프로그래밍(Object Oriented Programming)을 말하기 전에 먼저 언어의 종류에 대한 짧은 이야기를 하겠다.

Machine Languages (Executable Machine code)

0과 1로 짜여진 언어.
​

Assembly Languages (Low-level program)

컴퓨터가 진행을 하기 전에 머신랭귀지를 번역하는 역할을 하는 언어.
​

High-Level Languages

인간의 언어에 가장 가까운 개발 언어. 역사적으로 High-Level Languages를 두개의 그룹으로 나눈다.
​

Procedure languages(절차 지향적 언어) Ex. C, HTML, COBOL

함수와 변수간 절차를 중심으로, 어떤 순서로 진행이 되는지에 초점이 맞춰진 언어이다.

Object-Oriented languages (객체 지향적 언어) Ex. C++, Python, Javascript
함수와 변수들이 하나의 개체,물체,덩어리로 존재하는 언어이다.

​
여기까지 언어들에 대한 소개를 했는데 정작 OOP는 무엇인가?
OOP는 High-Level Languages 중에서도 객체 지향적 언어이다. 단순히 언어일 뿐만 아니라,
OOP(객체 지향적 프로그래밍(Object Oriented Programming))란 프로그래밍 세계에서 하나의 철학이다.
​
OOP는 오브젝트로 모든 것이 설명이 가능한 것이다.
오브젝트들(함수, 변수 등등)은 재사용성과 활용성이 높은 개념이다.
​
대표적으로 Class 가 있다. Class는 프로토타입이다. 어떤 물체를 만들 때 모델이 되는 청사진이자 거푸집인 것이다. 'constructor' 라고도 한다.

object들은 Class의 인스턴스, Class를 통해 만들어진 것들이다.
각자 다른 프로퍼티과 메소드를 담고 있을 수 있다.

(각자 다른 프로퍼티, 메소드를 담을 수 있다)
지금부터는 OOP의 개념들을 하나씩 소개하려고 한다.
​

1. Encapsulation 캡슐화

let baseSalary = 30000;
let overtime = 10;
let rate = 20;

function getWage(baseSalary, overtime, rate){
  return baseSalary + (overtime * rate);
}

위와 같은 코드를 아래처럼 캡슐화를 하는 것을 Encapsulation이라고 한다.

let employee = {
  baseSalary: 30000,
  overtime: 10,
  rate: 20,
  getWage: function(){
    return this.baseSalary + (this.overtime * this.rate);
  }
}
employee.getWage();

위의 코드는 절차지향적인 것이고, 아래의 코드는 객체지향적이다.

만약 직원이 2명 이상일 경우 위의 절차지향적 코드 같은 경우엔, baseSalary 1, overtime 1, rate 1 등 직원 수만큼의 선언이 필요하지만,객체 지향적 코드는 그런 과정을 간소화하여 효율성을 높인다.
​

2. Inheritance 상속

프로그래밍에서 상속은 부모의 특징을 물려받는 것이다.
예시를 보자.

$('#root').__proto__ // 각각의 DOM element들은 상속을 받았고 __proto__로 그 부모를 확인할 수 있다.
>HTMLDivElement {constructor: f, Symbol(Symbol.toStringTag): "HTMLDivElement"}
v
accesskey: (...)
align: (...)
.
.
.
__proto__ : HTMLElement // HTMLDivElement의 부모는 HTMLElement임을 알 수 있다.
// 여기서, HTMLElement의 특성 중 하나인 title을 자식인 HTMLDivElement가 가지고 있는지 확인해보면
$('#root').title
< "" // null이 아니기에 비어있을 뿐 존재하는 것을 확인할 수 있다. 

HTMLDivElement는 HTMLElement의 특징을 상속받고 있다는 걸 알 수 있다.
​

3. Abstraction 추상화

속은 복잡하지만 사용자가 복잡한 걸 알지 않아도 사용할 수 있게 하는 개념이다.
예를 들어 전화기를 사용할 때 수화기를 들고 번호를 누르고 말을 하면 된다.


(실제로는 복잡하지만 사용자는 그것을 알지 않아도 사용할 수 있다. 그렇게 하는 것이 추상화.)

캡슐화와 추상화의 차이는 다음과 같이 정리할 수 있겠다.
캡슐화는 외부에서 함부로 내부의 정보를 바꿀 수 없도록 은폐하는 것이다. 내부의 정보를 외부로부터 보호하는 것이다.
추상화는 우리가 만든 객체를 사용자들이 쉽게 쓸 수 있도록 만들어주는 것이다.
출처 : https://im-developer.tistory.com/136

4.Polymorphism 다형성


태그는 종류별로 다양한데 (ex TextBox, Select...) render()를 다 따로 써준다면 비효율 적일 것이다. 그렇기에 그림처럼 부모의 render()를 물려받고 태그별로 실행하는 것이 효율적일 것이다.

만약 Polymorphism이 없다면 다 따로 써줘야 할 것이다.

profile
Maktub.

0개의 댓글