객체 지향 프로그래밍은 컴퓨터 프로그래밍 패러다임 중 하나이다.
단순히 프로그램을 일련의 명령어로 보는 것이 아니라, 여러 개의 독립적인 객체들의 모임으로 보는 것 이다.
이러한 객체들은 서로서로 메시지를 주고 받으며 데이터를 처리하는 상호작용을 한다.
클래스는 객체를 생성하기 위한 템플릿이다. - MDN
클래스는 연관되어 있는 변수와 메소드의 집합이다 - 생활코딩
우리는 클래스(class
)라는 일종의 설계도를 통해 구체적인 실체(instance
)를 만들어낸다.
// 아래의 User 클래스를 통해 name과 age를 가진 인스턴스를 만들 수 있다.
class User {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hello, ${this.name}`);
}
}
객체는 포괄적인 의미를 담고 있다.
추상적으로 존재하는 모든 사물은 객체(Object
)이다. 이러한 객체를 추상화하여 클래스가 만들어지고 이것을 구체화 한다면, 인스턴스가 만들어지는 것이다.
class
를 통해 구현된 구체적 실체이다.
// user1의 이름은 디온, 나이는 8살이다.
const user1 = new User('Dion', 8);
console.log(user1.name); // Dion
console.log(user1.age); // 8
이렇게 실체화된 인스턴스
는 메모리에 할당된다.
두 개의 클래스가 부모와 자식 관계를 형성하게 된다.
`User` 클래스는 부모 클래스가 되고, 이를 상속한 `VipUser` 클래스는 자식 클래스가 된다.
class VipUser extends User {
constructor(name, age, credit) {
// super를 통해 부모 생성자를 호출할 수 있다.
super(name, age);
this.credit = credit;
}
}
const vipUser1 = new VipUser('John', 28, 4700);
console.log(vipUser1.name); // John
console.log(vipUser1.age); // 28
console.log(vipUser1.credit); // 4700
또 하나의 새로운 클래스를 만드는 것보다 이미 만들어진 User라는 클래스 내의 속성들을 물려받아 쓰는 것이 프로그램의 유연성을 늘려준다.
여러개의 형태를 갖는 것이다
class VipUser extends User {
constructor(name, age, credit) {
super(name, age);
this.credit = credit;
}
/**
* 앞서 만들었던 `User Class`내 `greet()` 메소드와는 달리 다른 메시지를 출력한다.
* 같은 이름의 메소드지만 `override`를 통해 다른 기능을 수행한다.
*/
greet() {
console.log(`Wecome!!! ${this.name}`);
}
// 또, 추가적으로 새로운 메소드를 정의할 수 있다.
showCredit() {
console.log(`You have ${this.credit} remaining now`);
}
}