유형과 클래스의 차이점은 무엇입니까?


답변:


123

다음 답변은 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 함수를 생성하는 데 사용할 수있는 위의 요구 사항을 충족하는 모든 클래스가 인터페이스 중 하나로 자체 유형이있는 > 작업 유형이 필요합니다 .


58

나는 항상 '유형'을 '클래스'와 '원시'의 포괄적 용어로 생각합니다.

int foo; // Type is int, class is nonexistent.

MyClass foo; // Type is MyClass, class is MyClass


7
좋은 간결한 설명 :
AKU

3
글쎄, .NET에서는 동일해야하며 기본 요소조차도 클래스 (또는 더 정확하게는 구조체)입니다.
dalle

4
@dalle : 동의했습니다. 유형과 클래스간에 고유 한 차이가 없습니다. Eddie의 예는 C ++ / Java에 매우 의존적입니다. 그것은 전혀 정의가 아닙니다.
Robert Gould

클래스 대 '유형'의 "THE"정의를 얻는 것이 어려울 것이라고 생각합니다. 많은 언어에 자체 타이핑 시스템이 있습니다. .NET에 대해 들었던 한 가지 정의는 '유형'이 참조 유형과 값 유형을 모두 포함하는 반면 클래스는 참조 유형을 설명하는 데만 사용된다는 것입니다.
Eddie Parker

2
int는 System.Int32의 약어가 아닌가? 즉, int foo; // 유형은 int, 클래스는 System.Int32?
Svish 2009-06-05

54

Wikipedia에서 영감을 얻음 ...

에서 유형 이론 용어;

  • 유형 추상적 인 인터페이스입니다.
    유형은 일반적으로 사람, 장소 또는 사물 또는 명사화 된 것과 같은 명사를 나타냅니다.

  • 클래스 유형의 구현을 나타냅니다.
    구체적인 데이터 구조와 서브 루틴 모음입니다.

    서로 다른 구체적인 클래스는 동일한 추상 유형의 객체를 생성 할 수 있습니다 (유형 시스템에 따라 다름).

    * 예를 들어 두 개의 클래스로 유형 Stack 을 구현할 수 있습니다 .SmallStack (작은 스택의 경우 빠르지 만 제대로 확장되지 않음)ScalableStack (물론 스케일하지만 작은 스택에 대한 높은 오버 헤드) *.

    유사하게, 주어진 클래스는 여러 다른 생성자를 가질 수 있습니다 .

여기에 이미지 설명 입력

바나나 예.

  • Banana 유형은 일반적으로 바나나의 특성과 기능을 나타내는 것입니다.

  • ABCBananaXYZBanana 클래스는 생산 바나나의 방법을 나타내는 것입니다.
    (실생활에서 다른 바나나 공급자 또는 비디오 게임에서 바나나를 표현하고 그리는 다른 데이터 구조 및 기능).

    ABCBanana클래스는 다음이다 특히 바나나를 생산할 수있는 인스턴스ABCBanana 클래스를 , 그들은 것 오브젝트유형 바나나 .

프로그래머가 유형에 대한 단일 및 유일한 구현을 제공하는 것은 드문 일이 아닙니다. 이 경우 클래스 이름은 종종 유형 이름 과 동일합니다 . 그러나 여전히 유형 (필요한 경우 인터페이스에서 추출 할 수 있음)과 클래스의 인스턴스 (객체)를 빌드하는 구현 (별도의 인터페이스를 구현 함)이 있습니다.


4
실제 사례가 제공되지 않는 한 배우는 데 어려움을 겪는 사람으로서 이것은 정말 저를 도왔습니다. 감사.
alexc95

13

유형은 사용 가능한 모든 개체 템플릿 또는 개념에 대한 포괄적 인 용어입니다. 클래스는 이러한 개체 템플릿 중 하나입니다. 구조 유형, 정수 유형, 인터페이스 유형 등도 마찬가지입니다. 모두 유형입니다.

원하는 경우 다음과 같이 볼 수 있습니다. 유형은 상위 개념입니다. 다른 모든 개념 : 클래스, 인터페이스, 구조, 정수 등은이 개념에서 상속됩니다.


5

아래의 GoF 인용에서 발췌 :

개체의 클래스 는 객체가 구현되는 방법을 정의합니다. 클래스는 객체의 내부 상태와 해당 작업의 구현을 정의합니다.

반대로 객체의 유형 은 응답 할 수있는 요청 집합 인 인터페이스 만 참조합니다.

Java를 사용하여 예제를 제공하고 싶습니다.

public interface IType {
}

public class A implements IType {
public A{};
}

public class B implements IType {
public B{};
}

두 클래스 AB인터페이스를 구현하고 유형입니다 때문에 IType. 또한 Java에서는 두 클래스 모두 자체 유형을 생성합니다 (각 클래스 이름에 따라). 따라서 클래스 A는 유형 A 이고 IType 클래스 B는 유형 B 이며 IType 만족합니다.

객체는 여러 유형을 가질 수 있고 다른 클래스의 객체는 동일한 유형을 가질 수 있습니다.

하위 유형과 하위 클래스의 차이점은 해당 문제를 이해하는 데 도움이 될 것입니다.

https://www.cs.princeton.edu/courses/archive/fall98/cs441/mainus/node12.html


4

유형에는 데이터에 대한 설명 (예 : 속성, 작업 등)이 포함됩니다.

클래스는 특정 유형 입니다. 개체의 인스턴스를 만드는 템플릿 입니다.

엄밀히 말하면 클래스는 특별한 개념이며 객체의 일부 측면을 설명하는 메타 데이터의 하위 집합을 포함하는 패키지로 볼 수 있습니다 .

예를 들어 C #에서는 인터페이스와 클래스를 찾을 수 있습니다. 둘 다 유형이지만 인터페이스는 일부 계약 만 정의 할 수 있으며 클래스와 달리 인스턴스화 할 수 없습니다.

간단히 말해서 클래스 는 객체의 속성과 동작을 캡슐화하는 데 사용되는 특수 유형 입니다.

Wikipedia에서보다 완전한 답변을 얻을 수 있습니다.


4

유형은 개념적으로 클래스의 상위 집합입니다. 넓은 의미에서 클래스는 유형의 한 형태입니다.

클래스와 밀접한 관련이있는 인터페이스는 매우 특별한 종류의 클래스-순전히 추상적 인 클래스로 볼 수 있습니다. 이것들도 유형입니다.

따라서 "유형"은 클래스, 인터페이스 및 대부분의 언어 기본 요소도 포함합니다. 또한 dot-net CLR과 같은 플랫폼에는 구조 유형도 있습니다.


rajKumar, 질문이 매우 모호합니다. 당신은 어떤 언어의 특징으로서 "유형"에 대해 생각합니까, 아니면 일반적인 개념으로서입니까?
aku

모든 사용자 정의 유형이 적어도 모든 언어가 아닌 클래스는 아닙니다.
jalf

jalf, 그것이 잘못된 특성이라는 데 동의합니다. 인터페이스도 사용자 정의되며 사용자 정의 유형이있을 수 없습니다. 클래스는 특별한 요구를 제공하는 특수한 유형입니다 (객체의 인스턴스 생성)
aku

인터페이스는 단순한 특수 유형, 순수하게 추상적 인 클래스입니다. 이는 여전히 유형입니다 (더 큰 의미에서).
Lawrence Dol

Software Monkey, 인터페이스는 순수하게 추상적 인 클래스가 아니라 특별한 개념입니다. "사용자 정의"는 클래스의 정의 속성이 아닙니다
aku

4

가장 빠른 방법으로 설명하려면 :

Struct는 유형이지만 Struct는 클래스가 아닙니다.

보시다시피 Type은 클래스 정의뿐만 아니라 float, int, bool과 같은 구조체 및 기본 데이터 유형에 대한 "추상적 인"용어입니다.


2
클래스가 아닌 유형이 존재하는 프레임 워크 의 예로 .net CLR을 언급하는 것이 좋습니다 (.net에는 더 많은 유형의 유형이 있지만 Java는 다른 유형으로 인용 될 수 있음). 그러나 .net에서 추가로 작은 주름은 Type(표시된대로 대문자로 표시됨) System.Type유형에 대한 설명을 보유하는 데 사용되는 시스템 클래스 ( ) 의 짧은 이름이라는 것입니다 .
supercat

3

구별의 또 다른 예를 추가하려면 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"

하나의 클래스 만 관련되지만 거의 무한한 수의 유형을 사용할 수 있습니다. 일부 언어에서 함수는 "일급 객체"로 간주되며이 경우 함수 유형은 클래스입니다. 다른 경우 함수 유형은 포인터 일뿐입니다. 일반적으로 클래스에는 데이터를 보유 할 수 있다는 개념과 해당 데이터에 대한 작업이 있습니다.


3

내 생각은 aku의 대답과 거의 일치합니다.

클래스는 객체를 구축하기위한 템플릿으로 보지만 유형은 객체를 분류하고 인터페이스를 제공하는 방법입니다.

파이썬은 또한 클래스가 객체를 빌드하는 것과 같은 방식으로 클래스를 빌드하는 메커니즘 인 메타 클래스를 추가합니다 (그리고 클래스와 메타 클래스는 둘 다 객체입니다).

람바 궁극의 같은 질문에 대한이 대답 은 나에게 완벽한 설명처럼 보입니다.


2

유형은 특정 값으로 할 수있는 일의 집합이라고 생각합니다. 예를 들어, 정수 값이있는 경우이를 다른 정수에 추가 (또는 다른 산술 연산 수행)하거나 정수 인수를 허용하는 함수에 전달할 수 있습니다. 객체 값이있는 경우 해당 클래스에 정의 된 메서드를 호출 할 수 있습니다.

클래스는 해당 클래스의 객체로 수행 할 수있는 작업을 정의하므로 클래스는 유형을 정의합니다. 클래스는 메소드가 구현되는 방법 (유형에 의해 암시되지 않는 것)과 객체의 필드가 배치되는 방법에 대한 설명도 제공하므로 그 이상입니다.

객체 값은 하나의 클래스 만 가질 수 있지만 모든 수퍼 클래스는 객체의 클래스에서 사용할 수있는 기능의 하위 집합을 제공하기 때문에 여러 유형을 가질 수 있습니다.

따라서 객체와 유형은 밀접하게 관련되어 있지만 실제로는 동일하지 않습니다.


2

유형 일반적으로 정수, 문자열, 배열, 부울, 널 등과 같은 원시 값의 분류를 나타냅니다. 일반적으로 새 유형을 만들 수 없습니다.

클래스 는 객체가 생성 될 때 연관되는 명명 된 속성 및 메서드 집합을 나타냅니다. 일반적으로 원하는만큼 많은 새 클래스를 정의 할 수 있지만 일부 언어는 새 개체를 만든 다음 여기에 메서드를 연결해야합니다.

이 정의는 대부분 사실이지만 일부 언어는 유형과 클래스를 다양한 방식으로 결합하여 다양한 유익한 결과를 얻으려고 시도했습니다.


1
유형이 부족한 언어 C에서도 새로운 유형을 만들 수 있지만 구조체, 레코드 및 클래스가 모두 서로 닮은 점을 제외하고는 사람들이 일반적으로 클래스로 생각하는 것과는 다릅니다.
James Iry 2012

2

에서 일반적인 언어 불가지론 의미 - 클래스 입니다 실현유형 .

종종 이것이 해당 유형 의 유일한 실현 인 경우 두 용어를 모두 사용하여 일부 컨텍스트에서 참조 할 수 있습니다.

반대로, 예를 들어 C # 컨텍스트에서 클래스 는 프리미티브, 구조체, 포인터 등과 같은 Type 개념 의 더 많은 구현 중 하나 일뿐 입니다 .


2

Int Float, char 등과 같은 C의 유형은 작업 할 수있는 특정 메서드로 작업 할 수있는 데이터를 정의합니다. 그것보다 더 복잡하지 않습니다. int처럼 곱하기, 빼기, 나눌 수 있습니다. 그것들은 int에 대한 내 방법 (또는 작업)입니다. 클래스는 단순히 새로운 유형의 정의입니다. 먼저 데이터가 어떻게 생겼는지 정의합니다. 아마도 단일 비트 일 것입니다. 실수와 허수 부분이있는 콤플렉스 같은 두 단어 일 수도 있습니다. 또는 목성에있는 이상한 입자의 원자 구성을 나타내는 309734325 바이트의 복잡한 물체 일 수도 있습니다. 상관 없어요. 정수처럼이 새로운 데이터 유형으로 할 수있는 작업을 구성합니다. 정수의 경우 더하기, 빼기 등이 있습니다.이 새로운 데이터 유형을 사용하여 이해가되는 모든 작업을 정의 할 수 있습니다. 그들은 더하기 빼기 등일 수 있습니다. 그러나 그들은 다른 것을 추가 할 수 있습니다. 이것들은 내가 수업에 추가하기로 결정한 모든 방법입니다.

결론은 C의 유형을 사용하면 데이터가 무엇인지 정의 할 수 있다는 것입니다. a byte, word, float, char 등. 그러나 이들 중 어느 것도 합법적 인 연산을 의미하며 신뢰할 수있는 결과를 생성합니다.

클래스는 인터페이스와 허용되는 작업을 정의하는 것은 사용자에게 달려 있다는 점을 제외하고 다르지 않습니다. 클래스는 이러한 사항을 정의하고 Object에서 인스턴스화 할 때 유형 정의가 작업 할 때 정수의 동작을 정의하는 것처럼 개체의 동작을 정의합니다.

클래스는 새로운 유형과 작동 방식에 대한 모든 것을 정의 할 수있는 유연성을 제공합니다.

이것이 정의되면 "thingy"클래스의 객체를 인스턴스화 할 때마다 내가 정의한 데이터 구조와 함께 수행 할 수있는 작업 (메소드)이 있습니다. 클래스 "thingy"는 분명히 C ++에서 정의 할 수있는 새로운 유형에 불과합니다.


1

유형과 클래스는 서로 관련되어 있지만 동일하지는 않습니다. 필자는 클래스가 구현 상속에 사용되는 반면 유형은 런타임 대체에 사용된다는 것입니다.

다음대체 원칙 과 하위 클래스와 하위 유형이 항상 동일한 것이 아닌 이유를 설명하는 링크 입니다 (예 : Java에서). 공분산 및 반공 분산에 대한 위키피디아 페이지에는이 구별에 대한 자세한 정보가 있습니다.


0

흥미로운 질문입니다. 나는 aku의 대답이 확실하다고 생각합니다. 자바 ArrayList클래스를 예로 들어 보자

public class ArrayList<E> extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

ArrayList클래스 의 인스턴스는 확장하는 모든 수퍼 클래스와 구현하는 모든 인터페이스의 유형이라고합니다. 따라서 ArrayList클래스 의 인스턴스에는 ArrayList,, RandomAccess등 의 유형 Cloneable이 있습니다. 즉, 값 (또는 인스턴스)은 하나 이상의 유형에 속하고 클래스는 이러한 유형이 무엇인지 정의합니다.


0

다른 클래스는 동일한 유형을 설명 할 수 있습니다.

유형은 다음 부분으로 구성됩니다.

  1. 작업 = 구문
  2. 작업 설명 = 의미

클래스는 다음 부분으로 구성됩니다.

  1. 작업 = 구문
  2. 구현 (= 다양한 구현이 동일한 의미를 설명 함)

몇 가지 참고 사항 :

  • 인터페이스 (Java에서와 같이)는 의미를 설명하지 않기 때문에 유형이 아닙니다 (구문 만 설명 함).

  • 하위 클래스는 하위 유형이 아닙니다. 하위 클래스는 상위 클래스에 정의 된 의미를 변경할 수 있기 때문에 하위 유형은 상위 유형 의미를 변경할 수 없습니다 (예 : 이 LSP 예제 와 같은 Liskov 대체 원리 참조 ).


0

분명히 OO 프로그래밍 언어가 아닌 유형 시스템을 가진 언어가 있기 때문에 유형클래스 보다 더 넓은 개념이어야 합니다.

Java와 같은 언어 int에서도은 (기본) 유형이지만 클래스는 아닙니다.

따라서 모든 클래스는 유형이지만 모든 유형이 클래스는 아닙니다.


0

이 질문을 C # 컨텍스트에서 생각하면 다음과 같은 답변에 도달합니다.

C # 유형 시스템은 다음 범주로 나뉩니다.

값 유형 :

  • 간단한 유형 : int, long, float 등
  • 열거 형 유형
  • 구조 유형
  • Nullable 유형

참조 유형 :

  • 클래스 유형
  • 인터페이스 유형
  • 배열 유형
  • 위임 유형

보시다시피 C #에는 Class가 그중 하나 인 많은 유형이 있습니다. 한 가지 중요한 참고 사항이 있습니다. C #의 형식 시스템은 모든 형식의 값을 개체로 처리 할 수 ​​있도록 통합되었습니다. C #의 모든 유형은 직접 또는 간접적으로 개체 클래스 유형에서 파생되며 개체는 모든 유형의 궁극적 인 기본 클래스입니다. 참조 유형의 값은 값을 유형 객체로 보는 것만으로도 객체로 취급됩니다. 값 유형의 값은 boxing 및 unboxing 작업을 수행하여 개체로 처리됩니다.

보시다시피 유형은 클래스 중 하나 인 많은 항목에 대한 우산입니다.

참조 : CSahrp 언어 사양 문서, 페이지 4


-1

이것은 저에게 좋은 질문이었고, 생각을 어렵게 만들었습니다. Class는 컴파일 타임이고 Type은 런타임입니다. 유형이 아닌 클래스를 작성하기 때문에 이것을 말합니다. 그런 다음 컴파일러는 클래스에서 유형을 만들고 런타임은 유형을 사용하여 개체의 인스턴스를 만듭니다.


2
SO에 오신 것을 환영합니다. 이 답변은 적어도 다른 하나와 매우 유사하며 사용자는 'thingy'보다 더 많은 기술적 인 언어를 선호합니다!
Nick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.