유형이 클래스와 다른 이유는 무엇입니까?
(일반적인 언어 불가지론 적 의미에서)
답변:
다음 답변은 Gof 책 ( 디자인 패턴 ) 에서 가져온 것입니다.
객체의 클래스 는 객체가 구현되는 방법을 정의합니다. 클래스는 객체의 내부 상태와 작업의 구현을 정의합니다.
반대로 객체의 유형 은 응답 할 수있는 요청 집합 인 인터페이스 만 참조합니다.
객체는 여러 유형을 가질 수 있고 다른 클래스의 객체는 동일한 유형을 가질 수 있습니다.
//example in c++
template<typename T>
const T & max(T const & a,T const &b)
{
return a>b?a:b; //> operator of the type is used for comparison
}
max 함수에는 해당 클래스에 대한 특정 max 함수를 생성하는 데 사용할 수있는 위의 요구 사항을 충족하는 모든 클래스가 인터페이스 중 하나로 자체 유형이있는 > 작업 유형이 필요합니다 .
나는 항상 '유형'을 '클래스'와 '원시'의 포괄적 용어로 생각합니다.
int foo; // Type is int, class is nonexistent.
MyClass foo; // Type is MyClass, class is MyClass
Wikipedia에서 영감을 얻음 ...
에서 유형 이론 용어;
유형 추상적 인 인터페이스입니다.
유형은 일반적으로 사람, 장소 또는 사물 또는 명사화 된 것과 같은 명사를 나타냅니다.
ㅏ 클래스 유형의 구현을 나타냅니다.
구체적인 데이터 구조와 서브 루틴 모음입니다.
서로 다른 구체적인 클래스는 동일한 추상 유형의 객체를 생성 할 수 있습니다 (유형 시스템에 따라 다름).
* 예를 들어 두 개의 클래스로 유형 Stack 을 구현할 수 있습니다 .SmallStack (작은 스택의 경우 빠르지 만 제대로 확장되지 않음)ScalableStack (물론 스케일하지만 작은 스택에 대한 높은 오버 헤드) *.
유사하게, 주어진 클래스는 여러 다른 생성자를 가질 수 있습니다 .
![]()
바나나 예.
Banana유형은 일반적으로 바나나의 특성과 기능을 나타내는 것입니다.
ABCBanana및XYZBanana클래스는 생산 바나나의 방법을 나타내는 것입니다.
(실생활에서 다른 바나나 공급자 또는 비디오 게임에서 바나나를 표현하고 그리는 다른 데이터 구조 및 기능).
ABCBanana클래스는 다음이다 특히 바나나를 생산할 수있는 인스턴스 의ABCBanana클래스를 , 그들은 것 오브젝트 의 유형 바나나 .
프로그래머가 유형에 대한 단일 및 유일한 구현을 제공하는 것은 드문 일이 아닙니다. 이 경우 클래스 이름은 종종 유형 이름 과 동일합니다 . 그러나 여전히 유형 (필요한 경우 인터페이스에서 추출 할 수 있음)과 클래스의 인스턴스 (객체)를 빌드하는 구현 (별도의 인터페이스를 구현 함)이 있습니다.
아래의 GoF 인용에서 발췌 :
개체의 클래스 는 객체가 구현되는 방법을 정의합니다. 클래스는 객체의 내부 상태와 해당 작업의 구현을 정의합니다.
반대로 객체의 유형 은 응답 할 수있는 요청 집합 인 인터페이스 만 참조합니다.
Java를 사용하여 예제를 제공하고 싶습니다.
public interface IType {
}
public class A implements IType {
public A{};
}
public class B implements IType {
public B{};
}
두 클래스 A및 B인터페이스를 구현하고 유형입니다 때문에 IType. 또한 Java에서는 두 클래스 모두 자체 유형을 생성합니다 (각 클래스 이름에 따라). 따라서 클래스 A는 유형 A 이고 IType 클래스 B는 유형 B 이며 IType 만족합니다.
객체는 여러 유형을 가질 수 있고 다른 클래스의 객체는 동일한 유형을 가질 수 있습니다.
하위 유형과 하위 클래스의 차이점은 해당 문제를 이해하는 데 도움이 될 것입니다.
https://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html
유형에는 데이터에 대한 설명 (예 : 속성, 작업 등)이 포함됩니다.
클래스는 특정 유형 입니다. 개체의 인스턴스를 만드는 템플릿 입니다.
엄밀히 말하면 클래스는 특별한 개념이며 객체의 일부 측면을 설명하는 메타 데이터의 하위 집합을 포함하는 패키지로 볼 수 있습니다 .
예를 들어 C #에서는 인터페이스와 클래스를 찾을 수 있습니다. 둘 다 유형이지만 인터페이스는 일부 계약 만 정의 할 수 있으며 클래스와 달리 인스턴스화 할 수 없습니다.
간단히 말해서 클래스 는 객체의 속성과 동작을 캡슐화하는 데 사용되는 특수 유형 입니다.
Wikipedia에서보다 완전한 답변을 얻을 수 있습니다.
유형은 개념적으로 클래스의 상위 집합입니다. 넓은 의미에서 클래스는 유형의 한 형태입니다.
클래스와 밀접한 관련이있는 인터페이스는 매우 특별한 종류의 클래스-순전히 추상적 인 클래스로 볼 수 있습니다. 이것들도 유형입니다.
따라서 "유형"은 클래스, 인터페이스 및 대부분의 언어 기본 요소도 포함합니다. 또한 dot-net CLR과 같은 플랫폼에는 구조 유형도 있습니다.
가장 빠른 방법으로 설명하려면 :
Struct는 유형이지만 Struct는 클래스가 아닙니다.
보시다시피 Type은 클래스 정의뿐만 아니라 float, int, bool과 같은 구조체 및 기본 데이터 유형에 대한 "추상적 인"용어입니다.
Type(표시된대로 대문자로 표시됨) System.Type유형에 대한 설명을 보유하는 데 사용되는 시스템 클래스 ( ) 의 짧은 이름이라는 것입니다 .
구별의 또 다른 예를 추가하려면 C ++에는 클래스를 참조 할 수 있지만 그 자체로는 클래스가 아닌 포인터 및 참조 유형이 있습니다.
Bar b; // b is of type "class Bar"
Bar *b2 = &b; // b2 is of type "pointer to Class Bar"
Bar &b3 = b; // b3 is of type "reference to Class Bar"
Bar *b4[7]; // b4 is of type "7-element array of pointers to Class Bar"
Bar ***b5; //b5 is of type "pointer to a pointer to a pointer to Class Bar"
하나의 클래스 만 관련되지만 거의 무한한 수의 유형을 사용할 수 있습니다. 일부 언어에서 함수는 "일급 객체"로 간주되며이 경우 함수 유형은 클래스입니다. 다른 경우 함수 유형은 포인터 일뿐입니다. 일반적으로 클래스에는 데이터를 보유 할 수 있다는 개념과 해당 데이터에 대한 작업이 있습니다.
내 생각은 aku의 대답과 거의 일치합니다.
클래스는 객체를 구축하기위한 템플릿으로 보지만 유형은 객체를 분류하고 인터페이스를 제공하는 방법입니다.
파이썬은 또한 클래스가 객체를 빌드하는 것과 같은 방식으로 클래스를 빌드하는 메커니즘 인 메타 클래스를 추가합니다 (그리고 클래스와 메타 클래스는 둘 다 객체입니다).
람바 궁극의 같은 질문에 대한이 대답 은 나에게 완벽한 설명처럼 보입니다.
유형은 특정 값으로 할 수있는 일의 집합이라고 생각합니다. 예를 들어, 정수 값이있는 경우이를 다른 정수에 추가 (또는 다른 산술 연산 수행)하거나 정수 인수를 허용하는 함수에 전달할 수 있습니다. 객체 값이있는 경우 해당 클래스에 정의 된 메서드를 호출 할 수 있습니다.
클래스는 해당 클래스의 객체로 수행 할 수있는 작업을 정의하므로 클래스는 유형을 정의합니다. 클래스는 메소드가 구현되는 방법 (유형에 의해 암시되지 않는 것)과 객체의 필드가 배치되는 방법에 대한 설명도 제공하므로 그 이상입니다.
객체 값은 하나의 클래스 만 가질 수 있지만 모든 수퍼 클래스는 객체의 클래스에서 사용할 수있는 기능의 하위 집합을 제공하기 때문에 여러 유형을 가질 수 있습니다.
따라서 객체와 유형은 밀접하게 관련되어 있지만 실제로는 동일하지 않습니다.
유형 일반적으로 정수, 문자열, 배열, 부울, 널 등과 같은 원시 값의 분류를 나타냅니다. 일반적으로 새 유형을 만들 수 없습니다.
클래스 는 객체가 생성 될 때 연관되는 명명 된 속성 및 메서드 집합을 나타냅니다. 일반적으로 원하는만큼 많은 새 클래스를 정의 할 수 있지만 일부 언어는 새 개체를 만든 다음 여기에 메서드를 연결해야합니다.
이 정의는 대부분 사실이지만 일부 언어는 유형과 클래스를 다양한 방식으로 결합하여 다양한 유익한 결과를 얻으려고 시도했습니다.
Int Float, char 등과 같은 C의 유형은 작업 할 수있는 특정 메서드로 작업 할 수있는 데이터를 정의합니다. 그것보다 더 복잡하지 않습니다. int처럼 곱하기, 빼기, 나눌 수 있습니다. 그것들은 int에 대한 내 방법 (또는 작업)입니다. 클래스는 단순히 새로운 유형의 정의입니다. 먼저 데이터가 어떻게 생겼는지 정의합니다. 아마도 단일 비트 일 것입니다. 실수와 허수 부분이있는 콤플렉스 같은 두 단어 일 수도 있습니다. 또는 목성에있는 이상한 입자의 원자 구성을 나타내는 309734325 바이트의 복잡한 물체 일 수도 있습니다. 상관 없어요. 정수처럼이 새로운 데이터 유형으로 할 수있는 작업을 구성합니다. 정수의 경우 더하기, 빼기 등이 있습니다.이 새로운 데이터 유형을 사용하여 이해가되는 모든 작업을 정의 할 수 있습니다. 그들은 더하기 빼기 등일 수 있습니다. 그러나 그들은 다른 것을 추가 할 수 있습니다. 이것들은 내가 수업에 추가하기로 결정한 모든 방법입니다.
결론은 C의 유형을 사용하면 데이터가 무엇인지 정의 할 수 있다는 것입니다. a byte, word, float, char 등. 그러나 이들 중 어느 것도 합법적 인 연산을 의미하며 신뢰할 수있는 결과를 생성합니다.
클래스는 인터페이스와 허용되는 작업을 정의하는 것은 사용자에게 달려 있다는 점을 제외하고 다르지 않습니다. 클래스는 이러한 사항을 정의하고 Object에서 인스턴스화 할 때 유형 정의가 작업 할 때 정수의 동작을 정의하는 것처럼 개체의 동작을 정의합니다.
클래스는 새로운 유형과 작동 방식에 대한 모든 것을 정의 할 수있는 유연성을 제공합니다.
이것이 정의되면 "thingy"클래스의 객체를 인스턴스화 할 때마다 내가 정의한 데이터 구조와 함께 수행 할 수있는 작업 (메소드)이 있습니다. 클래스 "thingy"는 분명히 C ++에서 정의 할 수있는 새로운 유형에 불과합니다.
흥미로운 질문입니다. 나는 aku의 대답이 확실하다고 생각합니다. 자바 ArrayList클래스를 예로 들어 보자
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList클래스 의 인스턴스는 확장하는 모든 수퍼 클래스와 구현하는 모든 인터페이스의 유형이라고합니다. 따라서 ArrayList클래스 의 인스턴스에는 ArrayList,, RandomAccess등 의 유형 Cloneable이 있습니다. 즉, 값 (또는 인스턴스)은 하나 이상의 유형에 속하고 클래스는 이러한 유형이 무엇인지 정의합니다.
다른 클래스는 동일한 유형을 설명 할 수 있습니다.
유형은 다음 부분으로 구성됩니다.
클래스는 다음 부분으로 구성됩니다.
몇 가지 참고 사항 :
인터페이스 (Java에서와 같이)는 의미를 설명하지 않기 때문에 유형이 아닙니다 (구문 만 설명 함).
하위 클래스는 하위 유형이 아닙니다. 하위 클래스는 상위 클래스에 정의 된 의미를 변경할 수 있기 때문에 하위 유형은 상위 유형 의미를 변경할 수 없습니다 (예 : 이 LSP 예제 와 같은 Liskov 대체 원리 참조 ).
이 질문을 C # 컨텍스트에서 생각하면 다음과 같은 답변에 도달합니다.
C # 유형 시스템은 다음 범주로 나뉩니다.
값 유형 :
참조 유형 :
보시다시피 C #에는 Class가 그중 하나 인 많은 유형이 있습니다. 한 가지 중요한 참고 사항이 있습니다. C #의 형식 시스템은 모든 형식의 값을 개체로 처리 할 수 있도록 통합되었습니다. C #의 모든 유형은 직접 또는 간접적으로 개체 클래스 유형에서 파생되며 개체는 모든 유형의 궁극적 인 기본 클래스입니다. 참조 유형의 값은 값을 유형 객체로 보는 것만으로도 객체로 취급됩니다. 값 유형의 값은 boxing 및 unboxing 작업을 수행하여 개체로 처리됩니다.
보시다시피 유형은 클래스 중 하나 인 많은 항목에 대한 우산입니다.
참조 : CSahrp 언어 사양 문서, 페이지 4