객체 지향 프로그래밍이란, 하나의 모델이 되는 청사진(blueprint)를 만들고, 그 청사진을 바탕으로 한 객체(Object)를 만드는 프로그래밍 패턴이다.
이렇게 단순한 문장으로만 설명하면 너무 추상적이기 때문에 일상생활 예시를 들어 설명을 하자면 다음과 같다.
청사진: 자동차 생산을 위한 설계도
생산된 객체: Avante, Porsche, Lamborghini ...
즉, 객체를 생성하기 위한 기본적인 틀을 만들고, 그 틀을 기반으로 다양한 값을 가진 유사한 객체 여럿을 찍어낸다고 생각하면 이해하기 쉬워진다.
객체 지향 프로그래밍에서 빼놓을 수 없는 개념은 바로 this 이다. 처음 이 개념을 접할 때에는 당최 이 this라는 예약어가 무엇을 지칭하는 지 전혀 감조차 잡을 수 없었다. 그만큼 어려운 개념이지만 한 번 이해하고 나면 정말 별거 없는 개념이기도 하다. this는 다음 예시 코드를 보며 이해하면 좋겠다.
let moon = {
name: 'moon',
age: 24,
gender: 'female',
printGender: function() {
console.log(moon.gender);
}
}
console.log(moon.printGender()); // 'female'
위와 같은 객체가 하나 있다고 가정하자. 이 객체는 'printGender'라는 함수를 속성으로 가지고 있다. 이 함수의 기능은 해당 객체가 가지고 있는 속성 중 'gender' 속성의 값을 콘솔로 출력하는 것이다. 여기까지는 문제가 없어보인다. 하지만 다음과 같은 상황이 생긴다면 어떻게 될까?
let kim = {
name: 'moon',
age: 24,
gender: 'female',
printGender: function() {
console.log(moon.gender);
}
}
console.log(kim.printGender()); // undefined
위와 같이 선언한 객체의 변수명을 바꾼다면, 그리고 그 안의 함수의 기능은 변하지 않는다면? 'moon' 이라는 객체를 'printGender'함수에서 참조할 수 없기 때문에 실행값은 undefined가 될 것이다. 이렇게 일일이 바꾸지 않아도 알아서 함수가 속해있는 객체를 참조할 수 있도록 만들어 주는 키워드가 this 이다.
let kim = {
name: 'moon',
age: 24,
gender: 'female',
printGender: function() {
console.log(this.gender);
}
}
console.log(kim.printGender()); // 'female'
위와 같이 this를 사용하면 객체의 이름이 무엇으로 바뀌든지 함수 자신이 속한 객체를 참조하여 원하는 값을 출력할 수 있도록 만들어 준다. 정리하자면, this는 this가 포함되어 있는 함수(또는 메소드)의 객체를 가리킨다.