์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP)์ ์ง์ํ๋ฉฐ, ์ด๋ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฌ๊ฒ ํฅ์์ํต๋๋ค. ์ด๋ฌํ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ํต์ฌ ๊ฐ๋ ์ค ํ๋๊ฐ ์์(inheritance)์ด๋ฉฐ, ์ด๋ super์ override๊ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ super์ override์ ๊ฐ๋ ๊ณผ ์ฌ์ฉ๋ฒ์ ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฅผ ํตํด ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ ๋จ๊ณ ๋ ๊น์ด ์ดํดํ ์ ์์ ๊ฒ์ ๋๋ค.
โฃ ๋ชฉ์ฐจ
์์์ ๊ดํ ๋ด์ฉ์ ์๋ ํฌ์คํ
์ ์ฐธ๊ณ ํด ์ฃผ์ธ์๐
01. super ํค์๋์ ๊ฐ๋ ๊ณผ ํ์ฉ๐ก
super์ ์ ์
super๋ ES6(ECMAScript 2015)์์ ๋์ ๋ ํค์๋๋ก, ์๋ฐ์คํฌ๋ฆฝํธ ํด๋์ค ์์์์ ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์์ ํด๋์ค์์ ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์ด๋ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ ๋ super๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ๋ช ํํ๊ฒ ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
super๋ฅผ ์ฌ์ฉํ๋ ์ด์
์์์ ํตํด ๋ถ๋ชจ ํด๋์ค์ ๊ธฐ๋ฅ์ ์์ ํด๋์ค์์ ์ฌ์ฌ์ฉํ๊ณ ํ์ฅํ๊ธฐ ์ํด super๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋ ์ค๋ณต์ ์ค์ด๊ณ , ํด๋์ค ๊ฐ์ ๋ช ํํ ๊ด๊ณ๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
super์ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ ์์ ์ฝ๋
๋ค์์ super ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋จํ ์์ ์ ๋๋ค. ์ด ์์ ์์๋ Parent ํด๋์ค์ ์์ฑ์์ ๋ฉ์๋๋ฅผ Child ํด๋์ค์์ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
class Parent {
constructor(name) {
this.name = name;
}
greet() {
console.log(`Hello, my name is ${this.name}`);
}
}
class Child extends Parent {
constructor(name, age) {
super(name); // ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์ ํธ์ถ
this.age = age;
}
greet() {
super.greet(); // ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋ ํธ์ถ
console.log(`I am ${this.age} years old`);
}
}
const child = new Child('John', 25);
child.greet();
// ์ถ๋ ฅ:
// Hello, my name is John
// I am 25 years old
์์ ๊ด๊ณ์์์ super ํ์ฉ
์ ์์ ์์ super(name)์ ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํ์ฌ name ์์ฑ์ ์ด๊ธฐํํฉ๋๋ค. ๋ํ super.greet()์ ๋ถ๋ชจ ํด๋์ค์ greet ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋ถ๋ชจ ํด๋์ค์ ๊ธฐ๋ฅ์ ์ฌ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ฒ super๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ํด๋์ค์์ ๋ถ๋ชจ ํด๋์ค์ ๊ธฐ๋ฅ์ ํ์ฅํ๊ฑฐ๋ ๋ฎ์ด์ธ ์ ์์ต๋๋ค.
super๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์์ฌํญ
- super๋ ์์ ํด๋์ค์ ์์ฑ์ ๋ด์์ ํธ์ถ๋์ด์ผ ํ๋ฉฐ, ๋ฐ๋์ this ํค์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ํธ์ถ๋์ด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
- super๋ ํด๋์ค ๋ด๋ถ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค. ํด๋์ค ์ธ๋ถ์์ super๋ฅผ ํธ์ถํ๋ฉด ๋ฌธ๋ฒ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
02. override(์ค๋ฒ๋ผ์ด๋)์ ๊ฐ๋ ๊ณผ ํ์ฉ๐
์ค๋ฒ๋ผ์ด๋์ ์ ์
์ค๋ฒ๋ผ์ด๋๋ ์์ ํด๋์ค์์ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ์ ๋งํฉ๋๋ค. ์ด๋ฅผ ํตํด ์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์์ ์ ํ์์ ๋ง๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ค๋ฒ๋ผ์ด๋๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ๋คํ์ฑ์ ๊ตฌํํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋์ ํ์์ฑ
์๋ฐ์คํฌ๋ฆฝํธ์ ํด๋์ค ์์์์ ์์ ํด๋์ค๋ ๋ถ๋ชจ ํด๋์ค์ ๋ชจ๋ ๋ฉ์๋๋ฅผ ์์๋ฐ์ต๋๋ค. ํ์ง๋ง ํน์ ๋ฉ์๋์ ๋์์ ์์ ํด๋์ค์ ๋ง๊ฒ ๋ณ๊ฒฝํด์ผ ํ ๊ฒฝ์ฐ, ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ์๋ก์ด ๋์์ ์ ์ํ ์ ์์ต๋๋ค.
์ค๋ฒ๋ผ์ด๋์ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ ์์ ์ฝ๋
๋ค์์ ์์ ํด๋์ค์์ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ๋ ๊ฐ๋จํ ์์ ์ ๋๋ค.
class Parent {
greet() {
console.log('Hello from Parent');
}
}
class Child extends Parent {
greet() {
console.log('Hello from Child');
}
}
const child = new Child();
child.greet(); // ์ถ๋ ฅ: Hello from Child
์ ์์ ์์ Child ํด๋์ค๋ Parent ํด๋์ค์ greet ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ฌ ์์ ๋ง์ greet ๋ฉ์๋๋ฅผ ์ ์ํ์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก Child ๊ฐ์ฒด์ greet ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๊ฐ ์๋ ์์ ํด๋์ค์ ๋ฉ์๋๊ฐ ์คํ๋ฉ๋๋ค.
override ์ฃผ์์ฌํญ ๋ฐ ํ
- ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ ๋๋ ๋ฉ์๋ ์๊ทธ๋์ฒ(๋ฉ์๋ ์ด๋ฆ๊ณผ ๋งค๊ฐ๋ณ์ ๋ฆฌ์คํธ)๊ฐ ๋์ผํด์ผ ํฉ๋๋ค.
- ์ค๋ฒ๋ผ์ด๋๋ ๋ฉ์๋์์ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ค๋ฉด super ํค์๋๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- ์ค๋ฒ๋ผ์ด๋๋ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ณ , ํด๋์ค ๊ฐ์ ๋ช ํํ ์ญํ ๋ถ๋ด์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
03. super์ override๋ฅผ ํจ๊ป ์ฌ์ฉํ๊ธฐ๐ฏ
super์ override๋ฅผ ์กฐํฉํ ์ค์ ์์
super์ override๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ํ์ฅํ๊ฑฐ๋ ์ฌ์ ์ํ ๋ ์ ์ฉํฉ๋๋ค. ์์ ํด๋์ค์์ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ๋ฉด์, ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ super๋ฅผ ํตํด ํธ์ถํ์ฌ ๊ธฐ์กด ๊ธฐ๋ฅ์ ์ ์งํ๊ณ ์ถ๊ฐ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์์ต๋๋ค.
๋ค์ ์์ ๋ super์ override๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
class Parent {
greet() {
console.log('Hello from Parent');
}
}
class Child extends Parent {
greet() {
super.greet(); // ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋ ํธ์ถ
console.log('Hello from Child');
}
}
const child = new Child();
child.greet();
// ์ถ๋ ฅ:
// Hello from Parent
// Hello from Child
์ด ์์ ์์ Child ํด๋์ค๋ Parent ํด๋์ค์ greet ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ๊ณ , super.greet()์ ํธ์ถํ์ฌ ๋ถ๋ชจ ํด๋์ค์ greet ๋ฉ์๋๋ฅผ ์คํํ ํ, ์ถ๊ฐ๋ก "Hello from Child"๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
์์ ๊ด๊ณ์์์ super ํธ์ถ๊ณผ ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋
์์ ๊ด๊ณ์์ super์ ์ค๋ฒ๋ผ์ด๋๋ฅผ ์ ์ ํ ์ฌ์ฉํ๋ฉด ์์ ํด๋์ค๊ฐ ๋ถ๋ชจ ํด๋์ค์ ๊ธฐ๋ฅ์ ํ์ฅํ๊ฑฐ๋ ๋ฎ์ด์ธ ์ ์์ต๋๋ค. ๋ค์ ์์ ์์๋ ๋ ๋ณต์กํ ์์ ๊ตฌ์กฐ์์ super์ ์ค๋ฒ๋ผ์ด๋๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
class Animal {
makeSound() {
console.log('Some generic animal sound');
}
}
class Dog extends Animal {
makeSound() {
super.makeSound(); // ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋ ํธ์ถ
console.log('Bark');
}
}
class Labrador extends Dog {
makeSound() {
super.makeSound(); // ๋ถ๋ชจ ํด๋์ค(Dog)์ ๋ฉ์๋ ํธ์ถ
console.log('Woof');
}
}
const myLabrador = new Labrador();
myLabrador.makeSound();
// ์ถ๋ ฅ:
// Some generic animal sound
// Bark
// Woof
์ ์์ ์์ Labrador ํด๋์ค๋ Dog ํด๋์ค๋ฅผ ์์๋ฐ๊ณ , Dog ํด๋์ค๋ Animal ํด๋์ค๋ฅผ ์์๋ฐ์ต๋๋ค. Labrador ํด๋์ค์์ makeSound ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ๊ณ super.makeSound()๋ฅผ ํธ์ถํ์ฌ Dog ํด๋์ค์ makeSound ๋ฉ์๋๋ฅผ ์คํํ ํ, ์ถ๊ฐ๋ก "Woof"๋ฅผ ์ถ๋ ฅํฉ๋๋ค. Dog ํด๋์ค์ makeSound ๋ฉ์๋๋ ๋ค์ Animal ํด๋์ค์ makeSound ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ "Some generic animal sound"๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
์ฝ๋๋ก ์ดํดํ๋ ๋ณต์กํ ์์ ๊ตฌ์กฐ
๋ณต์กํ ์์ ๊ตฌ์กฐ์์๋ super์ ์ค๋ฒ๋ผ์ด๋๋ฅผ ์ ์ ํ ์ฌ์ฉํ๋ฉด ํด๋์ค ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ช ํํ ํ๊ณ ์ฝ๋์ ์ ์ง๋ณด์์ฑ์ ๋์ผ ์ ์์ต๋๋ค. ๋ค์ ์์ ๋ ์ฌ๋ฌ ๋จ๊ณ์ ์์ ๊ตฌ์กฐ์์ super์ ์ค๋ฒ๋ผ์ด๋๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
class Vehicle {
start() {
console.log('Starting the vehicle');
}
}
class Car extends Vehicle {
start() {
super.start(); // ๋ถ๋ชจ ํด๋์ค(Vehicle)์ ๋ฉ์๋ ํธ์ถ
console.log('Starting the car');
}
}
class ElectricCar extends Car {
start() {
super.start(); // ๋ถ๋ชจ ํด๋์ค(Car)์ ๋ฉ์๋ ํธ์ถ
console.log('Starting the electric car');
}
}
const myElectricCar = new ElectricCar();
myElectricCar.start();
// ์ถ๋ ฅ:
// Starting the vehicle
// Starting the car
// Starting the electric car
์ ์์ ์์ ElectricCar ํด๋์ค๋ Car ํด๋์ค๋ฅผ ์์๋ฐ๊ณ , Car ํด๋์ค๋ Vehicle ํด๋์ค๋ฅผ ์์๋ฐ์ต๋๋ค. ElectricCar ํด๋์ค์ start ๋ฉ์๋๋ super.start()๋ฅผ ํตํด Car ํด๋์ค์ start ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ , Car ํด๋์ค์ start ๋ฉ์๋๋ ๋ค์ Vehicle ํด๋์ค์ start ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค. ์ด๋ก์จ ๊ฐ ํด๋์ค์ start ๋ฉ์๋๊ฐ ์์ฐจ์ ์ผ๋ก ์คํ๋ฉ๋๋ค.
04. ๊ฒฐ๋ก ๋ฐ ์์ฝ๐
super์ override์ ํต์ฌ ์์ฝ
super์ ์ค๋ฒ๋ผ์ด๋๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ์ค์ํ ๊ฐ๋ ์ผ๋ก, ์์ ๊ด๊ณ์์ ๋ถ๋ชจ ํด๋์ค์ ์์ ํด๋์ค ๊ฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฌ์ฉํ๊ณ ํ์ฅํ ์ ์๊ฒ ํฉ๋๋ค.
super
- ์ ์: ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์ฌ์ฉ๋๋ ํค์๋.
- ์ฌ์ฉ ์ด์ : ์์ ํด๋์ค์์ ๋ถ๋ชจ ํด๋์ค์ ๊ธฐ๋ฅ์ ์ฌ์ฌ์ฉํ๊ณ ํ์ฅํ๊ธฐ ์ํด ์ฌ์ฉ.
- ์์
class Parent {
constructor(name) {
this.name = name;
}
greet() {
console.log(`Hello, my name is ${this.name}`);
}
}
class Child extends Parent {
constructor(name, age) {
super(name); // ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์ ํธ์ถ
this.age = age;
}
greet() {
super.greet(); // ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋ ํธ์ถ
console.log(`I am ${this.age} years old`);
}
}
const child = new Child('John', 25);
child.greet();
// ์ถ๋ ฅ:
// Hello, my name is John
// I am 25 years old
override (์ค๋ฒ๋ผ์ด๋)
- ์ ์: ์์ ํด๋์ค์์ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ.
- ์ฌ์ฉ ์ด์ : ์์ ํด๋์ค์์ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์์ ์ ์๊ตฌ์ ๋ง๊ฒ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์ฌ์ฉ.
- ์์
class Parent {
greet() {
console.log('Hello from Parent');
}
}
class Child extends Parent {
greet() {
console.log('Hello from Child');
}
}
const child = new Child();
child.greet(); // ์ถ๋ ฅ: Hello from Child
super์ override๋ฅผ ํจ๊ป ์ฌ์ฉํ๊ธฐ
- ์ ์: ์์ ํด๋์ค์์ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ๋ฉด์ super๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ.
- ์ฌ์ฉ ์ด์ : ๋ถ๋ชจ ํด๋์ค์ ๊ธฐ๋ณธ ๋์์ ์ ์งํ๋ฉด์ ์์ ํด๋์ค์์ ์ถ๊ฐ์ ์ธ ๋์์ ์ํํ๊ธฐ ์ํด ์ฌ์ฉ.
- ์์
class Parent {
greet() {
console.log('Hello from Parent');
}
}
class Child extends Parent {
greet() {
super.greet(); // ๋ถ๋ชจ ํด๋์ค์ ๋ฉ์๋ ํธ์ถ
console.log('Hello from Child');
}
}
const child = new Child();
child.greet();
// ์ถ๋ ฅ:
// Hello from Parent
// Hello from Child
๊ฒฐ๋ก
super์ ์ค๋ฒ๋ผ์ด๋๋ ์์์ ํตํด ๋ถ๋ชจ ํด๋์ค์ ๊ธฐ๋ฅ์ ์ฌ์ฌ์ฉํ๊ณ , ์์ ํด๋์ค์ ์๊ตฌ์ ๋ง๊ฒ ๊ธฐ๋ฅ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ํ์ฅํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ณ , ๋ช ํํ ํด๋์ค ๊ตฌ์กฐ๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.