오버로딩은 동일한 이름의 매개변수의 갯수, 타입, 순서를 다르게 해서 같은 이름으로도 여러 개의 함수를 정의할 수 있는것을 말함
이는 프로그램의 유연성을 높이고 결과적으로 코드를 깔끔하게 하는 효과가 있으며 같으 클래스 내에서 사용 됨
function greet() {
if (arguments.length === 0) {
console.log('Hello!');
} else if (arguments.length === 1) {
console.log('Hello, ' + arguments[0] + '!');
} else if (arguments.length === 2) {
console.log('Hello, ' + arguments[0] + ' and ' + arguments[1] + '!');
} else {
let names = Array.from(arguments).join(' and ');
console.log('Hello, ' + names + '!');
}
}
greet(); // 출력: Hello!
greet('Alice'); // 출력: Hello, Alice!
greet('Alice', 'Bob'); // 출력: Hello, Alice and Bob!
greet('Alice', 'Bob', 'Charlie'); // 출력: Hello, Alice and Bob and Charlie!
위의 예제의 경우 하나의 함수이지만, 매개변수의 갯수에 따라 다른 동작을 수행하는 식의 방법을 보여주는데 이를 OverLoading 이라고 함
즉 greet 함수를 overLoading 하여 사용 함
오버라이딩은 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재 정의 하는것을 말함
상속관계의 클래스에서 사용되며 static, final로 선언한 메서드는 오버라이딩 불가 함
class Animal {
// 상위 클래스의 메서드
speak() {
console.log('Animal makes a sound');
}
}
class Dog extends Animal {
// 하위 클래스에서 메서드를 오버라이딩
speak() {
console.log('Dog barks');
}
}
const animal = new Animal();
animal.speak(); // 출력: Animal makes a sound
const dog = new Dog();
dog.speak(); // 출력: Dog barks
단 오버라이딩 된 메서드에서 상위 클래스의 메서드를 호출하고 싶다면 super 키워드를 사용하면 됨
class Animal {
speak() {
console.log('Animal makes a sound');
}
}
class Dog extends Animal {
speak() {
super.speak(); // 상위 클래스의 메서드 호출
console.log('Dog barks');
}
}
const dog = new Dog();
dog.speak();
이러면 오버라이딩 된 메서드 안에서도 상위 클래스의 메서드를 호출할 수 있음, 이러면 상위 클래스 기능도 유지하면서 하위 클래스의 고유한 기능을 추가할 수 있음