2 분 소요

  흔히 JavaScript에 대해 설명하라 하면 자주 등장하는 단어가 객체 지향 언어이다. 이외에도 프로그래밍을 하다보면 객체 지향 프로그래밍이라는 단어를 종종 듣게된다. 이번 포스팅에서는 객체 지향 프로그래밍이 무엇인지, JavaScript가 왜 객체지향 언어라 할 수 있는지에 대해 정리해 보려한다.


객체지향 프로그래밍이란

객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임 중 하나이다. 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 “객체”들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다. -위키백과-

OOP가 나타난 배경

초창기에 프로그래밍은 순차적이었다. 이러한 특성때문에 반복적 작업을 할 때 특정 범위의 코드를 다시 실행하기 힘들었으며 이를 위해 goto문을 만들게 된다. 때문에 절차적 프로그래밍이라는 방법이 나타나게 되지만 전역 변수의 형태로 만들다보니 스케일이 커질수록 변수에 같은 이름을 쓸 수 없는 문제점이 발행하게 된다. 이를 해결하기 위해 나타난 형태가 struct(구조체)이다.구초제를 이용하여 프로그래밍을 하다보니 특정 구조체를 동작하는 함수군들이 만들어지게 되었고 이를 함께 관리하기 위해 class가 만들어진다.


Class

1
2
3
4
5
6
7
8
9
10
11
12
class Character {
    name: "nunu"
    q: "Biggest Snowball Ever!"
    w: "Snowball Barrage"
    e: "consume"
    r: "Absolute Zero"

    useSkill() {...}
}

let chracter1 = new Character().
character1.useSkill();

이와같이 Class를 통해 데이터 처리 방식이 하나의 모듈로 관리되면서 작은 프로그램이 독립적으로 돌아가는 형태를 띄게 된다. 때문에 이와 같은 작은 부품을 미리 만들고 조합하는 형식으로 프로그래밍이 가능하게 되었다. 구조체와 함수를 합쳐서 선언하는 것을 ‘Class’, Class를 통해 만들어진 결과물을 ‘Object’라 부르게 되었으며, 프로그래밍을 객체로 바라보는 관점으로 객체 지향 프로그래밍 (Object-Oriented Programming)이라는 단어가 나타났다.

캡슐화(Privite)

캡슐화는 독립된 객체를 사용하게되면서 외부로 노출해야 하는 값과 내부에서만 사용하는 값을 구분하는 기능이다. ‘privite’를 이용하여 외부에서 수정을 할 수 없게 하는 것으로 객체의 안정성을 높이고 필요한 메소드만 열어둠으로써 객체의 재사용성을 높일 수 있도록 하였다.

상속(extends), 추상화, 다양화

상속은 객체의 일부분만 사용하는 방법으로 객체에서 공통적인 부분만 따로 만들고 해방 코드를 같이 상송받아 사용하는 방법이다. 이를 위해 공통적인 부분을 따로 모아 상위 개념으로 이름을 붙이는 추상화가 이루어 졌으며 여러가지 하위 타입에 참조할 수 있는 다향성이 생기게 되었다. 이 3개지 개념을 통해 객체의 일부분이 재사용가능하게 설계가 가능해진 것이다.


SOLID

이렇게 객체 지향 프로그래밍을 하다보니 규모가 점점 커지게 되었으며 이에따라 객체지향을 잘하기 위한 5원칙이 나오게되는데 이것이 SOLID이다.

S (Single Responsibility Principle)

단일 책임 원칙(single responsibility principle)이란 모든 클래스는 하나의 책임만 가지며, 클래스는 그 책임을 완전히 캡슐화해야 함을 일컫는다. -위키백과-

O (Open-Closed Principle)

개방-폐쇄 원칙(Open-Closed Principle)은 ‘소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다’는 프로그래밍 원칙이다. -위키백과-

L (Liskov Substitution Principle)

프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다. -위키백과-

I (Interface Segregation Principle)

인터페이스 분리 원칙, “특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.” -위키백과-

D (Dependency Inversion Principle)

의존관계 역전 원칙, 프로그래머는 “추상화에 의존해야지, 구체화에 의존하면 안된다.” 의존성 주입은 이 원칙을 따르는 방법 중 하나다. -위키백과-


JavaScript

자바스크립트는 기존의 객체 지향 프로그래밍이 복잡성을 피하기 위해 객체지향의 상속, 추상화, 다양화를 다른 방식으로 접근한 언어이다. 우리가 흔히 사용하는 자바스크립트의 객체가 이와 같은 케이스이다.

1
2
3
4
5
6
7
8
const character {
    name: "nunu",
    q: "Biggest Snowball Ever!",
    w: "Snowball Barrage",
    e: "consume",
    r: "Absolute Zero",
    useSkill: () => {...}
}

또한 new를 이용해 객체를 생성하던 방법을 function의 prototype을 이용하여 해결하였다.

1
2
3
4
5
6
7
8
9
function character(name, skill) {
    this.name = name
    this.skill = skill
}

character.prototype.check = function() { console.log(this.name, this.age) }

var nunu = new character("누누", "Q")
nunu.check()

이렇든 다양한 방법을 통해 자바스크립트는 기존의 객체 지향에서 복잡하게 구현해야 했던 패턴들을 간단하게 구현할 수 있게 하였다. 또한 객체 지향과 함수형을 적절하게 사용하는 방법으로 발전하게 되었다. (ES6의 Class 문법, TypeScript)

*ES6에서 추가된 class는 prototype 방식을 class처럼 보여주는 것이다.

댓글남기기