Overriding(오버라이딩)과 Overloading(오버로딩)은 객체지향 프로그래밍에서 다형성을 구현하는 방법이다.
상위 클래스(부모 클래스)의 메서드를 하위 클래스(자식 클래스)에서 재정의하는 것을 의미한다.
메서드의 이름, 매겨변수 타입, 반환 타입은 동일하게 가져야 한다.
상위 클래스의 메서드를 하위 클래스에서 필요에 맞게 수정하거나 추가적인 동작을 구현할 수 있다.
런타임 시에 메서드 호출 시 동적 바인딩되어 하위 클래스의 재정의된 메서드가 호출된다.
상속 관게에 있는 클래스 간에 발생한다.
같은 이름을 가진 메서드를 매개변수의 개수나 타입에 따라 다르게 정의하는 것을 의미한다.
메서드의 이름은 동일하지만, 매개변수의 타입, 개수, 순서가 다르게 선언된다.
메서드 호출 시 전달하는 인자의 타입과 개수에 따라 알맞은 메서드가 선택되어 호출된다.
컴파일러가 정적 바인딩되어 어떤 메서드가 호출되어야 하는지 결정된다.
같은 클래스 내에 중복된 이름의 메서드를 정의할 수 있다.
바인딩이란?
바인딩(Binding)은 프로그래밍에서 변수 또는 함수와 값을 연결하는 과정을 말한다.
- 정적 바인딩(Static Binding): 프로그램의 컴파일 또는 실행 초기에 변수나 함수와 그 값을 연결한다.
- 동적 바인딩(Dynamic Binding): 프로그램의 실행 도중에 바인딩이 동적으로 결정된다.
Overriding과 Overloading은 다형성을 지원하며 코드의 재사용성과 가독성을 높이는데 도움을 준다. Overriding은 상속 관계에서 상위 클래스의 메서드를 수정하거나 확장하는 데 사용되며, Overloading은 같은 이름의 다양한 매개변수를 가진 메서드를 정의하여 다양한 호출 방식을 지원하는 데 사용된다.
자바스크립트는 정확히 오버로딩 개념을 지원하지 않는다. 이는 자바스크립트의 동적 타입 특성과 함수의 유연한 특성에 기인한다. 자바스크립트에서는 같은 이름을 가진 함수를 여러 개 정의하고 매개변수의 타입이나 개수에 따라 다르게 동작하도록 구현할 수 있다.
너무 유연한거 아닌가?🤔
예를 들어, 자바스크립트에서는 함수 내부터에서 매개변수의 타입을 체크하거나 오버로딩한 함수를 정적으로 선택하는 기능이 내장되어 있지 않다. 대신에 함수 내부에서 조건문이나 타입 체크등을 사용하여 다양한 동작을 구현할 수 있다.
하지만 오버라이딩 개념은 자바스크립트에서 지원한다. 자바스크립트는 프로토타입 기반의 객체지향 언어로, 상속과 메서드 재정의를 통해 오버라이딩을 구현할 수 있다. 객체의 프로토타입 체인을 통해 상위 객체의 메서드를 하위 객체에서 재정의하여 사용할 수 있다.
따라서 자바스크립트에서는 오버라이딩 개념을 활용하여 상속과 다형성을 구현할 수 있지만, 오버로딩과 같이 매개변수의 타입이나 개수에 따라 다른 동작을 지원하는 기능은 별도의 내장 기능이 제공되지 않는다.
사실 자바를 사용할 줄 모르고 언어도 익숙하지 않기 때문에 자바에서의 예시로는 이해하기 어려워서 자바스크립트로 예제를 만들어 이해하기 위해 노력했다.
오버로딩은 동일한 함수 이름을 가지지만 매개변수의 타입이나 개수가 다른 여러 개의 함수를 정의하는 것을 말한다. 자바스크립트에서는 함수의 매개변수 타입이나 개수에 대한 제한 없이 동일한 이름을 가진 함수를 정의할 수 있다. 예를 들어 덧셈 함수를 오버로딩 하고 싶다면 다음과 같이 작성할 수 있다.
function add(x, y){
return x + y;
}
function add(x, y, z){
return x + y + z;
}
console.log(add(2, 3)); // 5
console.log(add(2, 3, 4)); // 9
자바스크립트에서는 함수의 매개변수를 확인하여 호출 시에 적절한 함수를 선택한다. 이때, 함수의 이름과 매개변수의 개수 및 타입이 일치해야 선택된다.
오버라이딩은 상속 관계에서 자식 클래스가 부모 클래스의 메서드를 재정의하는 것을 말한다. 자바스크립트는 프로토타입 기반의 상속을 지원하며, 이를 통해 오버라이딩과 유사한 동작을 구현할 수 있다. 예를 들어, 동물과 고양이 클래스가 있다고 가정해보자.
function Animal() {}
Animal.prototype.speak = function() {
return "Animal sound";
};
function Cat() {}
Cat.prototype = Object.create(Animal.prototype);
Cat.prototype.speak = function() {
return "Meow";
};
var animal = new Animal();
var cat = new Cat();
console.log(animal.speak()); // "Animal sound"
console.log(cat.speak()); // "Meow"
위 예제에서 Cat 클래스는 Animal 클래스를 상속받고, speak 메서드를 오버라이딩하여 고양이 소리를 반환한다. 이렇게 하면 cat 객체에서 speak 메서드를 호출 할 때, 오버라이딩된 메서드가 실행된다.
이처럼 자바스크립트에서는 오버로딩과 오버라이딩을 엄격하게 지원하지 않지만, 다양한 방법으로 함수의 동작을 다양화하고 상속을 통해 메서드를 재정의할 수 있다.