OOP 언어 및 유형의 클래스


9

프로그래밍 언어 이론에서 유형은 일련의 값입니다. 예를 들어 "int"유형은 모든 정수 값의 집합입니다.

OOP 언어에서 클래스는 유형입니까?

클래스가 둘 이상의 멤버로 정의 된 경우

class myclass{
    int a; 
    double b;
}

수업에 대해 이야기 할 때

  • " (a,b)어디 a를 int이며 b이중이다", 또는
  • "{ (x,y)| xint, ydouble이 있습니까?" "

인스턴스의 myclass의미 는 무엇입니까 ?

  • " (a,b)어디 a를 int이며 b이중이다", 또는
  • 메모리 공간을 차지하고 (필수, 즉 비어있을 수있는) store를 가질 수있는 객체, int는 (x,y)어디에 x있고 y이중은 어디에 있습니까?

2
수업은 유형입니다. "{(x, y) | x는 int이고 y는 double입니다}" " 는 두 가지를 제외하고는 거의 정확합니다. 1) 클래스가 개념적으로 레코드 인 동안 튜플을 사용했습니다. 이름없는 위치에 의해 필드, 2) 아니 모든 필드를 기록 a하고 b킬리언 로한 언급하면서 해당 종류의 회원이다 MyClass에입니다. 동형 필드 레코드 ab유형 intdouble- 당신은 그런 기록을 가지고으로 바꿀 수있다 의 인스턴스 myclass.
Doval

1
강력한 형식의 언어에서 클래스는 형식입니다. 약한 유형의 언어에서는 유형일 수도 있고 아닐 수도 있습니다.
shawnhcorey

1
프로그래밍 언어 이론에서 유형은 일련의 값입니까? 다른 책이나 다른 선생님이나 둘 다 가져 가야한다고 생각합니다. '변수'또는 '일정한'은 '유형'을 가지며 종종 '값'을 갖습니다. 변수 또는 상수의 값에 하위 변수 / 하위 상수가 포함 된 값 유형, 스칼라 및 합성 값 유형은 0입니다.
user1703394

1
@ user1703394 유형 값 집합입니다. 32 비트 정수 유형은 2 ^ 32 개의 고유 값 세트입니다. 표현식이 해당 유형의 값으로 평가되면 해당 값이 해당 세트에 있음을 알 수 있습니다. 수학 연산자는 해당 세트의 값에 대한 함수일뿐입니다.
Doval

1
또한 유형을 값 집합으로 고려할 때 신중해야합니다. 세트에는 유형에 엄격하게 적용되지 않는 관계가 있습니다. 유형을 개념화하는 것은 좋은 모델이지만, 세부 사항을 살펴보기 시작하면 하위 분류를 도입 할 때 더욱 세분화됩니다.
Telastyn

답변:


30

둘 다.

동일한 필드 유형 집합이 동일한 클래스로 분류하기에 충분한 지 또는 동일한 이름을 지정해야하는지 묻습니다. 대답은 "동일한 유형 같은 이름을 가진 것조차 충분하지 않습니다!"입니다. 구조적으로 동등한 클래스는 반드시 형식과 호환되는 것은 아닙니다.

예를 들어, 클래스 CartesianCoordinatesPolarCordinates클래스 가 있으면 필드로 두 개의 숫자를 가질 수 있으며 동일한 Number유형과 동일한 이름을 가질 수도 있지만 여전히 호환되지 않으며 인스턴스 PolarCoordinates는 의 인스턴스입니다 CartesianCoordinates. 현재 구현 이 아닌 의도 한 목적으로 유형을 분리하는 기능 은보다 안전하고 유지 보수가 쉬운 코드를 작성하는 데 매우 유용한 부분입니다.


9
일부 언어에서 구조적으로 동등한 것은 한 유형을 다른 유형의 하위 유형으로 만들기에 충분하다는 것입니다. 그럼에도 불구하고 결정적으로 드문 / 인기입니다.
Telastyn

7
@Tim typedef는 형식을 만들지 않고 기존 형식을 나타내는 데 사용되는 이름의 별칭을 지정합니다.
Doval

1
@DevSolar 그는 명시 적으로 C를 언급했으며 C ++ 이외의 다른 키워드를 사용하는 다른 언어를 모른다.
Doval

3
@Telastyn-해당 언어는 불로 죽여야합니다.
Jon Story

4
@JonStory 구조적 서브 타이핑은 모듈 수준에서 유용합니다. interface단위 테스트를 원한다면 Java와 C # 으로 모든 것을 강제로 돌리는 것이 부족합니다 . 런타임에 변경하려는 의도가 없어도 프로그램이 사용할 특정 클래스를 변경할 수 있도록 많은 상용구를 작성하게됩니다.
Doval

6

유형이 설정되지 않았습니다.

보시다시피 집합 이론에는 유형에 적용되지 않는 많은 기능이 있으며 그 반대도 마찬가지 입니다. 예를 들어, 객체에는 단일 표준 유형이 있습니다. 여러 유형의 인스턴스 일 수 있지만 해당 유형 중 하나만 인스턴스화하는 데 사용되었습니다. 세트 이론에는 "정식"세트라는 개념이 없습니다.

집합 이론을 사용하면 하위 집합에 속하는 항목을 설명하는 규칙이있는 경우 하위 집합을 즉석 에서 만들 수 있습니다 . 타입 이론은 일반적으로 이것을 허용하지 않습니다. 대부분의 언어가 가지고 있지만 Number종류 나 비슷한, 그들은 하지 않습니다EvenNumber유형 않으며 하나를 만들 간단하다. 내 말은, 타입 자체를 정의하는 것은 쉽지만, 기존 Number의 어떤 것도 마술처럼 EvenNumbers 로 변환되지 않을 것 입니다.

실제로, 세트는 완전히 다른 종류의 동물이기 때문에 서브 세트를 "만들 수"있다고 말하는 것은 다소 불분명합니다. 이론적으로는 이러한 하위 집합 이 무한정 정의 할 수있는 모든 무한한 방식으로 이미 존재 합니다. 타입 이론에서 우리는 일반적으로 주어진 시간에 유한 한 (큰 경우) 유형을 처리 할 것으로 예상합니다. 존재한다고 알려진 유일한 유형은 우리가 정의 할 수있는 모든 유형이 아니라 실제로 정의한 유형입니다.

세트는 직접 또는 간접적으로 자신을 포함 할 수 없습니다 . Python과 같은 일부 언어는 덜 규칙적인 구조를 가진 유형을 제공합니다 (Python에서 type표준 유형은 type이며 object의 인스턴스로 간주 됨 object). 반면에 대부분의 언어는 사용자 정의 형식이 이러한 종류의 속임수를 사용하도록 허용하지 않습니다 .

세트는 일반적으로 서로 포함되지 않고 겹칠 수 있습니다. 유형 이론에서는 흔하지 않지만 일부 언어는 다중 상속 형태로 지원합니다. Java와 같은 다른 언어는 제한된 형식 만 허용하거나 완전히 허용하지 않습니다.

빈 유형이 존재하지만 ( 하단 유형 이라고 함 ) 대부분의 언어는이를 지원하지 않거나 일급 유형으로 간주하지 않습니다. "다른 모든 유형을 포함하는 유형"도 존재하며 ( 상위 유형 이라고 함 ) 이론과 달리 널리 지원됩니다.

NB : 스레드가 대화로 이동하기 전에 일부 주석 작성자가 지적했듯이 세트 이론 및 기타 표준 수학 구조를 사용하여 유형을 모델링 할 수 있습니다. 예를 들어, 유형을 세트로 모델링하는 대신 유형 멤버십을 관계형으로 모델링 할 수 있습니다. 그러나 실제로 이론 을 설정하는 대신 범주 이론 을 사용하면 훨씬 간단합니다 . 예를 들어, Haskell이 형식 이론을 모델링하는 방식입니다.


"subtyping"개념은 "subset"개념과는 상당히 다릅니다. X의 하위 유형 인 경우 인스턴스 를 인스턴스로 대체Y 할 수 있으며 프로그램은 여전히 ​​어떤 의미에서 "작동"합니다. 일부 언어 (예 : Go, Rust, 논란의 여지가있는 C)는 편의상 이유로 프로그래머 나 언어 구현에서 후자를 선택했지만 이것은 구조적 이라기보다는 행동 적입니다.YX


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
세계 엔지니어

4

대수 데이터 유형 이이를 논의하는 방법입니다.

유형을 결합 할 수있는 세 가지 기본 방법이 있습니다.

  • 생성물. 그것은 기본적으로 당신이 생각하는 것입니다 :

    struct IntXDouble{
      int a; 
      double b;
    }
    

    제품 유형입니다. 그 값은 one int과 one 의 가능한 모든 조합 (즉, 튜플)입니다 double. 숫자 유형을 세트로 간주하면 제품 유형의 카디널리티는 실제로 필드 카디널리티의 곱입니다.

  • 합집합. 절차 적 언어에서 이것은 직접 표현하기가 다소 어색합니다 (클래식은 태그 조합으로 이루어짐 ). 이해를 돕기 위해 Haskell의 합계 유형은 다음과 같습니다.

    data IntOrDouble = AnInt Int
                     | ADouble Double
    

    이 유형의 값은 양식 AnInt 345또는 ADouble 4.23을 갖지만 각 유형에 두 개의 숫자가있는 제품 유형과 달리 항상 하나의 숫자 만 관련됩니다. 카디널리티 : 먼저 모든 Int값을 열거 합니다. 각 값은 AnInt생성자 와 결합되어야합니다 . 또한 모든 Double값은 각각와 결합됩니다 ADouble. 따라서 합계 유형 .

  • 지수 1 . 명확한 OO 통신이 없기 때문에 여기서 자세히 설명하지 않겠습니다.

수업은 어떻습니까? 에 대한 키워드 struct보다는 일부러 키워드를 사용 class했습니다 IntXDouble. 문제는 유형으로서의 클래스는 실제로 필드로 특징 지워지지 않으며 구현 세부 사항 일뿐입니다. 결정적인 요소는 클래스가 가질 수있는 구별 가능한 가치입니다.

무엇 이며 비록, 클래스의 값은 다음과 관련 모든 그것의 서브 클래스의 ! 클래스가 합계 유형이 아닌 제품 유형 실제로 그래서 다음과 같은 경우 AB모두에서 파생 될 수는 myClass의는 myClass본질적의 합이 될 것입니다 AB. 실제 구현에 관계없이.


1 이것은 함수 ( 수학적 의미에서 )입니다. 함수 유형 Int -> Double은 지수로 표시됩니다 DoubleInt. 언어에 적절한 기능이 없다면 나쁘다 ...


2
미안하지만, 이것은 매우 가난한 대답이라고 생각합니다. 기능 명확한 OO 아날로그, 즉이 방법 (단일 방식의 인터페이스 유형). 객체의 기본 정의는 상태 (필드 / 데이터 멤버)와 동작 (메소드 / 멤버 함수) 을 모두 가지고 있다는 것입니다 . 당신의 대답은 후자를 무시합니다.
ruakh

@ruakh : 아뇨. 물론 OO에서 함수를 구현할 수 있지만 일반적으로 메서드는 함수가 아닙니다 ( 상태 등을 수정 하기 때문에 ). 절차 적 언어의 "기능"도 그 문제를 위해 작동하지 않습니다. 실제로 단일 정적 메서드 인터페이스는 함수 / 지수 유형에 가장 가깝지만이 질문과 관련이 없기 때문에 이에 대한 논의를 피하고 싶었습니다.
leftaroundabout

... 더 중요한 것은 내 대답 행동을 고려한다는 것입니다. 실제로 행동은 일반적으로 상속을 사용하는 이유이며, 가능한 다른 행동의 통합은 OO 클래스의 합계 유형 측면을 정확하게 캡처합니다.
leftaroundabout

@ruakh 메소드는 객체가 없으면 할 수 없습니다. 가장 가까운 아날로그는 static여전히 일류 값이 아닌 방법입니다. 대부분의 OO 언어에 대한 것은 객체를 가장 작은 빌딩 블록으로 사용한다는 것입니다. 따라서 더 작은 것을 원하면 객체로 가짜로 만들어야하고 의미 론적 기능이 없어야하는 여러 가지 의미로 드래그해야합니다. 예를 들어, 함수가 동일한 지 비교하는 것은 이치에 맞지 않지만 두 개의 가짜 함수 객체를 여전히 비교할 수 있습니다.
Doval

@Doval 1) AFAIK 주위에 메소드를 전달할 수 있으므로 일류 값입니다. 2) 평등을 위해 함수를 비교하는 것이 합리적이며 JS 사람들은 항상 그것을합니다.
Den

2

죄송하지만 "원시"이론에 대해서는 잘 모르겠습니다. 나는 실용적인 접근 방식 만 제공 할 수 있습니다. 나는 이것이 프로그래머들에게 받아 들여지기를 바란다. 나는 에티켓에 익숙하지 않습니다.


OOP의 중심 주제는 정보 숨기기 입니다. 클래스의 데이터 멤버가 정확히 클라이언트에게 관심을 가져서는 안됩니다. 클라이언트는 내부 상태를 수정하거나 수정하지 않을 수있는 인스턴스에 메시지 를 보냅니다 (메소드 / 멤버 함수 호출). 아이디어는 클라이언트의 영향을받지 않고 클래스의 내부가 변경 될 수 있다는 것입니다.

이것에 대한 관례는 클래스 의 내부 표현이 "유효한"상태를 유지하도록하는 것입니다. (단순화 된) 전화 번호를 두 개의 정수로 저장하는 클래스를 가정 해 봅시다.

    int areacode;
    int number;

이들은 클래스 의 데이터 멤버 입니다. 그러나, 클래스는 아마있을 것입니다 더 많은 단지 데이터 멤버에 비해, 그것은 확실히 "INT X INT의 모든 가능한 값의 집합"으로 정의 할 수 없습니다. 데이터 멤버에 직접 액세스 할 수 없습니다.

인스턴스 생성은 음수를 거부 할 수 있습니다. 아마도 건설은 지역 번호를 어떤 식 으로든 정규화하거나 정수를 검증 할 수도 있습니다. 당신은 따라서 훨씬 더 가까이에 끝날 것이라고 "(a,b) where a is an int and b is a double"는 확실히 때문에, 어떤 클래스에 저장이 개 INT.

그러나 클래스에 관한 한 그것은 중요하지 않습니다. 데이터 멤버의 유형도 아니고 클래스 를 정의 하는 가능한 값의 범위도 아니고 정의 된 메소드 입니다.

이러한 메소드가 동일하게 유지되는 한 구현자는 데이터 유형을 부동 소수점, BIGNUM, 문자열 등 무엇이든 변경할 수 있으며 모든 실제적인 목적을 위해 여전히 동일한 클래스 입니다.


클라이언트가 인식하지 않고도 내부 표현의 변경을 수행 할 수 있도록 디자인 패턴이 있습니다 (예 : 불투명 포인터 뒤에 데이터 멤버를 숨기는 C ++의 pimpl 관용구 ).


1
It is neither the type of the data members, nor the range of their possible values that defines the class, it's the methods that are defined for it.데이터 멤버는 클래스를 숨길 때만 클래스를 정의하지 않습니다. 가장 일반적인 경우 일 수 있지만 모든 클래스에 해당되는 것은 아닙니다. 단일 필드라도 공개라면 그 방법만큼 중요합니다.
Doval

1
Java로 코딩하지 않는 한, 문제에 대한 선택이없고 멍청한 행동없는 가짜 기록조차도 있어야합니다 class. (표시 final하면 포인트를 얻는 데 도움이되지만 여전히). 그래도 protected멤버에 여전히 문제가 있으며, 상속 될 수 있으며 서브 클래스 구현자를위한 두 번째 API의 일부를 형성 할 수 있습니다.
Doval

1
@Doval : 나는 이것이 "이론"질문 인 것으로 이해했기 때문에 가능한 한 실제 언어 문제를 명확하게 파악했습니다. (저는 Java protected를 최대한 명확하게 하고 가능한 한 실용적입니다. ;-))
DevSolar

3
문제는 a class가 언어 의존적 구조라는 것입니다. 내가 아는 class한 유형 이론 과 같은 것은 없습니다 .
Doval

1
@ Doval : 타입 이론 그 자체 가 그 이론의 범위를 벗어난 구성이기 때문에 클래스에 적용 되지 않는다는 것을 의미 하지 않습니까?
DevSolar

2
  • 유형 범주에 대한 설명입니다 / 값, 화합물 구조의 범위, 또는 당신이 무엇을 가지고있다. OOPwise는 "인터페이스"와 유사합니다. (언어에 구애받지 않는 의미에서. 언어에 따른 의미는 그다지 많지 않습니다. 예를 들어, Java의 int경우 유형 이지만 interface. 공개 / 보호 필드 스펙과는 관련이 없습니다 interface. 하지만 있습니다 에 "인터페이스"또는 일부 유형 .)

    요점은 콘크리트 정의보다 의미 정의보다 훨씬 낫습니다. 노출 된 필드 / 행동 과 정의 된 목적이 일치 하는 한 요인 만 구조화합니다 . 둘 다 없으면 유형 호환성이 없습니다.

  • 클래스 유형의 실현이다. 내부 구조, 첨부 된 동작 등을 실제로 정의하는 템플릿입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.