티스토리 뷰
(Object-Oriented Programming, 객체 지향 프로그래밍)이란?
프로그래밍 세계에서 철학을 이야기하는 단어이다. 모든 것은 Object로 설명이 가능해진다는 이야기이다.
예를 들어, 위의 그림과 같이 Car라는 오브젝트가 있다고 하면 자동차가 공통적으로 가지고 있는 기능과 속성이 있다. 구체적으로 말해보자면 주유를 받는다. 속도를 설정한다. 운전을 한다 등 자동차의 기능이 있고, 자동차의 속성으로 연료는 얼마나 필요한지, 최고 속도는 어떻게 되는지, 몇 인승인지, 색깔은 어떻게 되는지가 있을 수 있다.
그래서 Car라는 클래스(객체)를 만들어두고 속성을 다르게 정의할 수 있다면 여러 가지의 자동차를 만들 수 있다. Car라는 클래스에서 속성과 기능을 추가해서 포르쉐 마칸, 미니, 골프를 만들어 낼 수 있다.
즉, 클래스를 프로토타입이라고 부를 수 있다. 세부사항의 정의되지 않은 청사진을 가지고 특정 세부사항을 정의하면 객체로 만들 수 있다는 것이다. 이를 클래스의 인스턴스(객체)라고 할 수 있다. 포르쉐 마칸, 미니, 골프를 인스턴스라고 할 수 있다.
특정 세부사항은 어디에서 정의할 수 있을까? 클래스는 constructor를 가지고 있다. 그래서 클래스 Car에 자동차의 속성과 기능을 constructor에다가 정의한다.
객체 지향 프로그래밍에서 보통 객체를 만들 수 있는 클래스를 정의합니다. 클래스로 객체를 만들었을때, 가져야 하는 속성과 함수를 정의를 하게 된다. 우리가 원하는 객체를 만들 수 있다.
(OOP, 객체 지향 프로그래밍)의 4가지 개념
1 ) Encapsulation(캡슐화) : 클래스 또는 오브젝트의 프로퍼티 및 메서드를 한 곳에 모아 둔다. 복잡성과 재사용성을 높여준다.
예제 ) 첫 번째 코드는 Encapsulation(캡슐화)되기 전 코드이다(절차 지향적 코드)
한 사원의 데이터(프로퍼티)와 월급(메서드)을 구하는 기능을 가졌다.
만약에 사원이 한 명이 아니고 여러명이라면? 각 사원에 대한 프로퍼티가 사원 수만큼 정의해야 한다. 더불어 월급을 구하는 기능에서도 매개변수로 들어갈 각 사원의 프로퍼티들이 입력될 수 없게 된다.
let baseSalary = 30_000;
let overtime = 10;
let rate = 20;
function getWage(baseSalary, overtime, rate) {
return baseSalary + (overTIme * rate);
}
두 번째의 코드처럼 객체 employee 만들어서 캡슐화할 수 있다. 객체 employee안에 프로퍼티와 메서드를 정의한다(객체 지향적 코드)
사원의 수 만큼 객체를 만들어서 사용하면 월급을 구하는 기능을 쉽게 사용할 수 있게 된다.
let employee = {
baseSalary : 30_000,
overtime: 10,
rate: 20,
getWage: function() {
return this.baseSalary + (this.overtime * this.rate); // this === 객체 employee
}
};
employee.getWage();
2 ) Inheritance(상속) : 부모 클래스의 특징을 자식이 물려받는다. 똑같은 코드를 줄여준다.
3 ) Abstraction(추상화) : 내부는 복잡하게 되어 있지만 사용자가 사용하기에는 간단한 것이다. 예를 들어, 스마트 폰으로 전화 통화를 할 때, 우리는 간단하게 통화할 번호를 입력하고 통화버튼을 누르면 통화가 된다. 하지만 내부에서는 어떤 원리로 전화 통화가 가능한지는 모른다. 복잡성을 줄여준다.
4 ) Polymorphism(다형성): 상속을 통해 부모 클래스의 기능을 이용할 수 있다.