자바스크립트는 다른 언어와 다르게 접근 제한자 키워드가 제공되지 않습니다. 클로저 모듈 패턴을 사용하여 변수와 함수를 직접 접근을 제한할 수 있습니다.
function makeCounter() {
let count = 0;
return {
increase: function() {
count++;
},
decrease: function() {
count--;
},
getValue: function() {
return count;
}
}
}
클로저 모듈 패턴 구현시 주의할 점은 화살표 함수 표현(arrow function expression)는 메서드(methods)로 사용할 수 없기 때문에 사용하면 안됩니다.
자바스크립트에서는 class 키워드가 ES6에서 처음 도입되었기 때문에, 클래스를 사용하는 방식이 ES5와 ES6에서 다릅니다.
생성자 함수는 일반 함수와 차이는 없지만 일반적으로 아래와 같이 사용합니다.
또 하나 알아두어야 할 점은 메소드 선언시 'prototype' 사용하여 할당한다는 점입니다.'prototype'을 사용하는 이유는 생성자 함수에 의해 생성된 각각의 객체에 프로퍼티를 공유하기 위해서 입니다. 'prototype'에 대해서는 여기서 다루지 않고 따로 정리하여 다루도록 하겠습니다.
function Person(name, age) {
// 인스턴스 생성시 실행할 코드 작성
this.name = name;
this.age = age;
Person.prototype.kick = function() {
}
Person.prototype.walk = function() {
}
}
함수형식 클래스와 다른 점은 생성시 실행할 코드를 constructor
생성자 키워드로 감싸야합니다. 그리고 클래스의 prototype 없이 바로 메소드 함수를 선언하면 됩니다.
class Person {
constructor(name, age) {
// 인스턴스 생성시 실행할 코드 작성
this.name = name;
this.age = age;
}
kick() {
}
walk() {
}
}
클래스 사용에서 알아두어야 할 키워드는 this인데요. 자바스크립트에서 new 키워드로 생성된 생성자 함수 암시적으로 this를 반환합니다.
function Person(name, age) {
// this = {}; (빈 객체가 암시적으로 생성)
this.name = name;
this.age = age;
// return this; (this가 암시적으로 반환)
}
위와 같이 클래스를 사용하는 프로그래밍을 객체 지향 프로그래밍이라고도 부를 수 있는데 이를 좀더 자세히 알아보겠습니다.
캡슐화(Encapsulation): 객체지향은 데이터와 기능을 하나의 단위로 묶어 객체안에 생성함으로써 느슨하게 결합(Loose coupling)하도록 만듭니다. 이러한 특징을 캡슐화라고 합니다. 캡슐화를 통해 외부로부터 내부의 보호함으로써 데이터를 은닉화(hiding)할 수 있게 됩니다.
추상화(abstration): 추상화는 객체에서 특징들만 뽑아 단순화하여 만든 것을 말합니다. 이를 통해 인터페이스가 단순해지는 효과를 볼 수 있습니다.
상속(Inheritance): 상속은 부모 클래스(기본 클래스)의 내용을 자식 클래스(파생 클래스)가 물려받는 것을 의미합니다.
다형성(Polymorphsim): 동일한 클래스로 생성한 여러 객체에서 동일한 이름의 메소드를 실행하더라도 서로 다르게 동작할 수 있습니다. 이를 다형성이라고 합니다.
이와 같은 특징들로 객체 지향 프로그래밍은 코드를 단순하게 만들 뿐만 아니라 재사용성이 높아지게 만듭니다.
자바스크립트에서느 생성자 함수 또는 class 키워드를 통해 객체 지향 프로그래밍을 할 수는 있지만, 다른 언어와 다르게 접근 제한자와 추상화를 지원하지 않습니다.