클래스와 인스턴스
클래스(class)와 인스턴스(instance)란?
- 객체 지향 프로그래밍은 하나의 모델이 되는 청사진을 만들고, 그 청사진을 바탕으로 한 객체를 만드는 프로그래밍 패턴이다. 하나의 모델이 되는 청사진이 클래스(class)이고, 그 청사진을 바탕으로 만들어진 것이 객체이면서 그 클래스의 인스턴스(instance)가 된다.
1. 클래스(Class)
- 함수가 특정 기능을 하는 구문(알고리즘, 로직)을 묶을 때 사용하는 문법이라면, 클래스는 이렇게 만들어진 수많은 변수와 함수 중 연관 있는 변수와 함수만을 선별해 하나로 묶을 때 사용하는 문법이다.
- 객체 지향 프로그래밍에서 특정 객체를 생성하기 위해 변수와 메서드를 정의하는 일종의 탬플릿으로, 객체를 정의하기 위한 상태(멤버 변수)와 메서드(함수)로 구성된다.
- 클래스는
class
라는 키워드를 사용하여 생성하고, 일반적인 다른 함수와 구분하기 위해 보통 대문자로 시작하며 일반명사로 만든다.
fucntion MyClass(속성) {
method1() { ... }
method2() { ... }
method3() { ... }
...
}
class MyClass {
constructor(속성) { ... }
method1() { ... }
method2() { ... }
method3() { ... }
...
}
function Student() {
this.name = 'name';
this.age = 'age';
this.grade = 'grade';
}
let kim = new Student()
console.log(kim)
1) 클래스의 상속(Class Inheritance)
1-1. extends
- 클래스를 상속하여 현재 클래스를 다른 클래스로 확장한다.
class [Child Class name] extends [Parent Class name] {
...}
class Animal {
constructor(name) {
this.name = name;
this.speed = 0;
}
run(speed) {
this.speed = speed;
return `${this.name} 은/는 속도 ${this.speed}로 달립니다.`;
}
stop() {
this.speed = 0;
return `${this.name} 이/가 멈췄습니다.`;
}
}
class Rabbit extends Animal {
hide() {
return `${this.name} 이/가 숨었습니다!`;
}
}
let rabbit = new Rabbit("흰 토끼");
rabbit.run(5);
rabbit.hide();
1-2. super
super
는 자신의 부모 클래스의 생성자를 호출하는 역할을 하며, 바로 위의 부모 클래스만이 아니라 부모의 부모나, 그 부모의 부모 클래스의 생성자까지 모두 호출한다.
super
는 extends
로 상속된 부모 클래스의 constructor()'를 의미한다.
- 생성자 함수 내에서 super를 호출하면 부모 클래스의 생성자 함수를 호출한다.
- 생성자 함수 내에서 쓰일때는
super
키워드는 한번만 사용될 수 있다.
this
키워드가 사용되기 전에 사용되어야 하며, 그렇지 않을 경우 Reference Error가 발생한다.
super(속성);
super.호출할 부모 메서드(속성);
class Person {
constructor(name, first, second) {
this.name = name;
this.first = first;
this.second = second;
}
sum() {
return this.first + this.second;
}
}
class PersonPlus extends Person {
constructor(name, first, second, third) {
super(name, first, second);
this.third = third;
}
sum() {
return super.sum() + this.third;
}
avg() {
return (this.first + this.second + this.third) / 3;
}
}
var kim = new PersonPlus('kim', 10, 20, 30);
console.log("kim.sum()", kim.sum());
console.log("kim.avg()", kim.avg());
2. 인스턴스(Instance)
- 인스턴스는 클래스의 속성과 메서드를 담고 있는 객체이다. (클래스로 만든 객체 === 인스턴스)
new
키워드를 통해 클래스의 인스턴스를 생성할 수 있으며, 이렇게 생성된 인스턴스는 클래스의 고유한 속성과 메서드를 가지게 된다.
- 파라미터들은 클래스를 정의할 때 설정했던 파라미터를 그대로 가져온다.
new 정의한 클래스명
function Student(name, age, grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
Student.prototype.study = function () {
return `${this.age}살 ${this.name}이(가) 공부를 시작했습니다.`
}
Student.prototype.rest = function () {
return `${this.age}살 ${this.name}이(가) 휴식을 취하고 있습니다.`
}
class Student {
constructor(name, age, grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
study() {
return `${this.age}살 ${this.name}이(가) 공부를 시작했습니다.`
}
rest() {
return `${this.age}살 ${this.name}이(가) 휴식을 취하고 있습니다.`
}
}
let kim = new Student("소라", 15, "중학생");
console.log(kim)
let han = new Student("송이", 17, "고등학생");
console.log(han).
kim.name
han.age
console.log(kim.study())
console.log(han.rest())