클래스(컴퓨터 프로그래밍)

Class (computer programming)

객체 지향 프로그래밍에서 클래스객체를 만들기 위한 확장 가능한 프로그램 코드 템플릿으로, 상태(멤버 변수) 및 동작 구현(멤버 함수 또는 메소드)에 대한 초기 값을 제공합니다.[1][2][a]

클래스의 생성자가 개체를 만들 때 결과 개체를 클래스의 인스턴스라고 하고 개체에 고유한 멤버 변수를 인스턴스 변수라고 하여 클래스 간에 공유되는 클래스 변수와 대비시킵니다.

특정 언어에서 클래스는 컴파일 타임 기능( 클래스는 런타임에 선언할 수 없음)일 뿐인 반면, 다른 언어에서 클래스는 1등급 시민이며 일반적으로 그 자체로 객체(일반적으로 유형)입니다.클래스 또는 유사).이 언어들에서, 자신 안에 클래스를 만드는 클래스는 메타 클래스라고 불립니다.

관련개념

사례

객체 지향 프로그래밍(OOP)에서 인스턴스(instance)는 컴퓨터 프로그램의 실행 중에 존재하는 객체의 구체적인 발생입니다.형식적으로, "인스턴스"는 각각 특정한 값(실현)이기 때문에 "객체"와 동의어이며, 이것들은 인스턴스 객체(instance object)라고 불릴 수 있습니다. "인스턴스"는 객체의 독특한 정체성을 강조합니다.인스턴스를 만드는 것을 인스턴스화라고 합니다.

개체는 여러 가지 방법으로 다양할 수 있습니다.해당 개체의 각 실현된 변화는 해당 클래스의 인스턴스입니다.즉, 변수가 아닌 지정된 을 가지는 특정 클래스의 멤버입니다.비프로그래밍 맥락에서, 당신은 "개"를 유형으로, 당신의 특정한 개를 그 클래스의 예로 생각할 수 있습니다.[3]

클래스 기반 프로그래밍에서 객체는 컨스트럭터라고 하는 서브루틴에 의해 클래스의 인스턴스로 생성되고 디스트럭터에 의해 파괴됩니다.개체는 클래스의 모든 데이터 유형(기본 데이터 및 비기본 데이터)과 메서드 등에 액세스할 수 있기 때문에 클래스의 인스턴스입니다.따라서 개체를 클래스 인스턴스 또는 클래스 개체라고 부를 수 있습니다.객체 인스턴스화를 구성이라고 합니다.모든 클래스를 인스턴스화할 수 있는 것은 아닙니다. 추상 클래스는 인스턴스화할 수 없는 반면, 인스턴스화할 수 있는 클래스를 구체 클래스라고 합니다.프로토타입 기반 프로그래밍에서 인스턴스화는 프로토타입 인스턴스를 복사(클론)함으로써 대신 수행됩니다.[4]

클래스 대 유형

대부분의 일상적인 사용에서 사람들은 종종 사물의 "계층"을 언급하지만, 좁게 말하면 사물은 인터페이스, 즉 구성원 변수의 종류, 구성원 함수(메소드)의 서명, 그리고 이것들이 만족하는 속성을 가지고 있습니다.동시에 클래스에는 구현(특히 메소드의 구현)이 있으며, 주어진 구현으로 주어진 유형의 객체를 생성할 수 있습니다.[5]유형 이론의 관점에서 클래스는 구현(구체적데이터 구조 및 서브루틴 모음)인 반면 유형은 인터페이스입니다.다른 (콘크리트) 클래스는 유형 시스템에 따라 동일한 (추상적인) 유형의 객체를 생성할 수 있습니다. 예를 들어, 유형 스택은 SmallStack(작은 스택의 경우 빠르지만 확장성은 낮음)과 ScalableStack(스케일링은 좋으나 작은 스택의 경우 오버헤드가 높음)의 두 가지 클래스로 구현될 수 있습니다.마찬가지로, 주어진 클래스에도 여러 개의 다른 생성자가 있을 수 있습니다.

클래스 유형은 일반적으로 명사, 예를 들어 사람, 장소 또는 사물 또는 명목상의 것을 나타내고 클래스는 이를 구현한 것을 나타냅니다.예를 들어, 바나나 유형은 일반적으로 바나나의 특성과 기능성을 나타낼 수 있는 반면, ABCBananaXYZBanana 클래스는 바나나를 생산하는 방법(예: 바나나 공급업체 또는 비디오 게임에서 바나나를 표현하고 그리기 위한 데이터 구조 및 기능)을 나타낼 수 있습니다.ABC 바나나 클래스는 특정 바나나를 생산할 수 있습니다. ABC 바나나 클래스의 예는 바나나 유형의 개체가 될 것입니다.종종 유형의 단일 구현만 제공되며, 이 경우 클래스 이름은 유형 이름과 동일한 경우가 많습니다.

설계 및 구현

수업은 구조적 구성요소와 행동적 구성요소로 구성됩니다.[1]프로그래밍 구조로 클래스를 포함하는 프로그래밍 언어는 다양한 클래스 관련 기능을 지원하며 이러한 기능을 사용하는 데 필요한 구문은 프로그래밍 언어마다 크게 다릅니다.

구조

클래스의 UML 표기법

클래스에는 데이터 필드 설명(또는 속성, 필드, 데이터 멤버 또는 속성)이 포함됩니다.이들은 일반적으로 프로그램 실행 시 상태 변수와 연관되는 필드 유형 및 이름입니다. 이들 상태 변수는 클래스 또는 클래스의 특정 인스턴스에 속합니다.대부분의 언어에서 클래스에 의해 정의된 구조는 인스턴스에 의해 사용되는 메모리의 레이아웃을 결정합니다.다른 구현도 가능합니다. 예를 들어 Python의 개체는 연관 키 값 컨테이너를 사용합니다.[6]

에펠과 같은 일부 프로그래밍 언어는 클래스 정의의 일부로 불변량의 명세를 지원하고 형식 체계를 통해 이를 적용합니다.상태 캡슐화는 클래스의 불변량을 적용할 수 있는 데 필요합니다.

행동

클래스 또는 클래스 인스턴스의 동작은 메서드를 사용하여 정의됩니다.메서드는 개체 또는 클래스에서 작동할 수 있는 서브루틴입니다.이러한 작업은 개체의 상태를 변경하거나 개체에 액세스하는 방법을 제공할 수 있습니다.[7]많은 종류의 방법들이 존재하지만, 그 방법들을 지원하는 것은 언어마다 다릅니다.일부 메서드 유형은 프로그래머 코드로 생성되고 호출되지만 다른 특수 메서드(예: 생성자, 디스트럭터, 변환 연산자)는 컴파일러가 생성한 코드로 생성되고 호출됩니다.언어는 프로그래머가 이러한 특별한 메소드를 정의하고 호출할 수도 있습니다.[8][9]

클래스 인터페이스

모든 클래스는 구조와 행동을 제공함으로써 인터페이스를 구현(또는 실현)합니다.구조는 데이터와 상태로 구성되며 동작은 방법 구현 방법을 지정하는 코드로 구성됩니다.[10]인터페이스의 정의와 해당 인터페이스의 구현에는 차이가 있지만, 클래스 선언이 인터페이스를 정의하고 구현하기 때문에 많은 프로그래밍 언어에서 이 선은 모호합니다.그러나 일부 언어는 인터페이스와 구현을 구분하는 기능을 제공합니다.예를 들어, 추상 클래스는 구현을 제공하지 않고 인터페이스를 정의할 수 있습니다.

클래스 상속을 지원하는 언어를 사용하면 클래스가 파생된 클래스의 인터페이스를 상속할 수도 있습니다.

예를 들어 "class A"가 "class B"에서 상속되고 "class B"가 인터페이스 "interface B"를 구현하는 경우 "class A"는 "interface B"에서 제공하는 기능(상수 및 메서드 선언)도 상속합니다.

액세스 지정자를 지원하는 언어에서 클래스의 인터페이스는 메소드와 속성을 모두 포함한 클래스의 공용 멤버 집합으로 간주됩니다. 모든 개인 멤버 또는 내부 데이터 구조는 외부 코드에 의존하도록 의도되지 않으므로 인터페이스의 일부가 아닙니다.

객체 지향 프로그래밍 방법론은 클래스의 모든 인터페이스의 동작이 서로 독립적이어야 함을 지시합니다.인터페이스의 클라이언트가 인터페이스에 선언된 메소드를 사용하는 계층형 설계가 됩니다.인터페이스는 클라이언트가 특정 순서로 하나의 인터페이스의 작업을 호출할 필요가 없습니다.이 접근 방식은 클라이언트가 개체에 액세스할 때마다 인터페이스의 작동을 사용할 수 있다고 클라이언트 코드가 가정할 수 있다는 장점이 있습니다.[11][citation needed]

클래스 인터페이스 예제

텔레비전 세트의 앞면에 있는 버튼은 플라스틱 케이스의 반대편에 있는 전기 배선과 여러분 사이의 인터페이스입니다."전원" 버튼을 누르면 텔레비전이 켜지고 꺼집니다.이 예에서는 특정 텔레비전이 인스턴스이고, 각 방법은 버튼으로 표시되며, 모든 버튼이 함께 인터페이스를 구성합니다(같은 모델인 다른 텔레비전 세트는 동일한 인터페이스를 갖습니다).가장 일반적인 형태에서, 인터페이스는 메소드들의 어떠한 연관된 구현 없이 관련 메소드들의 그룹의 명세입니다.

텔레비전 세트는 크기와 색상을 지원하는지 여부와 같은 무수히 많은 특성을 가지고 있으며, 이 특성들은 함께 그 구조를 구성합니다.클래스는 텔레비전의 속성(구조)과 버튼(인터페이스)을 포함한 텔레비전의 전체 설명을 나타냅니다.

텔레비전의 총 제조 개수를 얻는 것은 텔레비전 클래스의 정적인 방법일 수 있습니다.이 메서드는 클래스와 명확하게 연결되어 있지만 클래스의 각 개별 인스턴스의 도메인 밖에 있습니다.모든 텔레비전 객체들의 집합들 중에서 특정 인스턴스를 찾는 정적 방법은 또 다른 예입니다.

회원 접근성

다음은 일반적인 액세스 지정자 집합입니다.[12]

  • 비공개(또는 클래스 비공개)는 클래스 자체에 대한 액세스를 제한합니다.같은 클래스에 속한 메서드만 개인 구성원에 액세스할 수 있습니다.
  • Protected(또는 class-protected)를 사용하면 클래스 자체와 모든 하위 클래스가 멤버에 액세스할 수 있습니다.
  • 공개란 어떤 코드라도 자신의 이름으로 회원에게 접근할 수 있음을 의미합니다.

많은 객체 지향 언어들이 위의 액세스 지정자들을 지원하지만, 그들의 의미론은 다를 수 있습니다.

객체 지향 설계는 객체의 상태에 대한 제약인 클래스 불변량을 적용하기 위해 공개 방법 구현의 세심한 설계와 함께 액세스 지정자를 사용합니다.액세스 지정자의 일반적인 용도는 클래스의 내부 데이터를 인터페이스에서 분리하는 것입니다. 내부 구조는 비공개로 만들어지지만 퍼블릭 액세스자 방법은 이러한 비공개 데이터를 검사하거나 변경하는 데 사용될 수 있습니다.

액세스 지정자는 개인 구성원이라도 클라이언트 외부 코드에 보일 수 있다는 점에서 반드시 가시성을 제어하지는 않습니다.일부 언어에서는 액세스할 수 없지만 보이는 멤버가 런타임에 참조될 수 있지만(예: 멤버 함수에서 반환된 포인터에 의해), 클라이언트 코드에서 멤버 이름을 참조하여 사용하려는 시도는 유형 검사기에 의해 차단됩니다.[13]

다양한 객체 지향 프로그래밍 언어는 구성원의 접근성과 가시성을 다양한 정도로 강화하며 컴파일 타임 또는 런타임에 적용되는 언어의 유형 시스템 및 컴파일 정책에 따라 조정됩니다.예를 들어, 자바 언어는 클래스의 개인 데이터에 접근하는 클라이언트 코드가 컴파일되도록 허용하지 않습니다.[14] C++ 언어에서 비공개 메서드는 볼 수 있지만 인터페이스에서는 액세스할 수 없습니다. 그러나 클래스의 인터페이스를 나타내는 완전 추상 클래스를 명시적으로 선언하여 보이지 않게 만들 수도 있습니다.[15]

일부 언어는 다른 접근성 체계를 갖추고 있습니다.

  • 인스턴스클래스 접근성:루비는 클래스 개인 및 클래스 보호가 아닌 인스턴스 개인 및 인스턴스 보호 액세스 지정자를 각각 지원합니다.인스턴스의 클래스가 아닌 인스턴스 자체를 기준으로 액세스를 제한한다는 점에서 차이가 있습니다.[16]
  • 친구: C++는 클래스의 친구 함수로 명시적으로 선언된 함수가 비공개 또는 보호된 멤버로 지정된 멤버에 접근할 수 있는 메커니즘을 지원합니다.[17]
  • 경로 기반: Java는 파일의 논리적 경로인 Java 패키지 내의 멤버에 대한 액세스를 제한할 수 있도록 지원합니다.그러나 Java 프레임워크를 확장하여 보호된 구성원에 액세스하기 위해 프레임워크 클래스와 동일한 패키지로 클래스를 구현하는 것이 일반적인 관례입니다.소스 파일이 완전히 다른 위치에 존재할 수 있으며 다른 .jar 파일에 배포될 수도 있지만 JVM에 관한 한 동일한 논리적 경로에 있습니다.[12]

클래스간 관계

프로그래밍 언어는 독립형 클래스 설계 외에도 클래스 간의 관계를 기반으로 한 고급 클래스 설계를 지원할 수 있습니다.일반적으로 제공되는 클래스 간 관계 설계 기능은 구성적이고 계층적입니다.

구성

클래스는 다른 클래스로 구성될 수 있으며, 이를 통해 엔클로저 클래스와 그 포함된 클래스 사이의 구성 관계를 설정할 수 있습니다.계층 간의 구성적 관계는 일반적으로 has-a 관계로도 알려져 있습니다.[18]예를 들어, 클래스 "Car"는 클래스 "Engine"으로 구성되고 포함될 수 있습니다.따라서 자동차에는 엔진이 있습니다.구성의 한 측면은 격납(containment)인데, 격납은 이들을 갖는 인스턴스에 의한 컴포넌트 인스턴스의 인클로저입니다.엔클로저 개체에 구성 요소 인스턴스가 값으로 포함되어 있으면 구성 요소와 엔클로저 개체의 수명이 비슷합니다.성분이 참조로 포함되어 있으면 수명이 유사하지 않을 수 있습니다.[19]예를 들어 Objective-C 2.0의 경우:

@interfaceCar : NSObject @propertyNSString *name; @property엔진 *engine @propertyNSray *tires; @end

Car 클래스에는 NSString(문자열 개체), Engine(엔진), NSray(배열 개체)의 인스턴스가 있습니다.

계층적

클래스는 하나 이상의 기존 클래스에서 파생될 수 있으므로 파생 클래스(기본 클래스, 부모 클래스 또는 슈퍼 클래스)와 파생 클래스(자녀 클래스 또는 하위 클래스) 간의 계층적 관계를 설정할 수 있습니다.파생 클래스와 파생 클래스의 관계는 흔히 is-a 관계로 알려져 있습니다.[20]예를 들어 '버튼' 클래스는 '제어' 클래스에서 파생될 수 있습니다.따라서 버튼은 컨트롤입니다.부모 클래스의 구조 및 동작 멤버는 자식 클래스에서 상속됩니다.파생 클래스는 상속되는 클래스와 더불어 추가적인 구조적 멤버(데이터 필드) 및 행동적 멤버(메소드)를 정의할 수 있으며, 따라서 수퍼 클래스의 전문화입니다.또한 파생 클래스는 언어가 허용하는 경우 상속 메서드를 재정의할 수 있습니다.

모든 언어가 다중 상속을 지원하는 것은 아닙니다.예를 들어, Java에서는 클래스가 여러 인터페이스를 구현할 수 있지만 하나의 클래스에서만 상속됩니다.[21]다중 상속이 허용되는 경우 계층은 방향 비순환 그래프(또는 줄여서 DAG)이고, 그렇지 않으면 트리입니다.계층에는 노드로 클래스가 있고 링크로 상속 관계가 있습니다.같은 수준의 클래스가 다른 수준의 클래스보다 더 연관될 가능성이 높습니다.이 계층의 수준을 계층 또는 추상화 수준이라고 합니다.

예제(Simplified Objective-C 2.0 코드, iPhone SDK에서 제공):

@interface UIResponder : NSObject //...@interface UIView : UIResponder //...@interface UIScrollView : UIView //...@interface UITableView : UIScrollView //...

이 예에서 UITableViewUIScrollViewUIResponderNSObject입니다.

서브클래스의 정의

개념적으로, 슈퍼클래스는 그 하위 클래스들의 상위 집합입니다.예를 들어, 일반 클래스 계층 구조에서는 그래픽 객체RectangleEllipse의 슈퍼 클래스로 포함되는 반면, SquareRectangle의 서브 클래스로 포함됩니다.이는 모두 집합 이론에서도 부분 집합 관계입니다. 즉, 모든 정사각형은 직사각형이지만 모든 직사각형이 정사각형인 것은 아닙니다.

일반적인 개념적 오류는 관계의 일부를 하위 클래스와 혼동하는 것입니다.예를 들어, 자동차와 트럭은 모두 차량의 종류이므로 차량 클래스의 하위 클래스로 모델링하는 것이 적합합니다.그러나 자동차의 부품을 하위 클래스 관계로 모델링하는 것은 오류입니다.예를 들어, 자동차는 엔진과 차체로 구성되어 있지만, 엔진이나 차체를 자동차의 하위 클래스로 모델링하는 것은 적절하지 않을 것입니다.

객체 지향 모델링에서 이러한 종류의 관계는 일반적으로 객체 속성으로 모델링됩니다.이 예제에서 Car 클래스는 Parts라는 속성을 갖습니다. PartsBody, Engine, Tire 등의 인스턴스와 같은 객체의 컬렉션을 저장하기 위해 타이핑됩니다.UML과 같은 객체 모델링 언어에는 객체의 카디널리티, 입력 및 출력 값에 대한 제약과 같은 데이터와 다른 종류의 관계의 다양한 측면을 모델링하는 기능이 포함됩니다.이 정보는 get set 메서드에 대한 오류 검사와 같이 객체에 대한 기본 데이터 정의 외에 추가 코드를 생성하는 데 개발자 도구에서 사용할 수 있습니다.[22]

객체 클래스의 시스템을 모델링하고 구현할 때 한 가지 중요한 질문은 클래스가 하나 이상의 슈퍼 클래스를 가질 수 있는지 여부입니다.실제 집합이 있는 실제 세계에서는 두 개 이상의 다른 집합과 교차하지 않는 집합을 찾는 경우가 드물 것입니다.그러나 Flavers 및 CLOSE와 같은 일부 시스템은 런타임에 둘 이상의 부모가 실행할 수 있는 기능을 제공하지만, 객체 지향 커뮤니티의 많은 사람들이 애초에 객체 클래스를 사용하는 목표와 반대되는 것으로 간주하는 복잡성을 초래합니다.메시지 처리를 담당할 클래스를 이해하는 것은 하나 이상의 슈퍼 클래스를 다룰 때 복잡해질 수 있습니다.부주의하게 사용할 경우 이 기능은 동일한 시스템 복잡성과 모호성 클래스를 피할 수 있습니다.[23]

스몰토크나 자바와 같은 대부분의 현대 객체 지향 언어는 실행 시 단일 상속이 필요합니다.이러한 언어의 경우 다중 상속은 모델링에는 유용하지만 구현에는 유용하지 않습니다.

그러나 시맨틱 웹 응용 프로그램 개체에는 여러 개의 슈퍼 클래스가 있습니다.인터넷의 변동성은 이러한 수준의 유연성을 요구하며 웹 온톨로지 언어(OWL)와 같은 기술 표준은 이를 지원하도록 설계되었습니다.

비슷한 문제는 런타임에 클래스 계층 구조를 수정할 수 있는지 여부입니다.Flavers, CLOSS, Smalltalk 등의 언어는 모두 메타 오브젝트 프로토콜의 일부로 이 기능을 지원합니다.클래스 자체가 퍼스트 클래스 개체이기 때문에 적절한 메시지를 전송하여 동적으로 구조를 변경할 수 있습니다.Java 및 C++와 같이 강력한 타이핑에 더 중점을 두는 다른 언어에서는 클래스 계층 구조를 런타임에 수정할 수 없습니다.시맨틱 웹 개체는 클래스에 대한 런타임 변경 기능이 있습니다.합리적인 이유는 여러 슈퍼클래스를 허용해야 한다는 당위성과 유사하며, 인터넷은 매우 동적이고 유연하기 때문에 이러한 변동성을 관리하기 위해서는 계층 구조에 대한 동적인 변화가 필요합니다.[24]

클래스 개념과 상속의 직교성

클래스 기반 언어가 상속을 지원하는 것으로 일반적으로 가정되지만 상속은 클래스 개념의 본질적인 측면이 아닙니다.종종 "객체 기반 언어"라고 불리는 일부 언어는 클래스를 지원하지만 상속은 지원하지 않습니다.객체 기반 언어의 예로는 이전 버전의 Visual Basic이 있습니다.

객체 지향적 분석 내

객체 지향 분석UML에서 두 클래스 간의 연결은 클래스 또는 해당 인스턴스 간의 공동 작업을 나타냅니다.연결에는 방향이 있습니다. 예를 들어, 두 클래스 간의 양방향 연결은 두 클래스 모두 자신의 관계를 인식하고 있음을 나타냅니다.[25]연결은 이름이나 목적에 따라 레이블이 지정될 수 있습니다.[26]

연결 역할은 연결의 끝에 주어지며 해당 클래스의 역할을 설명합니다.예를 들어, "subscriber" 역할은 클래스 "Person"의 인스턴스가 클래스 "Magazine"과의 "subscribes to" 연결에 참여하는 방식을 설명합니다.또한 "잡지"는 같은 협회에 "구독된 잡지" 역할을 가지고 있습니다.연결 역할 다중도는 연결의 다른 클래스의 각 인스턴스에 해당하는 인스턴스 수를 나타냅니다.일반적인 다중도는 "0..1", "1..1", "1..*" 그리고 "0..*", 여기서 "*"는 임의 수의 인스턴스를 지정합니다.[25]

계급분류학

수업에는 여러 가지 카테고리가 있는데, 그 중 일부는 중복됩니다.

추상적이고 구체적인

상속을 지원하는 언어에서 추상 클래스 또는 ABC(Abstract Base Class)는 직접 인스턴스화할 수 없는 클래스입니다.반면 콘크리트 클래스는 직접 인스턴스화할 수 있는 클래스입니다.추상 클래스의 인스턴스화는 구체적인 하위 클래스를 통해서만 간접적으로 발생할 수 있습니다.

추상 클래스는 이와 같이 명시적으로 레이블이 지정되거나 단순히 추상 메서드(또는 가상 메서드)를 지정할 수 있습니다.추상 클래스는 일부 메서드의 구현을 제공할 수 있으며 추상 클래스의 직접 또는 간접 하위에서 구현할 시그니처를 통해 가상 메서드를 지정할 수도 있습니다.추상 클래스에서 파생된 클래스가 인스턴스화되기 전에 부모 클래스의 모든 추상 메서드는 파생 체인의 일부 클래스에 의해 구현되어야 합니다.[27]

대부분의 객체 지향 프로그래밍 언어는 프로그래머가 추상적으로 간주되는 클래스를 지정할 수 있으며 이러한 클래스를 인스턴스화할 수 없습니다.예를 들어, Java, C#PHP에서는 키워드 Abstract가 사용됩니다.[28][29]C++에서 추상 클래스는 해당 언어의 적절한 구문(C++ 구문의 순수 가상 함수)에 의해 제공되는 적어도 하나의 추상 메서드를 가진 클래스입니다.[27]

가상 메서드로만 구성된 클래스를 C++에서는 순수 추상 기본 클래스(또는 순수 ABC)라고 하며 언어 사용자에 의해 인터페이스라고도 합니다.[15]자바와 C# 같은 다른 언어들은 그 언어의 키워드를 통해 인터페이스라고 불리는 추상 클래스의 변형을 지원합니다.이러한 언어에서는 다중 상속이 허용되지 않지만 클래스 하나로 여러 인터페이스를 구현할 수 있습니다.이러한 클래스는 공개적으로 액세스할 수 있는 추상 메서드만 포함할 수 있습니다.[21][30][31]

로컬 및 이너

일부 언어에서는 전역 범위 이외의 범위에서 클래스를 선언할 수 있습니다.이런 수업에는 다양한 종류가 있습니다.

내부 클래스는 다른 클래스 내에 정의된 클래스입니다.내부 클래스와 해당 클래스를 포함하는 클래스 간의 관계도 다른 유형의 클래스 연관으로 취급할 수 있습니다.내부 클래스는 일반적으로 엔클로저 클래스의 인스턴스와 연결되지 않거나 엔클로저 클래스와 함께 인스턴스화되지 않습니다.언어에 따라 인클로저 클래스 외부에서 클래스를 참조할 수도 있고 그렇지 않을 수도 있습니다.이와 관련된 개념으로는 내부 데이터 유형 또는 중첩 유형이라고도 하는 내부 유형이 있는데, 이는 내부 클래스 개념을 일반화한 것입니다.C++는 (typedef 선언을 통해) 내부 클래스와 내부 유형을 모두 지원하는 언어의 예입니다.[32][33]

또 다른 유형은 프로시저 또는 함수 내에 정의된 클래스인 로컬 클래스입니다.이렇게 하면 클래스 이름에 대한 참조가 클래스가 선언된 범위 내로 제한됩니다.언어의 의미론적 규칙에 따라 지역이 아닌 수업에 비해 지역 수업에 추가적인 제약이 있을 수 있습니다.일반적인 제한 사항 중 하나는 로컬 클래스 메서드가 엔클로저 함수의 로컬 변수에 액세스하는 것을 허용하지 않는 것입니다.예를 들어, C++에서 로컬 클래스는 엔클로저 함수 내에 선언된 정적 변수를 참조할 수 있지만 함수의 자동 변수에는 액세스할 수 없습니다.[34]

메타클래스

메타 클래스는 클래스의 인스턴스가 클래스인 클래스입니다.[35]메타 클래스는 클래스 집합의 일반적인 구조를 설명하며 디자인 패턴을 구현하거나 특정 종류의 클래스를 설명할 수 있습니다.메타 수업은 종종 프레임워크를 설명하는 데 사용됩니다.[36]

Python, Ruby 또는 Smalltalk와 같은 일부 언어에서는 클래스도 개체이므로 각 클래스는 해당 언어에 내장된 고유한 메타 클래스의 인스턴스입니다.[6] [37] [38] CLOS(Common Lisp Object System)는 이러한 클래스와 메타 클래스를 구현하기 위한 메타 오브젝트 프로토콜(MOP)을 제공합니다.

세분류 불가(또는 밀봉)

하위 클래스가 아닌 클래스 또는 밀봉된 클래스는 프로그래머가 계층의 어떤 수준에서 더 이상의 파생이 금지된 클래스의 클래스 및 계층을 설계할 수 있도록 합니다(독립형 클래스는 하위 클래스가 아닌 클래스로 지정될 수도 있으므로 계층의 형성을 방지합니다).이를 추상적인 수업과 비교해 보면, 추상적인 수업을 의미하고, 격려하며, 조금이라도 활용하기 위해 파생을 요구합니다.하위 클래스가 아닌 클래스는 암시적으로 구체적입니다.

하위 클래스가 아닌 클래스는 다음과 같이 선언하여 생성됩니다.sealedC#로 또는 로final자바나 PHP로.[40][41][42]예를 들어 자바의String수업은 기말고사로 지정됩니다.[43]

하위 클래스가 아닌 클래스를 사용하면 컴파일러가 하위 클래스에 사용할 수 없는 최적화를 수행할 수 있습니다.

오픈클래스

오픈 클래스는 변경할 수 있는 클래스입니다.일반적으로 실행 가능한 프로그램은 고객이 변경할 수 없습니다.개발자는 종종 일부 클래스를 변경할 수 있지만 일반적으로 표준 클래스나 기본 클래스는 변경할 수 없습니다.루비에서는 모든 수업이 열려있습니다.파이썬에서는 런타임에 클래스를 만들 수 있으며 이후에 모두 수정할 수 있습니다.[45]Objective-C 카테고리는 프로그래머가 해당 클래스를 다시 컴파일하거나 소스 코드에 액세스할 필요 없이 메소드를 기존 클래스에 추가할 수 있게 해줍니다.

믹신스

일부 언어에는 mixin에 대한 특별한 지원이 있지만 다중 상속이 있는 모든 언어에서 mixin은 단순히 is-a-type 관계를 나타내지 않는 클래스입니다.Mixin은 일반적으로 동일한 메서드를 여러 클래스에 추가하는 데 사용됩니다. 예를 들어 클래스 UnicodeConversionMixin은 공통 부모를 공유하지 않는 FileReaderWebPageScraper 클래스에 포함된 경우 unicode_to_ascii라는 메서드를 제공할 수 있습니다.

부분적

기능을 지원하는 언어에서 부분 클래스(partial class)는 하나의 소스 코드 파일 내에서 또는 여러 파일에 걸쳐 정의를 여러 조각으로 분할할 수 있는 클래스입니다.[46]조각들은 컴파일 타임에 병합되므로 컴파일러 출력은 부분 클래스가 아닌 것과 동일합니다.

부분 클래스를 도입한 주된 동기는 시각적 설계자와 같은 코드 생성기의 구현을 용이하게 하는 것입니다.[46]그렇지 않으면 개발자가 작성한 코드 내에 인터리브될 때 생성된 코드를 관리할 수 있는 코드 생성기를 개발하는 것은 도전이거나 타협입니다.부분 클래스를 사용하는 코드 생성기는 파일 내에서 별도의 파일 또는 거친 부분 클래스를 처리할 수 있으므로 광범위한 구문 분석을 통해 생성된 코드를 복잡하게 간섭하는 것을 방지하여 컴파일러 효율성을 높이고 개발자 코드가 손상될 수 있는 잠재적인 위험을 제거합니다.부분 클래스의 간단한 구현에서 컴파일러는 부분 클래스의 모든 부분을 "통합"하는 사전 컴파일 단계를 수행할 수 있습니다.그러면 평소와 같이 컴파일이 진행될 수 있습니다.

부분 클래스 기능의 다른 이점과 효과는 다음과 같습니다.

  • 클래스의 인터페이스와 구현 코드를 고유한 방식으로 분리할 수 있습니다.
  • 편집기 내의 대규모 클래스를 통해 쉽게 탐색할 수 있습니다.
  • 추가 도구를 사용하지 않고 측면 지향 프로그래밍과 유사한 방식으로 관심사를 분리할 수 있습니다.
  • 개별 코드를 나중에 하나의 파일로 병합할 필요 없이 여러 개발자가 하나의 클래스에서 동시에 작업할 수 있습니다.

Smalltalk에서 Class Extensions라는 이름으로 부분 클래스가 상당 기간 존재했습니다.의 도착과 함께.NET 프레임워크 2, 마이크로소프트는 C# 2.0과 Visual Basic 2005에서 모두 지원되는 부분 클래스를 도입했습니다.WinRT는 부분 클래스도 지원합니다.

언인스턴트

인스턴트 클래스는 프로그래머가 클래스 인스턴스 없이 런타임에 액세스할 수 있는 클래스별 필드와 메서드를 함께 그룹화할 수 있도록 합니다.물론, 이런 종류의 수업에는 인스턴스화가 금지되어 있습니다.

예를 들어, C#에서 "static"으로 표시된 클래스는 인스턴스화할 수 없으며 정적 멤버(필드, 메서드, 기타)만 가질 수 있으며 인스턴스 생성자가 없을 수 있으며 봉인됩니다.

이름 없음

이름 없는 클래스 또는 익명 클래스는 정의 시 이름이나 식별자에 바인딩되지 않는 클래스입니다.[48][49]이는 명명된 함수와 이름 없는 함수와 유사합니다.

혜택들

소프트웨어를 객체 클래스로 구성할 경우의 이점은 다음 세 가지로 나뉩니다.[50]

  • 급속한 발전
  • 유지보수 용이성
  • 코드 및 디자인 재사용

객체 클래스는 코드와 사용자 간의 의미적 차이를 줄여주기 때문에 빠른 발전을 촉진합니다.시스템 분석가는 계정, 고객, 청구서 등에 대해 이야기하면서 본질적으로 동일한 어휘를 사용하여 개발자와 사용자 모두와 대화할 수 있습니다.대부분의 객체 지향 환경에는 강력한 디버깅 및 테스트 도구가 제공되기 때문에 객체 클래스는 빠른 개발을 촉진하는 경우가 많습니다.클래스 인스턴스는 런타임에 검사하여 시스템이 예상대로 수행되고 있는지 확인할 수 있습니다.또한, 대부분의 객체 지향 환경은 코어 메모리의 덤프를 얻는 대신 디버깅 기능을 해석하여 개발자가 프로그램의 어디에서 오류가 발생했는지 정확히 분석하고 어떤 메서드가 어떤 인수로 호출되었는지 확인할 수 있습니다.[51]

객체 클래스는 캡슐화를 통해 쉽게 유지보수할 수 있습니다.개발자는 개체의 동작을 변경해야 할 경우 해당 개체와 해당 구성 요소 부분만으로 변경 내용을 현지화할 수 있습니다.이를 통해 유지 관리 기능 향상으로 인해 원치 않는 부작용이 발생할 가능성이 줄어듭니다.

소프트웨어 재사용은 오브젝트 클래스 사용의 주요 이점이기도 합니다.클래스는 상속 및 인터페이스를 통해 재사용을 용이하게 합니다.새로운 동작이 필요할 때는 종종 새로운 클래스를 생성하고 해당 클래스가 해당 슈퍼 클래스의 기본 동작과 데이터를 상속한 다음 그에 따라 동작 또는 데이터의 일부 측면을 조정함으로써 달성할 수 있습니다.인터페이스를 통한 재사용(메소드라고도 함)은 다른 개체가 (새로운 종류의 개체 클래스를 만들지 않고) 어떤 개체 클래스를 호출하려고 할 때 발생합니다.이 재사용 방법은 한 프로그램이 다른 프로그램의 코드를 재사용할 때 소프트웨어로 전환될 수 있는 일반적인 오류를 제거합니다.[52]

런타임 표현

데이터 유형으로서 클래스는 일반적으로 컴파일 시간 구성으로 간주됩니다.[53]언어 또는 라이브러리는 클래스에 대한 런타임 정보를 나타내는 프로토타입 또는 공장 메타 객체를 지원하거나, 반사 기능에 대한 액세스 권한과 런타임에 데이터 구조 형식을 조작할 수 있는 기능을 제공하는 메타데이터를 지원할 수도 있습니다.많은 언어가 런타임에 정보가 필요하지 않다는 것을 기준으로 클래스에 대한 이러한 런타임 유형 정보를 클래스와 구별합니다.일부 동적 언어는 런타임 구성 요소와 컴파일 시간 구성 요소를 엄격하게 구분하지 않으므로 메타 개체와 클래스를 구분할 수 없습니다.

예를 들어, Human이 클래스 Person을 나타내는 메타 개체인 경우, Human 메타 개체의 기능을 사용하여 클래스 Person의 인스턴스를 만들 수 있습니다.

참고 항목

메모들

  1. ^ 많은 언어에서 클래스 이름은 클래스의 이름(템플릿 자체), 클래스의 기본 생성자 이름(오브젝트를 생성하는 서브루틴), 클래스를 인스턴스화하여 생성된 개체의 유형으로 사용됩니다. 이러한 서로 다른 개념은 쉽게 혼동됩니다.[2]비록, 어떤 사람은 다형성 특성 때문에 언어에 내재된 특징이며, 다형성이 존재하지 않는 언어에 비해 이러한 언어가 강력하고 역동적이며 사용에 적응할 수 있는 이유를 주장할 수 있습니다.따라서 동적 시스템(즉, 실제 세계, 머신 러닝, AI)을 보다 쉽게 모델링할 수 있습니다.
  1. ^ a b Gamma et al. 1995, p. 14.
  2. ^ a b Bruce 2002, 2.1 객체, 클래스 및 객체 유형, https://books.google.com/books?id=9NGWq3K1RwUC&pg=PA18
  3. ^ "What is instance? – Definition from WhatIs.com". Whatis.techtarget.com. Retrieved February 9, 2014.
  4. ^ Amir, Masroor (25 March 2023). "OOP - Object Oriented Programming - Concepts Languages Benefits [2023]". The Geeks Bot A Computer Science Site for geeks. Retrieved 2023-04-04.
  5. ^ Gamma et al. 1995, p. 17.
  6. ^ a b "3. Data model". The Python Language Reference. Python Software Foundation. Retrieved 2012-04-26.
  7. ^ Booch 1994, 페이지 86-88.
  8. ^ "Classes (I)". C++ Language Tutorial. cplusplus.com. Retrieved 2012-04-29.
  9. ^ "Classes (II)". C++ Language Tutorial. cplusplus.com. Retrieved 2012-04-29.
  10. ^ Booch 1994, 105쪽.
  11. ^ Jamrich, Parsons, June (2015-06-22). New perspectives computer concepts, 2016. Comprehensive. Boston, MA. ISBN 9781305271616. OCLC 917155105.{{cite book}}: CS1 maint: 위치 누락 게시자 (링크) CS1 maint: 여러 이름: 작성자 목록 (링크)
  12. ^ a b "Controlling Access to Members of a Class". The Java Tutorials. Oracle. Retrieved 2012-04-19.
  13. ^ "OOP08-CPP. Do not return references to private data". CERT C++ Secure Coding Standard. Carnegie Mellon University. 2010-05-10. Archived from the original on 2015-10-03. Retrieved 2012-05-07.
  14. ^ Ben-Ari, Mordechai (2007-01-24). "2.2 Identifiers" (PDF). Compile and Runtime Errors in Java. Archived (PDF) from the original on 2011-10-18. Retrieved 2012-05-07.
  15. ^ a b Wild, Fred. "C++ Interfaces". Dr. Dobb's. UBM Techweb. Retrieved 2012-05-02.
  16. ^ Thomas; Hunt. "Classes, Objects, and Variables". Programming Ruby: The Pragmatic Programmer's Guide. Ruby-Doc.org. Retrieved 2012-04-26.
  17. ^ "Friendship and inheritance". C++ Language Tutorial. cplusplus.com. Retrieved 2012-04-26.
  18. ^ Booch 1994, 180쪽.
  19. ^ Booch 1994, 페이지 128-129.
  20. ^ Booch 1994, 112쪽.
  21. ^ a b "Interfaces". The Java Tutorials. Oracle. Retrieved 2012-05-01.
  22. ^ Berfeld, Marya (2 December 2008). "UML-to-Java transformation in IBM Rational Software Architect editions and related software". IBM. Retrieved 20 December 2013.
  23. ^ Jacobsen, Ivar; Magnus Christerson; Patrik Jonsson; Gunnar Overgaard (1992). Object Oriented Software Engineering. Addison-Wesley ACM Press. pp. 43–69. ISBN 0-201-54435-0.
  24. ^ Knublauch, Holger; Oberle, Daniel; Tetlow, Phil; Wallace, Evan (2006-03-09). "A Semantic Web Primer for Object-Oriented Software Developers". W3C. Retrieved 2008-07-30.
  25. ^ a b Bell, Donald. "UML Basics: The class diagram". developer Works. IBM. Retrieved 2012-05-02.
  26. ^ Booch 1994, 179쪽.
  27. ^ a b "Polymorphism". C++ Language Tutorial. cplusplus.com. Retrieved 2012-05-02.
  28. ^ "Abstract Methods and Classes". The Java Tutorials. Oracle. Retrieved 2012-05-02.
  29. ^ "Class Abstraction". PHP Manual. The PHP Group. Retrieved 2012-05-02.
  30. ^ "Interfaces (C# Programming Guide)". C# Programming Guide. Microsoft. Retrieved 2013-08-15.
  31. ^ "Inheritance (C# Programming Guide)". C# Programming Guide. Microsoft. Retrieved 2012-05-02.
  32. ^ "Nested classes (C++ only)". XL C/C++ V8.0 for AIX. IBM. Retrieved 2012-05-07.
  33. ^ "Local type names (C++ only)". XL C/C++ V8.0 for AIX. IBM. Retrieved 2012-05-07.
  34. ^ "Local classes (C++ only)". XL C/C++ V8.0 for AIX. IBM. Retrieved 2012-05-07.
  35. ^ Booch 1994, 페이지 133-134.
  36. ^ "13 Classes and metaclasses". pharo.gforge.inria.fr. Retrieved 2016-10-31.
  37. ^ Thomas; Hunt. "Classes and Objects". Programming Ruby: The Pragmatic Programmer's Guide. Ruby-Doc.org. Retrieved 2012-05-08.
  38. ^ Booch 1994, 페이지 134.
  39. ^ "MOP: Concepts". The Common Lisp Object System MetaObject Protocol. Association of Lisp Users. Archived from the original on 2010-11-15. Retrieved 2012-05-08.
  40. ^ "sealed (C# Reference)". C# Reference. Microsoft. Retrieved 2012-05-08.
  41. ^ "Writing Final Classes and Methods". The Java Tutorials. Oracle. Retrieved 2012-05-08.
  42. ^ "PHP: Final Keyword". PHP Manual. The PHP Group. Retrieved 2014-08-21.
  43. ^ "String (Java Platform SE 7)". Java Platform, Standard Edition 7: API Specification. Oracle. Retrieved 2012-05-08.
  44. ^ Brand, Sy (2 March 2020). "The Performance Benefits of Final Classes". Microsoft C++ team blog. Microsoft. Retrieved 4 April 2020.
  45. ^ "9. Classes". The Python Tutorial. Python.org. Retrieved 3 March 2018. As is true for modules, classes partake of the dynamic nature of Python: they are created at runtime, and can be modified further after creation.
  46. ^ a b mairaw; BillWagner; tompratt-AQ (2015-09-19), "Partial Classes and Methods", C# Programming Guide, Microsoft, retrieved 2018-08-08
  47. ^ "Static Classes and Static Class Members (C# Programming Guide)". C# Programming Guide. Microsoft. Retrieved 2012-05-08.
  48. ^ "Anonymous Classes (The Java™ Tutorials > Learning the Java Language > Classes and Objects)". docs.oracle.com. Retrieved 2021-05-13.
  49. ^ "PHP: Anonymous classes - Manual". www.php.net. Retrieved 2021-08-11.
  50. ^ "What is an Object?". oracle.com. Oracle Corporation. Retrieved 13 December 2013.
  51. ^ Booch, Grady; Robert A. Maksimchuk; Michael W. Engle; Bobbi J. Young Ph.D.; Jim Conallen; Kelli A. Houston (April 30, 2007). Object-Oriented Analysis and Design with Applications. Addison-Wesley Professional. pp. 1–28. ISBN 978-0-201-89551-3. Retrieved 20 December 2013. There are fundamental limiting factors of human cognition; we can address these constraints through the use of decomposition, abstraction, and hierarchy.
  52. ^ Jacobsen, Ivar; Magnus Christerson; Patrik Jonsson; Gunnar Overgaard (1992). Object Oriented Software Engineering. Addison-Wesley ACM Press. ISBN 0-201-54435-0.
  53. ^ "C++ International standard" (PDF). Working Draft, Standard for Programming Language C++. ISO/IEC JTC1/SC22 WG21. Archived (PDF) from the original on 2017-12-09. Retrieved 5 January 2020.

참고문헌

추가열람