본문 바로가기
javaScript

자바스크립트에서의 다형성

by mooyou 2024. 4. 15.
728x90
300x250

다형성은 하나의 메소드나 함수가 여러 객체에 대해 다른 동작을 수행하는 능력을 의미하며 선언부분과 구현부분으로 나눠 구성된다.

 

자바를 예로 다형성을 살펴보자

// 인터페이스 선언
interface Animal {
    void speak();
}

// Dog 클래스는 Animal 인터페이스를 구현함
class Dog implements Animal {
    public void speak() {
        System.out.println("Dog barks.");
    }
}

// Cat 클래스도 Animal 인터페이스를 구현함
class Cat implements Animal {
    public void speak() {
        System.out.println("Cat meows.");
    }
}

public class Main {
    // Animal 인터페이스를 매개변수로 받는 메소드
    static void makeSound(Animal animal) {
        animal.speak();
    }
    
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal cat = new Cat();
        
        // 다형성을 통해 makeSound 메소드가 각 객체에 따라 다르게 호출됨
        makeSound(dog); // 출력: Dog barks.
        makeSound(cat); // 출력: Cat meows.
    }
}

 

위와 같이 일반 객체지향 프로그래밍에서는 다형성을 선언부분과 구현부분을 완전히 분리해서 구현할 수 있다.

 

하지만 자바스크립트에서는 명시적으로 다형성과 관련된 문법일 지원하지 않는다.

문법은 지원하지 않아도 다형성을 사용할 수는 있다.

 

ES6 이전버전 프로토타입 방식

//부모 생성자 함수
function Animal(name){
    this.name = name;
}

//부모 메소드
Animal.prototype.speak = function(){
    console.log(this.name + 'makes a sound');
}; // 정의 하지 않아도 자식 객체에서 오버라이딩해서 사용할 수 있다.

//자식 생성자 함수- Dog
function Dog(name) {
    Animal.call(this, name); // 부모 생성자 호출
}

function Cat(name) {
    Animal.call(this, name); // 부모 생성자 호출
}

//자식의 프로토타입을 부모의 인스턴스로 설정
Dog.prototype = Object.create(Animal.prototype);//Animal.prototype을 상속받는 새로운 객체를 만듬
Dog.prototype.constructor = Dog; //생성자 함수를 Dog 생성자 함수로 재설정

Cat.prototype = Object.create(Animal.prototype);
Cat.prototype.constructor = Cat;

//자식 메소드 오버라이딩
Dog.prototype.speak = function(){
    console.log(this.name + ' 멍멍');
};

Cat.prototype.speak = function(){
    console.log(this.name + ' 야옹');
};

var dog = new Dog('돌돌이');
var cat = new Cat('냥이');

dog.speak(); // 출력: 돌돌이 멍멍
cat.speak(); // 출력: 냥이 야옹

 

 

ES6 이후 클래스 방식


//부모 클래스
class Animal{
    constructor(name){
        this.name = name;
    }

    speak() {
        console.log(`${this.name} makes a sound.`);
    }
}

//자식 클래스
class Dog extends Animal{
    speak(){
        console.log(`${this.name} 멍멍`)
    }
}

class Cat extends Animal{
    speak(){
        console.log(`${this.name} 야옹`)
    }
}

var dog = new Dog('돌돌이');
var cat = new Cat('냥이');

dog.speak(); // 출력: 돌돌이 멍멍
cat.speak(); // 출력: 냥이 야옹

 

ES6 이후의 JavaScript에서는 클래스를 사용하여 상속을 구현하고, 필요에 따라 메소드를 오버라이딩하여 다형성을 구현할 수 있다. 

728x90
반응형

'javaScript' 카테고리의 다른 글

상속과 합성의 차이  (0) 2024.05.08
합성(Composition)  (0) 2024.05.02
오버라이드와 다형성의 차이  (0) 2024.04.02
여러개 체크박스 웹접근성 고려 - 비공개  (0) 2024.03.31
모듈 패턴(Module Pattern)  (0) 2024.03.14

댓글