Programing

Javascript의 다형성이란 무엇입니까?

lottogame 2020. 10. 8. 07:38
반응형

Javascript의 다형성이란 무엇입니까?


나는 인터넷에서 다형성 에 관한 기사를 읽을 수 있었다 . 하지만 그 의미와 그 중요성을 잘 이해하지 못했다고 생각합니다. 대부분의 기사에서는 이것이 왜 중요한지, 그리고 OOP (물론 JavaScript에서)에서 다형성 동작을 달성 할 수있는 방법을 설명하지 않습니다.

구현 방법에 대한 아이디어가 없기 때문에 코드 예제를 제공 할 수 없으므로 내 질문은 다음과 같습니다.

  1. 뭔데?
  2. 왜 필요한가요?
  3. 어떻게 작동합니까?
  4. 자바 스크립트에서이 다형성 동작을 어떻게 얻을 수 있습니까?

이 예가 있습니다. 그러나이 코드의 결과가 무엇인지 쉽게 이해할 수 있습니다. 다형성 자체에 대한 명확한 아이디어를 제공하지 않습니다.

function Person(age, weight) {
    this.age = age;
    this.weight = weight;
    this.getInfo = function() {
        return "I am " + this.age + " years old " +
        "and weighs " + this.weight +" kilo.";
    }
}
function Employee(age, weight, salary) {
    this.salary = salary;
    this.age = age;
    this.weight = weight;
    this.getInfo = function() {
        return "I am " + this.age + " years old " +
        "and weighs " + this.weight +" kilo " +
        "and earns " + this.salary + " dollar.";
    }
}

Employee.prototype = new Person();
Employee.prototype.constructor = Employee;
  // The argument, 'obj', can be of any kind
  // which method, getInfo(), to be executed depend on the object
  // that 'obj' refer to.

function showInfo(obj) {
    document.write(obj.getInfo() + "<br>");
}

var person = new Person(50,90);
var employee = new Employee(43,80,50000);
showInfo(person);
showInfo(employee);

다형성은 객체 지향 프로그래밍 (OOP)의 신조 중 하나입니다. 동작을 공유하고 특정 동작으로 공유 동작을 재정의 할 수 있도록 객체를 디자인하는 관행입니다. 다형성은이를 실현하기 위해 상속을 이용합니다.

OOP에서는 모든 것이 객체로 모델링되는 것으로 간주됩니다. 이 추상화는 자동차의 너트와 볼트로 내려가거나 1 년, 제조사, 모델이있는 단순한 자동차 유형만큼 광범위합니다.

다형성 자동차 시나리오를 가지려면 기본 자동차 유형이 있고 자동차에서 상속하고 자동차가 갖는 기본 동작 위에 자체 동작을 제공하는 하위 클래스가 있습니다. 예를 들어, 하위 클래스는 TowTruck이 될 수 있으며, 이는 여전히 연도의 제조사와 모델을 가지고 있지만, IsTowing의 플래그만큼 기본이 될 수있는 몇 가지 추가 동작과 속성을 리프트의 세부 사항만큼 복잡 할 수 있습니다.

사람과 직원의 예를 다시 살펴보면 모든 직원은 사람이지만 모든 사람은 직원이 아닙니다. 즉, 사람들은 수퍼 클래스가되고 직원은 하위 클래스가 될 것입니다. 사람들은 나이와 몸무게가있을 수 있지만 급여는 없습니다. 직원은 사람이므로 본질적으로 나이와 몸무게가 있지만 직원이기 때문에 급여를받습니다.

따라서이를 용이하게하기 위해 먼저 수퍼 클래스 (Person)를 작성합니다.

function Person(age,weight){
 this.age = age;
 this.weight = weight;
}

그리고 우리는 Person에게 그들의 정보를 공유 할 수있는 능력을 줄 것입니다.

Person.prototype.getInfo = function(){
 return "I am " + this.age + " years old " +
    "and weighs " + this.weight +" kilo.";
};

다음으로 Person, Employee의 하위 클래스를 갖고 싶습니다.

function Employee(age,weight,salary){
 this.age = age;
 this.weight = weight;
 this.salary = salary;
}
Employee.prototype = new Person();

그리고 Employee에 더 적합한 것을 정의하여 getInfo의 동작을 재정의합니다.

Employee.prototype.getInfo = function(){
 return "I am " + this.age + " years old " +
    "and weighs " + this.weight +" kilo " +
    "and earns " + this.salary + " dollar.";  
};

원래 코드 사용과 유사하게 사용할 수 있습니다.

var person = new Person(50,90);
var employee = new Employee(43,80,50000);

console.log(person.getInfo());
console.log(employee.getInfo());

그러나 Employee의 생성자가 사람의 생성자와 매우 유사하고 프로토 타입의 유일한 기능이 재정의되기 때문에 여기서 상속을 사용하여 얻을 수있는 것은 많지 않습니다. 다형성 디자인의 힘은 행동을 공유하는 것입니다.


이 다른 답변 에서 설명했듯이 다형성은 다른 해석을 가지고 있습니다.

제가 읽은 주제에 대한 가장 좋은 설명은 저명한 유형 이론가 인 Luca Cardelli 의 기사 입니다. 이 기사의 이름은 On Understanding Types, Data Abstraction 및 Polymorphism 입니다.

그것은 무엇입니까?

Cardelli는이 기사에서 여러 유형의 다형성을 정의합니다.

  • 만능인
    • 파라 메트릭
    • 포함
  • 애드 혹
    • oveloading
    • 강제

JavaScript에서는 다형성의 효과를 확인하기가 조금 더 어려울 수 있습니다. 왜냐하면보다 고전적인 유형의 다형성이 정적 유형 시스템에서 더 분명하게 나타나는 반면 JavaScript에는 동적 유형 시스템이 있기 때문입니다.

따라서 예를 들어 JavaScript에서는 컴파일 타임에 메서드 나 함수 오버로딩이나 자동 유형 강제 변환이 없습니다. 동적 언어에서 우리는 이러한 대부분을 당연한 것으로 간주합니다. 언어의 동적 특성으로 인해 JavaScript에서 매개 변수 다형성과 같은 것이 필요하지 않습니다.

그럼에도 불구하고 JavaScript에는 Java 또는 C #과 같은 다른 객체 지향 프로그래밍 언어에서 일반적으로 수행하는 것과 유사한 방식으로 하위 유형 다형성 (위의 Cardelli에 의해 포함 다형성으로 분류 됨)의 동일한 아이디어를 에뮬레이트하는 유형 상속의 한 형태가 있습니다. 위에서 공유 한 또 다른 답변).

동적 언어에서 매우 일반적인 또 다른 형태의 다형성은 덕 타이핑 이라고 합니다.

다형성이 객체 지향 프로그래밍에만 관련되어 있다고 믿는 것은 실수입니다. 다른 프로그래밍 모델 (기능적, 절차 적, 논리 등)은 유형 시스템에서 다른 형태의 다형성을 제공합니다. 아마도 OOP에만 사용되는 방식에는 약간 익숙하지 않을 것입니다.

왜 필요한가?

다형성은 소프트웨어에서 많은 좋은 속성을 조성하며, 무엇보다도 모듈 성과 재사용 성을 촉진하고 유형 시스템을보다 유연하고 유연하게 만듭니다. 그것이 없으면 유형에 대해 추론하기가 정말 어려울 것입니다. 다형성은 한 유형이 공용 인터페이스를 충족하는 경우 다른 호환 가능한 유형으로 대체 될 수 있도록하므로 정보 숨기기 및 모듈화도 촉진됩니다.

어떻게 작동합니까?

이것은 대답하기 쉽지 않습니다. 언어마다 구현 방법이 다릅니다. JavaScript의 경우 위에서 언급했듯이 프로토 타입 상속을 사용하여 유형 계층의 형태로 구체화되는 것을 볼 수 있으며 덕 타이핑을 사용하여 활용할 수도 있습니다.

주제는 약간 광범위하며 단일 게시물에서 두 개의 많은 질문을 열었습니다. Cardelli의 논문을 읽고 언어 나 프로그래밍 패러다임에 관계없이 다형성을 이해하려고 시도하는 것이 가장 좋을 것입니다. 그러면 이론적 개념과 JavaScript와 같은 특정 언어가 이러한 아이디어를 구현하기 위해 제공해야하는 것 사이에 연관성을 만들기 시작할 것입니다.


다형성의 목적은 무엇입니까?

다형성은 유형 동등성에 대한 조건을 완화하여 정적 유형 안전성을 잃지 않고 정적 유형 시스템을 더 유연하게 만듭니다. 유형 오류가없는 경우에만 프로그램이 실행된다는 증거가 있습니다.

다형성 함수 또는 데이터 유형은 더 넓은 범위의 시나리오에서 사용할 수 있기 때문에 단일형 함수보다 더 일반적입니다. 이러한 의미에서 다형성은 엄격하게 형식화 된 언어의 일반화 개념을 나타냅니다.

이것이 Javascript에 어떻게 적용됩니까?

Javascript에는 약하고 동적 유형 시스템이 있습니다. 이러한 유형 시스템은 하나의 유형 만 포함하는 엄격한 유형 시스템과 동일합니다. 이러한 유형을 거대한 공용체 유형 (의사 구문)으로 생각할 수 있습니다.

type T =
 | Undefined
 | Null
 | Number
 | String
 | Boolean
 | Symbol
 | Object
 | Array
 | Map
 | ...

모든 값은 런타임에 이러한 대체 유형 중 하나에 연결됩니다. 그리고 Javascript는 약한 유형이기 때문에 모든 값은 여러 번 유형을 변경할 수 있습니다.

유형 이론적 관점을 취하고 하나의 유형 만 있다고 생각하면 Javascript의 유형 시스템에는 다형성 개념이 없음을 확실하게 말할 수 있습니다. 대신 우리는 덕 타이핑과 암시 적 타입 강제를 가지고 있습니다.

그러나 이것이 우리 프로그램의 유형에 대해 생각하는 것을 막아서는 안됩니다. 자바 스크립트에는 타입이 없기 때문에 코딩 과정에서 유추해야합니다. 우리의 마음은 빠진 컴파일러에 대해 서 있어야합니다. 즉, 프로그램을 보자 마자 알고리즘뿐만 아니라 기본 (다형성) 유형도 인식해야합니다. 이러한 유형은보다 안정적이고 강력한 프로그램을 구축하는 데 도움이됩니다.

이 작업을 제대로 수행하기 위해 가장 일반적인 다형성 현상에 대한 개요를 제공하겠습니다.

파라 메트릭 다형성 (일명 제네릭)

Parametric polymorphism은 유형이 전혀 중요하지 않기 때문에 서로 다른 유형이 상호 교환 가능하다고 말합니다. 매개 변수 다형성 유형의 매개 변수를 하나 이상 정의하는 함수는 해당 인수에 대해 아무것도 알지 못하지만 모든 유형에 채택 할 수 있으므로 모두 동일하게 처리해야합니다. 이러한 함수는 데이터의 일부가 아닌 인수의 속성으로 만 작동 할 수 있기 때문에 매우 제한적입니다.

// parametric polymorphic functions

const id = x => x;

id(1); // 1
id("foo"); // "foo"

const k = x => y => x;
const k_ = x => y => y;

k(1) ("foo"); // 1
k_(1) ("foo"); // "foo"

const append = x => xs => xs.concat([x]);

append(3) ([1, 2]); // [1, 2, 3]
append("c") (["a", "b"]); // ["a", "b", "c"]

임시 다형성 (일명 오버로딩)

임시 다형성은 서로 다른 유형이 특정 목적에 대해서만 동등하다고 말합니다. 이러한 의미에서 동등 해지려면 유형이 해당 목적에 특정한 함수 세트를 구현해야합니다. 임시 다형성 유형의 매개 변수를 하나 이상 정의하는 함수는 각 인수에 연결된 함수 집합을 알아야합니다.

임시 다형성은 함수가 더 큰 유형의 도메인과 호환되도록합니다. 다음 예제는 "맵 오버"목적과 유형이이 제약 조건을 구현하는 방법을 보여줍니다. 함수 집합 대신 "맵핑 가능"제약 조건에는 단일 map함수 만 포함 됩니다.

// Option type
class Option {
  cata(pattern, option) {
    return pattern[option.constructor.name](option.x);
  }
  
  map(f, opt) {
    return this.cata({Some: x => new Some(f(x)), None: () => this}, opt);
  }
};

class Some extends Option {
  constructor(x) {
    super(x);
    this.x = x;
  }
};

class None extends Option {
  constructor() {
    super();
  }
};


// ad-hoc polymorphic function
const map = f => t => t.map(f, t);

// helper/data

const sqr = x => x * x;

const xs = [1, 2, 3];
const x = new Some(5);
const y = new None();

// application

console.log(
  map(sqr) (xs) // [1, 4, 9]
);

console.log(
  map(sqr) (x) // Some {x: 25}
);

console.log(
  map(sqr) (y) // None {}
);

하위 유형 다형성

다른 답변은 이미 하위 유형 다형성을 다루기 때문에 건너 뜁니다.

구조적 다형성 (일명 구조적 하위 유형 지정)

Structural polymorphism says that different types are equivalent, if they contain the same structure in such a way, that one type has all the properties of the other one but may include additional properties. That being said, structural polymorphism is duck typing at compile time and certainly offers some additional type safety. But by claiming that two values are of the same type just because they share some properties, it completely ignores the semantic level of values:

const weight = {value: 90, foo: true};
const speed =  {value: 90, foo: false, bar: [1, 2, 3]};

Unfortunately, speed is considered a subtype of weight and as soon as we compare the value properties we are virtually comparing apples with oranges.


what is it?

Poly= many, morphism=form or behavior shifting.

why we need it ?

In programming, It is used when we want a function's (let say function X's) interface to be flexible enough to accept different types or number of parameters. Also, based on changing parameters types or numbers, we might want the function X to behave differently (morphism).

How it works?

We write multiple implementations of X function where each implementation accepts different parameters types or number of parameters. Based on the type or number of parameter, the compiler (at runtime) decides which implementation of X should be executed when X is called from some code.

how can I achieve this polymorphic behavior in javascript?

JS is not a typed language so it really not meant to use OOP concepts like polymorphism. However, the newer version of JS now include classes and there is possibility that polymosphism could start making sense in JS, too. Other answers provide some interesting workarounds.


JavaScript is an interpreted language, not a compiled language.

Compile time Polymorhism( or Static polymorphism) Compile time polymorphism is nothing but the method overloading in java,c++

So method overloading is not possible in javascript.

But Dynamic (run time) polymorphism is the polymorphism existed at run-time so method overriding is possible in javascript

another example is PHP.


Polymorphism means Ability to call the same method on different objects and each object responds in different way is called POLYMORPHISM.

    function Animal(sound){
    this.sound=sound;
    this.speak=function(){
    			return this.sound;
    	}
    }
//one method 
    function showInfo(obj){
    		console.log(obj.speak());
    }
//different objects
    var dog = new Animal("woof");
    var cat = new Animal("meow");
    var cow = new Animal("humbow");
//responds different ways
    showInfo(dog);
    showInfo(cat);
    showInfo(cow);

참고URL : https://stackoverflow.com/questions/27642239/what-is-polymorphism-in-javascript

반응형