제한된 정량화

유형 이론에서 **제한된 정량화**(, **제한된 다형성**(bounded polymorphism) 또는 **제한된 제네릭성**(constrained genericity)이라고도 함)는 특정 유형의 하위 유형으로만 범위가 제한되는("제한된") 전칭 또는 존재 한정자를 나타낸다. 제한된 정량화는 매개변수 다형성과 서브타이핑의 상호 작용이다. 제한된 정량화는 전통적으로 함수형 프로그래밍 환경인 System F<sub><:</sub>에서 연구되었지만, 자바, C#, 스칼라와 같이 매개변수 다형성(제네릭)을 지원하는 최신 객체 지향 언어에서 사용할 수 있다.

## 개요
제한된 정량화의 목적은 유형 상속 대신 객체의 특정 동작에 의존하는 다형성 함수를 허용하는 것이다. 이는 모든 클래스 멤버가 레코드 요소이고 모든 클래스 멤버가 명명된 함수인 객체 클래스에 대한 레코드 기반 모델을 가정한다. 객체 속성은 인수를 취하지 않고 객체를 반환하는 함수로 표현된다. 특정 동작은 함수 이름과 인수 유형 및 반환 유형이다. 제한된 정량화는 이러한 함수를 가진 모든 객체를 고려한다. 예를 들어, 서로 비교할 수 있는 모든 객체를 고려하는 다형성 `min` 함수가 있을 수 있다.

### F-제한된 정량화
1989년에 도입된 **''F''-제한된 정량화**(*F*-bounded quantification) 또는 **재귀적으로 제한된 정량화**(recursively bounded quantification)는 재귀 유형에 적용되는 함수에 대한 보다 정확한 유형 지정을 허용한다. 재귀 유형은 생성자로 함수를 포함하며, 해당 함수는 재귀 유형을 일부 인수의 유형으로 사용하거나, 함수 인수의 반환 값으로 사용하거나, 함수 인수의 함수 반환 값의 일부 인수로 사용하는 등 긍정적인 위치에서 사용한다.

## 예시
이러한 유형의 유형 제약 조건은 자바에서 제네릭 인터페이스로 표현할 수 있다. 다음 예시는 서로 비교할 수 있는 유형을 설명하고 이를 다형성 함수에서 유형 정보로 사용하는 방법을 보여준다. `Test.min` 함수는 단순 제한된 정량화를 사용하며, F-제한된 정량화를 사용하는 `Test.fMin` 함수와 달리 객체가 상호 비교 가능함을 보장하지 않는다.

수학적 표기법으로 두 함수의 유형은 다음과 같다.

:min: ∀ T, ∀ S ⊆ {compareTo: T → int}. S → S → S
:fMin: ∀ T ⊆ Comparable[T]. T → T → T

여기서

:Comparable[T] = {compareTo: T → int}


```java
interface Comparable<T> {

    int compareTo(T other);

}

public class Integer implements Comparable<Integer> {

    @Override
    public int compareTo(Integer other) {
        // ...
    }
}

public class String implements Comparable<String> {

    @Override
    public int compareTo(String other) {
        // ...
    }

}

public class Test {

    public static void main(String[] args) {
        final String a = min("cat", "dog");
        final Integer b = min(10, 3);
        final Comparable c = min("cat", 3); // Throws ClassCastException at runtime
        final String str = fMin("cat", "dog");
        final Integer i = fMin(10, 3);
        // final Object o = fMin("cat", 3); // Does not compile
    }

    public static <S extends Comparable> S min(S a, S b) {
        if (a.compareTo(b) <= 0) {
            return a;
        } else {
            return b;
        }
    }

    public static <T extends Comparable<T>> T fMin(T a, T b) {
        if (a.compareTo(b) <= 0) {
            return a;
        } else {
            return b;
        }
    }

}
```


## 같이 보기
* 공변성과 반변성 (컴퓨터 과학)
* 이상한 재귀 템플릿 패턴
* 와일드카드 (자바)

## 내용주

## 각주
* 
* Peter S. Canning, William R. Cook, Walter L. Hill, John C. Mitchell, and William Olthoff. "F-bounded polymorphism for object-oriented programming". In Conference on Functional Programming Languages and Computer Architecture, 1989.
* Benjamin C. Pierce "Intersection types and bounded polymorphism". Lecture Notes in Computer Science **664**, 1993.
* Gilad Bracha, 마틴 오더스키, David Stoutamire, and Philip Wadler. "Making the future safe for the past: Adding genericity to the Java programming language". In Object-Oriented Programming: Systems, Languages, Applications (OOPSLA). ACM, October 1998.
* Andrew Kennedy and Don Syme. "Design and Implementation of Generics for the .NET Common Language Runtime". In Programming Language Design and Implementation, 2001.
* , Chapter 26: Bounded quantification

## 외부 링크
* Bounded Polymorphism at the 포틀랜드 패턴 리포지토리
* "F-bounded Polymorphism" in The Cecil Language: Specification and Rationale

분류:객체 지향 프로그래밍
분류:유형 이론
분류:다형성 (컴퓨터 과학)