코딩을 처음 공부하는 나에게 '객체 지향 프로그래밍' 이라는 개념은 쉽게 이해되지 않았다. 강의를 듣거나 문제를 풀면서 개념을 대략적으로 이해하고 나서는 또 그 컨셉을 어떻게 실질적으로 코드에 사용해야하는지 감이 잘 오지 않았다. 그래서 이번 기회를 통해 OOP에 대해 정확하게 알고 넘어가보려고 한다.
A programing paradigm centered around objects rather than functions.
즉, 함수가 아닌 오브젝트 중심으로 돌아가는 프로그래밍 체계이다. 여기서 주의할 점은 OOP는 프로그래밍 Language나 tool이 아닌 스타일 혹은 프로그래밍 체계이다.
Class
Object
Instance
Property
Method
const circle = {
radious: 1;
location: {
x:1,
y:1},
draw: function() {
console.log('draw');
}
};
=> '{}'를 사용하여 객체를 직접 정의하는 방법을 말한다. 위와 같이 객체가 정의되는 순간, 객체는 ProtoType으로 Object.prototype을 가진다. 따라서 Object.prototype
에 정의된 메소드들을 사용할 수 있다. 이는 리터럴로 정의된 객체가 생성되는 것은 const circle = new Object();
이렇게 Object라는 생성자의 명령으로 이루어지기 때문이다.
function Circle(radious) {
this.radious = radious; //this is a basically reference to the object that is executing this piece of code.
this.draw = function() {
console.log('draw') ;
}
}
const another = new Circle(1); //creates empty object {}
=> 객체리터럴을 사용하면 쉽게 만들 수 있지만, 복수의 사용자, 메뉴 내 다양한 아이템 등을 객체로 표현하는 경우는 유사한 객체를 여러개 만들어야 한다. new
연산자와 생성자 함수를 사용하면 유사한 객체를 여러개 만들 수 있다.
생성자 함수 이름의 첫 글자는 대문자로 시작한다.
반드시 new
연산자를 붙여 실행한다.
new
를 써서 함수를 실행하게 되면,
1) 빈 객체를 만들어 this
에 할당하고, 2) 함수 본문을 실행한다. 그리고 this
에 새로운 프로퍼티를 추가한다. 3) this
를 반환한다. (new를 쓰는 순간 저절로 반환해야 할 것들을 모두 this
에 저장하고 자동으로 반환되기 때문에 명시적으로 함수에서 return할 필요가 없다.)
another
객체는 Circle
의 메소드 draw
에 접근이 가능하다.
let person = new Object({
name: 'Matthew',
age: 20,
greeting: function() {
console.log(`Hi, My name is ${this.name}.`);
}
});
const person = {
isHuman: false,
printIntroduction: function() {
console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
}
};
const me = Object.create(person);
me.name = 'Matthew' //'name' is a property set on 'me' but not on 'person'
me.isHuman = true; //inherited properties can be overwritten
me.printIntroduction();
// 'My name is Matthew. Am I human? true'
=> Object.create
메소드는 인자로 들어온 객체를 프로토타입으로 하는 새로운 객체를 생성한다. 생성자 함수를 사용한 것 처럼, 프로토타입 객체와 연결이 가능하다. 프로토타입 객체의 속성과 메소드를 가져다 쓸 수도 있고 새로 만들 수도 있다.
Reference
Object-oriented Programming in JavaScript: Made Super Simple | Mosh
모던 JavaScript 튜토리얼
MDN