학습 목표
- 클로저 모듈 패턴에 대해 설명할 수 있다.
- 클래스와 인스턴스에 대해 설명할 수 있다.
- 클래스 문법을 이용할 수 있다.
객체.메서드()
처럼 객체 내에서 메서드를 호출하는 방법을 의미정적 바인딩 방식(static binding)
컴파일 시점에 호출할 메서드가 결정됨
컴파일러가 변수의 타입을 분석하여 호출할 메서드를 결정!
실행 속도가 빠르고, 오류를 미리 잡을 수 있으나 다형성을 제대로 활용하지 못함
컴파일 : 소스 코드를 기계어로 변화하는 과정
컴파일러 : 소스 코드를 읽고, 구문 분석과 의미 분석을 수행하여, 오류 검출 -> 중간 코드를 생성하고 최적화 -> 기계어 코드 생성
다형성 : 객체 지향 프로그래밍에서 코드의 재사용성과 확장성을 높이는 중요한 기법, 상속과 인터페이스를 활용하여 다형성 구현
동적 바인딩 방식(dynamic binding)
// 예시
let Counter = (function() {
// 비공개 멤버
let count = 0;
// 공개된 멤버 객체를 반환하는 함수
function getCount() {
return count;
}
function incrementCount() {
count++;
}
function decrementCount() {
count--;
}
// 공개된 멤버 객체
return {
getCount: getCount,
incrementCount: incrementCount,
decrementCount: decrementCount
};
})();
console.log(Counter.getCount()); // 0
Counter.incrementCount();
console.log(Counter.getCount()); // 1
Counter.decrementCount();
console.log(Counter.getCount()); // 0
// 클로저를 이용해 매번 새로운 객체 생성 예제
function createPerson(name) {
let person = {
getName: function() {
return name;
},
setName: function(newName) {
name = newName;
}
};
return person;
}
let person1 = createPerson('Alice');
console.log(person1.getName()); // Alice
let person2 = createPerson('Bob');
console.log(person2.getName()); // Bob
person1.setName('Carol');
console.log(person1.getName()); // Carol
console.log(person2.getName()); // Bob
객체 지향 프로그래밍은 하나의 모델이 되는 청사진(blueprint)을 만들고, 그 청사진을 바탕으로 한 객체를 만드는 프로그래밍 패턴!
클래스는 객체를 만들기 위한 일종의 설계도나 틀
인스턴스는 클래스를 기반으로 생성된 구체적인 객체
new
키워드 사용ES5와 ES6에서의 클래스
function Animal(name, age, species){
// 인스턴스가 만들어 질 때 실행되는 코드
}
class Animal {
constructor(name, age, species) {
// 인스턴스가 만들어질 때 실행되는 코드
}
}
class Animal {
constructor(name, age, species) {
this.name = name;
this.age = age;
this.species = species;
} // 동물을 정의 하는 클래스
// name, age, species 속성
// constructor 은 생성자 함수 - return 값을 만들지 않음
move() {
console.log(this.name + ' is moving.');
} // 행동
makeSound() {
console.log(this.name + ' is making a sound.');
}
} // 행동
const dog = new Animal('doggy', 3, 'poodle'); // 인스턴스
dog.move(); // 출력: doggy is moving.
dog.makeSound(); // 출력: doggy is making a sound.
const cat = new Animal('kitty', 2, 'persian'); // 인스턴스
cat.move(); // 출력: kitty is moving.
cat.makeSound(); // 출력: kitty is making a sound.
객체 지향 프로그래밍에서 중요 개념
캡슐화(encapsulation)
추상화(abstraction)
상속(inheritance)
다형성(polymorphism)
Java나 TypeScript에서 클래스 내부에서만 쓰이는 속성 및 메서드를 구분시키기 위해 제공하는 키워드
하지만 은닉화를 도와주는 기능이 JavaScript에서는 널리 쓰이지 않음 정확히는 지원하는 브라우저가 적음 ㅜㅜ)
TypeScript에서는 속성이 존재해도, private 키워드가 붙어 있으면, 클래스 내부에서만 사용 가능
JavaScript에서는 은닉화를 돕기 위해서 일반적으로 클로저 모듈 패턴을 사용