순수한 가상 또는 추상, 이름은 무엇입니까?


15

Stack Overflow에서 가상 함수대한 질문을 하면서 순수 (추상) 및 비 순수 가상 함수에 대한 공식 명명이 있는지 궁금했습니다.

나는 항상 내 정보를 위해 위키 백과에 의존했는데, 이는 순수한 가상 함수 와 순수한 가상 함수가 일반적인 용어라는 것을 나타냅니다. 불행히도, 기사는 출처 또는 참조로 백업하지 않습니다.

순수하고 순수하지 않은 용어가 사용되는 일반적인 대답이라는 Jon Skeet의 답변을 인용하면 다음과 같습니다.

@Steven : 흠 ... 아마도 C ++의 맥락에서 본 적이 있습니다. 나는 그들에 대해 이야기하는 사람이 C ++ 배경을 가지고 있다고 생각합니다 :)

이 용어는 C ++에서 유래 했습니까, 아니면 먼저 초기 언어로 정의 또는 구현 되었습니까? '공식적인'과학 용어입니까?

최신 정보:

Frank Shearar는 SIMULA 67 공통 기본 언어 (1970) 의 설명에 대한 링크를 유용하게 제공했습니다 . 이 언어는 OO 키워드를 class , object , 가상 형식으로 공식 개념 으로 도입 한 최초의 언어 인 것 같습니다 . 그것은 하지 않습니다 정의 / 순수 비 순수 또는 추상적 하지만 이 개념을 지원합니다 .

누가 정의 했습니까?



2
가상 함수, 가상 상속, 가상 테이블- "가상"으로 만드는 것에 대한 실제 설명이 없습니다. 나는 규칙을 알고 있지만 왜 그런 말을 하는가? 결국, "가상"기능은 다른 기능과 마찬가지로 실제적입니다. 늦게 바인딩 된 조회 만 있으면됩니다. 아마도 Stroustrup은 그 단어를 정말 좋아했을 것입니다. 클래스는 추상적 (순수하지 않음) 인 반면 메소드는 순수 할 수 있다고 생각했습니다 (그러나 추상적이지 않음). 그래도 내가 만들었을 수도 있습니다.
Steve314

3
@ Steve314, 그것은 Stroustrup이 아니 었습니다. 분명히 Simula 에서 이미 이와 같이 불렀습니다 .
Péter Török

답변:


9

Nygaard와 Dahl은 SIMULA 67 공통 기본 언어에서이 용어를 처음 사용했습니다 . 예를 들어 섹션 2.1과 섹션 2.2.3을보십시오. (적어도 말할 수있는 한 OOP와 관련 하여이 용어의 첫 번째 사용 일 것입니다.)


3
Simula는 최초의 OO 언어 인 AFAIK이므로 OOP 컨텍스트에서 처음으로 많은 용어를 사용합니다. 그것은 처음에 C 효율과 Simula 클래스를 가진 언어를 원했던 Stroustrup에 큰 영향을 미쳤습니다.
David Thornley 2012

나는이 논문을 훑어보고 있는데, 그렇다. 그들이 '클래스'와 '객체'를 소개하면서 처음 인 것 같다.
Steven Jeuris

2
그래서 얼마 후 SIMULA 67 정의를 읽는 데 시간을 낭비했습니다. Simula 67은 1970 년에 '클래스', '객체', '숨겨진', '가치 별 호출', '참조 별 호출'과 함께 '가상'을 만들었습니다. '순수함', '순수하지 않음'또는 '추상'의 표시는 없습니다.
Steven Jeuris

5
"Wasted"는 현장의 주요 논문 중 하나를 읽는 데 사용되는 이상한 단어처럼 보입니다.
Frank Shearar

7

그래서 ... 나는 약간의 연구를 해왔다. 다음은 관심있는 사람들을위한 작은 역사 교훈입니다. :) 답변에만 관심이 있다면 맨 아래의 결론으로 ​​건너 뜁니다.

1967 :

첫 번째 객체 지향 프로그래밍 언어 인 SIMULA 67 은 키워드를 클래스 , 객체 , 참조 별 호출 , 값별 호출가상으로 정의 합니다.

SIMULA의 상속 시스템은 원래 수퍼 타입의 코드가 복사되어 서브 타입의 코드와 '연계'되었다는 사실을 언급 하는 다른 이름 인 연결 (이후 접두사 ) 로 알려져 있었습니다. 나중에 또 다른 형태의 상속 시스템delegation이 나타 났 으며 여기서 올바른 유형을 참조하여 호출이 위임됩니다.

가상가상 메소드 테이블 을 사용하여 올바른 구현에 대한 호출을 디스패치하기 위해 수행해야하는 프로세스를 가리 킵니다 . 고정 / 콘크리트 구현에 비해 가상입니다.

1971 :

Niklaus Wirth는 Stepwise Refinement 로 정의 된 개념에 대해 씁니다 . 기본적으로 프로그램을 확장 가능한 부분 솔루션으로 나누는 방법을 설명합니다.

1974 :

이것은 내가 동전 용어 발견 된 최초의 논문이다 추상 데이터 유형 에 의해 바바라리스 코브을 .

추상 데이터 형식은 해당 개체에서 사용 가능한 작업으로 완전히 특징 지워지는 추상 개체 클래스를 정의합니다. 이는 해당 유형의 특성화 작업을 정의하여 추상 유형을 정의 할 수 있음을 의미합니다. 프로그래머가 추상 데이터 객체를 사용하는 경우, 해당 객체가 나타내는 행동에만 관심이 있지만 구현을 통해 그 행동이 어떻게 달성되는지에 대한 세부 사항은 관심이 없습니다.

이 백서는 또한 현재 우리가 인터페이스 로 알고있는 것을 지정하는 것처럼 보이는 작업 클러스터 를 정의합니다 .

흥미로운 과학 용어 (1996 년 논문) :

상속 : 객체 나 클래스가 행동이나 데이터를 공유 할 수있는보다 낮은 수준의 메커니즘입니다.

서브 타이핑 : 개념적 전문화를 표현합니다. 인터페이스 상속 이라고도하는 특정 형태의 상속 .

추상화 원리 : 문제의 현상을 더 잘 이해하기 위해 응용 영역에 대한 지식을 추상화 순서의 계층 적 순위로 구성하는 프로세스.

부분적으로 구현 된 추상화 : 의도적으로 정의가 불완전한 추상화.

추상 클래스 : 객체 지향 시스템에서 부분적으로 구현 된 클래스의 특정 용어 .

엄격하지 않은 상속 : 하위 클래스에서 작업을 재정의하거나 제거 할 수 있습니다.

엄격한 상속 : 동작 호환 상속.

결론 :

추상 클래스 는 객체 지향 시스템에서 사용하는 가장 일반적인 용어입니다. 순수하고 순수하지 않은 가상 함수는 C ++에서만 발생하는 것 같습니다 . 예를 들어, Stroustrup과 의이 인터뷰 는 그가 용어를 발명 한 것으로 보입니다. 과학 논문은보다 일반적인 용어를 사용합니다.

가상 은 SIMULA에서 유래하여 사용량이 널리 퍼져 있지만 일반적인 용어는 아닙니다. 이미 구현 세부 사항을 정의했습니다. 상속 유형 측면에서 말하는 것이 더 적절합니다. 기본적으로 비가 상은 기본적 으로 엄격한 상속 에 해당하고 , 가상 은 기본적으로 비 엄격 상속에 해당합니다 .

위키 백과 항목 조정에 관심이있는 사람이 있습니까? :)


Barbara Liskov 이전에 Dijkstra는 "STEP-WISE PROGRAM COMPOSITION" 에 대해 언급 할 내용이 있었으며 관련 리소스 일 수도 있습니다.
Steven Jeuris

4

C ++에서 동적으로 바인딩되어 하위 클래스로 재정의 될 수있는 멤버 함수를 "가상"이라고합니다. 반드시 재정의해야하는 가상 기능을 "순수 가상"이라고합니다. 순수한 가상 함수에는 본문이있을 수 있지만 종종 그렇지는 않습니다. 순수한 가상 함수가 하나 이상있는 클래스를 "추상"이라고하며 인스턴스화 할 수 없으며 파생 된 것만 가능합니다.

가상 함수가 가상이라고하는 이유는 컴파일 타임에 어떤 실제 함수가 호출되는지 알 수 없기 때문입니다. 어떤 의미에서, 가상 함수 호출은 컴파일 타임에 "존재하지 않습니다".

또한 "가상"이라는 용어가 순수한 가상 함수가있는 클래스에 사용되는 이유는 해당 클래스의 객체를 가질 수 없기 때문입니다. 어떤 의미에서 그것은 구체적인 대상 세계에서 멀리 떨어진 추상적 개념이다.

편집 : 다른 언어.

"가상"이라는 용어가 얼마나 일반적인 지에 대한 질문은 여기 2 센트입니다. 스몰 토크에서 모든 함수는 동적 바인딩을 사용하므로 모두 가상이므로 특별한 용어 나 언어 키워드가 필요하지 않습니다. Java에서 내가 실수하지 않으면 컴파일러는 동적 바인딩을 사용할지 여부를 자동으로 결정합니다. 프로그래머에 관한 한 구별이 없기 때문에 "가상"키워드가 없습니다.

C ++에서는 가상 바인딩과 가상이 아닌 구분이 필요합니다. 동적 바인딩을 사용하지 않아도 오버 헤드를 절약하기 위해 동적 바인딩을 사용해야하는 시점을 결정하는 것은 프로그래머의 몫입니다.


1
+1 : 또한 "추상"은 많은 언어에 적용됩니다. "가상"은 그렇지 않습니다.
S.Lott

@ S.Lott : 전체 질문은 가상이 일반적인 용어인지 아닌지입니다. 내가 지금 알 수있는 한, virtual은 많은 언어에 적용되며 Simula에 의해 처음 만들어졌습니다. 순수한 / 순수하지 않은 추상적 인 질문이 남아 있습니다.
Steven Jeuris

@Steven Jeuris : "가상은 많은 언어에 적용됩니까?" 정말. 지금까지는 C, C ++ 및 Simula 인 것으로 보입니다. 파이썬에도 조금 적용되지는 않습니다. Java에는 적용되지 않는 것 같습니다.
S.Lott

오브젝트 파스칼 / 델파이에 적용됩니다. 델파이는 dynamic시간에 따라 공간을 교환하는 일종의 가상 메소드 인 추가 개념을 가지고 있습니다. 메소드보다 공간을 덜 차지하고 실행 속도가 느립니다 virtual.
Frank Shearar

2
@Steven Jeuris : "기본적으로 가상"은 추상 기능을 설명하기 위해 "가상"을 사용하는 것과 다릅니다. "모든 기능이 가상"이라고 말하는 사람들은 C ++ 개념을 다른 언어에 적용하고 있다고 생각합니다. 그리고 나는 그들이 잘못하고 있다고 생각합니다. 모든 메소드 함수는 Python에서 가상이므로 C ++ 개념을 Python에 적용하기 위해 Stack Overflow와 같은 경우를 제외하고는 "가상"을 사용하여 주제를 언급하지 않습니다. 파이썬 언어 문서는 단어를 사용하지 않기 때문에 가상의 경우 부적절하게 적용되는 것 같습니다.
S.Lott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.