과거에는 C, 포트란, 코볼같은 절차적 언어를 사용하였다. 하지만 소프트웨어가 점점 더 발전하면서 코드가 복잡해지기 시작하였고 절차적 프로그래밍 순서가 꼬이기 시작하였다("스파게티 코드") 이러한 문제를 극복하기 위한 대안으로 나온게 객체지향적 프로그래밍이다.
절차적 프로그래밍
객체지향 프로그래밍
자바스크립트는 프로토타입 기반의 객체지향 언어이다.
(ES 6부터 Class가 생기긴 했지만 사실 함수)
let speaker = {
volume : 0,
volumeUp : function () {
this.volume += 10
},
volumeDown : function () {
this.voulem -= 10
}
}
이렇게 작성할 경우
speaker.volumeUp(); // volume 이 10 올라간다
speaker.volumeDown(); // volume이 10 내려간다
speaker.volume = 10000 // volume에 10000이 할당된다
외부에서 접근하여 volume 10000으로 바꿔버렸다. 이렇게 외부에서 변경할 수 없도록 보호하는게 켑슐화이다.
var speaker = (function () {
var volume = 0;
return {
volumeUp: function () {
volume += 10;
},
volumeDown: function () {
volume -= 10;
}
}
})(); // IIFE , 클로저
speaker.volumeUp();
speaker.volumeDown();
var speaker = (function () {
var volume = 0;
return {
volumeUp: function () {
volume += 10;
},
volumeDown: function () {
volume -= 10;
},
autoVolumeOff: function () {
setTimeout(function () {
volume = 0;
}, 5000);
}
}
})(); //볼륨을 0으로 만들기 위해서 setTimeout이를 메서드가 사용되었다, 하지만 사용자는 이 autouVolumeOff가 어떤방식으로 작동되는지 원리는 알지못하지만 기능은 작동한다,
speaker.volumeUp();
speaker.volumeUp();
speaker.volumeUp();
speaker.autoVolumeOff();
부모클래스
function Person (name, job) {
this.name = name;
this.job = job;
}
Person.prototype.changeJob = function (newJob) {
this.job = newJob;
}
var person1 = new Person('Julia', 'programmer');
console.log(person1);
function Daughter (name, job) {
Person.call(this, name, job);
this.age = 15;
}
Person 하위에 Daughter라는 자식
function Person() {
this.name = '아무개';
}
Person.prototype.getName = function(){
console.log('내 이름은 : ' + this.name);
};
function Parents() {
console.log('Parents');
}
Parents.prototype = new Person();
Parents.prototype.constructor = Parents;
// 오버라이딩
Parents.prototype.getName = function(){
console.log('내 아이의 이름은 : ' + this.name + ' 입니다.');
};
var Child = new Parents();
Child.getName(); // 내 아이의 이름은 아무개 입니다.
function overload(a, b, c) {
if (typeof c === 'function') { // 문자열 두 개와 콜백
c(a, b);
}
else if (typeof b === 'function') { // 옵션 객체와 콜백
b(a);
} else { // 콜백 하나
a();
}
}
function callback(a, b) {
if (b) {
console.log('문자열', a, b);
}
else if (a) {
console.log('옵션 객체', a);
}
else {
console.log('매개변수 없음');
}
}
overload('zero', 'babo', callback); // 문자열 zero babo
overload({ name: 'zero', value: 'babo' }, callback); // 옵션 객체 { name: 'zero', value: 'babo' }
overload(callback); // 매개변수 없음