유형이 클래스와 다른 이유는 무엇입니까?
(일반적인 언어 불가지론 적 의미에서)
답변:
다음 답변은 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