객체 지향 프로그래밍(Object Oriented Programming, OOP)은 컴퓨터 프로그래밍 패러다임 중 하나로, 프로그램이 순차적으로 작동하는 절차 지향 프로그래밍과 달리 객체를 중심으로 작동하는 것을 지향하는 프로그래밍이다.
객체 안에는 속성과 메서드가 함께 있다.
Human
클래스// JavaScript는 객체 지향 언어가 아니지만 객체 지향 패턴으로 작성할 수 있다. class Human { constructor(name, age) { this.name = name; // 속성 this.age = age; // 속성 } eat(food) { // 메서드 console.log(this.name + "이(가) " + food + "을(를) 먹는다."); } walk() { // 메서드 console.log(this.name + "이(가) 걷는다."); } } const jeje = new Human('jeje', 12); jeje.eat('짬뽕'); // jeje이(가) 짬뽕을(를) 먹는다. jeje.walk(); // jeje이(가) 걷는다.
객체 지향 프로그래밍에서는 Human
객체인 jeje
를 중심으로 프로그램이 작동한다.
Human
객체 안에 name
, age
속성과 eat
, walk
함수가 함께 있다.
jeje
라는 인스턴스에 데이터와 기능이 모두 포함되는 것이다.
OOP에는 4가지 주요 개념이 있다.
캡슐화는 데이터와 기능을 하나의 단위로 묶은 것을 의미한다.
앞선 예시에서 name
, age
속성과 eat
, walk
함수가 하나의 단위로 묶인 것을 볼 수 있다.
캡슐화에는 은닉화의 특징도 포함한다.
- 은닉화
내부 데이터 또는 내부 기능이 외부로 노출되지 않도록 하는 것이다.
디테일한 구현이나 데이터는 숨기고, 객체 외부에서 필요한 동작(메서드)만 노출시킨다.
추상화는 복잡한 내부 구조, 구현을 숨기고 실제로 노출되는 부분은 단순하게 만드는 것이다.
키보드로 예를 들면 키보드의 내부 구조나 내부에서 어떻게 작동되는지는 보이지 않지만,
사용자에게는 J키를 누르면 J가 입력되고, K키를 누르면 K가 입력되는 것처럼 단순한 인터페이스만 보이는 것이 추상화의 개념이다.
상속은 부모 클래스로부터 물려받은 속성, 메서드를 자식 클래스가 그대로 유지하는 것이다.
Human
을 상속받은Developer
클래스class Developer extends Human { code(language) { console.log(this.name + "은(는) " + language + " 코딩 중..."); } } const john = new Developer('john', 25); john.eat('라면'); // john이(가) 라면을(를) 먹는다. john.walk(); // john이(가) 걷는다. john.code('JavaScript'); // john은(는) JavaScript 코딩 중...
Developer
클래스는 Human
클래스를 상속받아 Human
의 속성과 메서드를 그대로 사용할 수 있다.
또한 새로운 메서드 code
를 추가하였다.
다형성은 말 그대로 객체가 다양한 형태를 가진다는 의미이다.
const jeje = new Human('jeje', 12); /* { this.name = 'jeje'; this.age = 12; } */ const chamber = new Human('Chamber', 35); /* { this.name = 'Chamber'; this.age = 35; } */
jeje
와 chamber
객체는 모두 Human
클래스로부터 생성된 인스턴스이다.
같은 클래스로부터 생성되 객체들이지만 name
속성의 값과 age
속성의 값이 각각 다를 수 있으며, 이를 다형성이라고 한다.