TIL_OOP

김진경·2020년 3월 21일
0

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개의 댓글