서브타이핑/수정 이력

수정 이력

1개의 판이 있어요. 줄마다 펼쳐 바뀐 부분을 보거나, 두 판을 골라 비교할 수 있어요.

왼쪽 동그라미 = 이전 판, 오른쪽 = 이후 판
#729AI 조사: 게임 용어 문서GGWiki 자동 · · 현재 판+4,112자
1번째 줄 근처
추가: ## 개요
추가: 서브타이핑(subtyping)은 프로그래밍 언어 이론에서 유형 다형성(type polymorphism)의 한 형태다. 어떤 데이터 유형(서브타입)이 다른 데이터 유형(수퍼타입, supertype)과 대체 가능성(substitutability) 개념으로 연결되어 있을 때, 수퍼타입의 요소를 대상으로 작성된 프로그램 요소(일반적으로 서브루틴이나 함수)가 서브타입의 요소에서도 안전하게 작동할 수 있음을 의미한다. 기호로는 S <: T, S ⊑ T, S ≤: T 등으로 표기하며, S가 T의 서브타입임을 나타낸다. 서브타이핑 관계 덕분에 하나의 용어(term)가 둘 이상의 유형에 속할 수 있게 되므로 다형성을 실현한다[1][2][3].
추가:
추가: ## 역사·유래
추가:
추가: 프로그래밍 언어에서 서브타이핑 개념은 1960년대 시뮬라(Simula) 파생 언어에서 처음 등장했다. 1980년 존 C. 레이놀즈(John C. Reynolds)가 범주론(category theory)을 이용해 암시적 변환을 형식화하면서 최초의 엄밀한 처리를 제시했고, 1985년 루카 카르델리(Luca Cardelli)가 이를 발전시켰다. 객체 지향 프로그래밍이 주류로 채택되면서 서브타이핑은 다형성과 거의 동의어처럼 쓰이게 되었으며, 1987년 바바라 리스코프(Barbara Liskov)가 객체 지향 프로그래밍 회의 기조연설에서 리스코프 치환 원칙(Liskov substitution principle)을 널리 알렸다. 리스코프와 재닛 윙(Jeannette Wing)이 정의한 행동적 서브타이핑(behavioral subtyping)은 가변 객체를 고려해야 하므로 타입 검사기에서 구현 가능한 이상적인 서브타이핑 개념보다 훨씬 강한 조건이다[3].
추가:
추가: ## 작동 방식과 유형
추가:
추가: ### 대체 가능성과 서브섬션
추가:
추가: 서브타이핑의 핵심은 "안전하게 사용됨"과 "모든 컨텍스트"가 주어진 유형 형식이나 프로그래밍 언어에서 어떻게 정의되느냐에 달려 있다. 타입 시스템은 본질적으로 자체 서브타이핑 관계를 정의하며, 언어가 변환 메커니즘을 거의 지원하지 않으면 그 관계는 자명해질 수 있다[2][3].
추가:
추가: 타입 이론에서는 서브섬션(subsumption) 개념을 써서 S가 T의 서브타입인지 판정한다. 타입은 값의 집합으로 볼 수 있는데, 확장적으로(모든 값을 나열) 또는 의도적으로(멤버십 조건 술어로) 기술된다. T가 S를 서브섬션한다는 것은 T가 정의하는 값 집합이 S의 값 집합을 초집합으로 포함함을 뜻한다. 즉 S의 모든 멤버가 T의 멤버이기도 하다. 한 타입이 둘 이상의 타입에 의해 서브섬션될 수 있으며, 이때 수퍼타입들은 S에서 교차한다. S <: T라면 T를 기술하는 술어가 S를 정의하는 복합 술어의 일부가 되어야 한다. 정보 특수성 관점에서 서브타입은 수퍼타입보다 더 구체적(more specific)인데, 적어도 수퍼타입만큼의 정보를 담고 있기 때문이다. 이는 적용 가능성(applicability) 또는 관련성(relevance)을 높이는 반면, 내재된 선택 때문에 보급도(prevalence)는 낮아진다[3].
추가:
추가: ### 명목적 서브타이핑과 구조적 서브타이핑
추가:
추가: 타입 이론가들은 명목적 서브타이핑(nominal subtyping)과 구조적 서브타이핑(structural subtyping)을 구별한다. 명목적 서브타이핑에서는 특정 방식으로 선언된 타입끼리만 서브타입 관계가 성립하며, 클래스 기반 객체 지향 서브타이핑이 대표적이다. 구조적 서브타이핑에서는 두 타입의 구조가 서브타입 여부를 결정한다[3].
추가:
추가: ### 공변성과 반공변성
추가:
추가: 함수 타입에서 서브타이핑은 매개변수 위치에는 반공변성(contravariance), 반환 타입 위치에는 공변성(covariance)을 따른다. 이는 "함수 타입" 절에서 자세히 다루어진다[3].
추가:
추가: ### 레코드 서브타이핑과 함수형 프로그래밍
추가:
추가: 함수형 프로그래밍 언어에서는 레코드(record) 타입에 서브타이핑을 허용하는 경우가 많다. 레코드 타입으로 확장한 단순 타입 람다 계산은 서브타이핑의 유용한 개념을 정의하고 연구하기에 가장 간단한 이론적 틀이다. 이 계산에서는 항이 둘 이상의 타입을 가질 수 있으므로 더 이상 "단순" 타입 이론이 아니다. 함수형 언어는 정의상 함수 리터럴을 지원하고 이를 레코드에 저장할 수 있으므로, 서브타이핑이 있는 레코드 타입은 객체 지향 프로그래밍의 일부 기능을 제공한다. 일반적인 이론적 설정은 시스템 F<:(System F<:)이며, 객체 지향 프로그래밍의 이론적 특성을 포착하려는 다양한 계산이 여기에서 파생된다[2][3].
추가:
추가: ### 제한된 다형성
추가:
추가: 정수와 실수가 모두 Number의 서브타입이고, 임의의 Number를 비교하는 연산자가 두 타입에 정의되어 있다면 두 타입 값을 모두 이 함수에 넘길 수 있다. 그러나 그런 연산자를 구현하려면 Number 타입이 강하게 제약된다(예: 정수와 복소수 비교 불가). 실제로 정수끼리, 실수끼리만 비교하는 게 타당하므로, 같은 타입의 x, y만 받도록 고치려면 유계 다형성(bounded polymorphism)이 필요하다[3].
추가:
추가: ## 사례
추가:
추가: ### C++
추가:
추가: C++에서는 클래스 간 명시적 상속 관계로 서브타이핑을 설정한다. 클래스 B가 클래스 A를 상속하면 B는 A의 서브클래스이자 서브타입이 되어, B가 지정되는 곳 어디서든 참조·포인터·객체 자체로 A처럼 쓰일 수 있다[3].
추가:
추가: ### Python
추가:
추가: Python에서도 클래스 상속으로 명시적 서브타이핑 관계를 만든다. B가 A를 상속하면 B는 A의 서브클래스이자 서브타입이 되어, A가 필요한 자리에 B 인스턴스를 쓸 수 있다. type(a)는 일반 타입이고 type(type(a))는 메타타입이다. 배포판에서는 모든 타입이 같은 메타타입(PyType_Type, 자기 자신의 메타타입)을 갖지만 필수는 아니다. 구식 클래스의 타입인 types.ClassType도 별개 메타타입으로 볼 수 있다[3].
추가:
추가: ### Java
추가:
추가: Java에서는 한 클래스/인터페이스의 타입 매개변수와 다른 클래스/인터페이스의 타입 매개변수 간 is-a 관계가 extends와 implements 절로 결정된다. 컬렉션 클래스에서 ArrayList<E>는 List<E>를 구현하고 List<E>는 Collection<E>를 확장하므로, ArrayList<String>은 List<String>의 서브타입이고 이는 다시 Collection<String>의 서브타입이다. 서브타입 관계는 타입 매개변수 사이에도 자동으로 보존된다. 선택적 제네릭 값 P를 각 요소와 연관시키는 인터페이스 PayloadList를 정의하면, 그 매개변수화 중 일부가 List<String>의 서브타입이 된다[3].
추가:
추가: ### 생물 분류 예시
추가:
추가: 고양이과(Felidae) 안에 아과 펠리나에(Felinae)가 있고, 그 안에 속 펠리스(Felis)가 있으며, 집고양이(Felis catus)는 펠리스에 속한다. 술어 결합으로 Felis <: Felinae <: Felidae 서브타입 사슬이 성립한다. 따라서 펠리다에 타입 값을 받는 함수는 펠리나에와 펠리스 값에도 적용 가능하다[3].
추가:
추가: ## 규제·논란·평가
추가:
추가: ### 상속과의 혼동
추가:
추가: 서브타이핑을 객체 지향 언어의 (클래스 또는 객체) 상속(inheritance)과 혼동해서는 안 된다. 서브타이핑은 타입(객체 지향 용어로 인터페이스) 간의 관계인 반면, 상속은 기존 객체에서 새 객체를 생성할 수 있게 하는 언어 기능에서 비롯된 구현 간의 관계다. 여러 객체 지향 언어에서 서브타이핑을 인터페이스 상속(interface inheritance)이라 부르고, 상속을 구현 상속(implementation inheritance)이라고 부른다[2][3].
추가:
추가: ### 행동적 서브타이핑의 강도
추가:
추가: 리스코프와 윙이 정의한 행동적 서브타이핑은 가변 객체를 고려해야 하므로 정적 타입 검사기에서 구현할 수 있는 것보다 훨씬 강한 조건이다. 이는 이상적인 서브타이핑 개념과 실제 구현 사이의 간극을 보여준다[3].
추가:
추가: ### 언어학적·논리적 연관
추가:
추가: 서브타이핑 개념은 언어학의 하위어(hyponymy)와 전체어(holonymy) 개념, 수리논리의 제한된 수량화(bounded quantification) 개념(순서 정렬 논리, order-sorted logic)과 관련된다[2][3].
추가:
추가: 이 문서는 GGWiki AI가 공개 자료(아래 출처)를 조사해 새로 쓴 초안입니다. 틀린 내용은 편집하거나 이의 제기로 알려 주세요.

편집 요청

편집 요청이 없어요.