객체 유형(객체 지향 프로그래밍)
Object type (object-oriented programming)이 글에는 여러 가지 문제가 있다.이 문제를 개선하거나 대화 페이지에서 토의하십시오.(이러한 템플릿 메시지를 제거하는 방법 및 시기 알아보기)
|
컴퓨터 과학에서 객체 유형(포장 객체)은 객체 지향 프로그래밍에서 비 객체 유형을 포장하여 동적 객체처럼 보이게 하는 데이터 유형이다.[citation needed]
일부 객체 지향 프로그래밍 언어는 런타임 효율성과 구문 또는 의미론적 문제와 같은 이유로 복잡한 가치 유형이 존재하지 않는 플랫폼에서 종종 객체와 비 객체로 언급되는 참조 및 가치 유형을 구별한다.예를 들어, 자바에는 각 원시 유형에 해당하는 원시 래퍼 클래스가 있다.Integer
그리고int
,Character
그리고char
,Float
그리고float
, 등. C++와 같은 언어는 참조 유형의 개념이 거의 또는 전혀 없으므로 객체 유형의 사용은 거의 관심이 없다.
권투
포장이라고도 알려진 권투는 원시형을 물체 내에 배치하여 원시형을 참조 물체로 사용할 수 있도록 하는 과정이다.예를 들어, Java에서는LinkedList
크기는 변경할 수 있지만 배열은 고정된 크기를 가져야 한다.어떤 사람은 그것을 갖고 싶어할 것이다.LinkedList
의int
, 그러나 .LinkedList
클래스는 동적 객체에 대한 참조만 나열하며, 값 유형인 원시 유형은 나열할 수 없다.
이것을 피하기 위해,int
에 박스로 넣을 수 있다.Integer
, 동적 객체 및 에 추가됨LinkedList
의Integer
. (J2SE 5.0에서 도입된 일반 매개변수 유형을 사용하여 이 유형을 다음과 같이 표현함LinkedList<Integer>
.) 한편 C#는 원시적인 포장지 클래스는 없지만 어떤 가치의 종류라도 복싱을 허용하여 일반을 반환한다.Object
참조의목표-C에서 원시 값은 a로 접두사할 수 있다.@
을 만들다NSNumber
(예를 들면)@123
또는@(123)
이를 통해 표준 컬렉션에 추가할 수 있다)에 추가할 수 있다.NSArray
.
상자형 객체는 항상 값 객체의 사본이며, 일반적으로 불변한다.개체 상자를 해제하면 저장된 값의 복사본도 반환된다.복싱은 새로운 개체를 동적으로 할당하고 박스화(박스화 값을 더 이상 사용하지 않는 경우)를 해제하여 가비지 수집의 자격이 주어지기 때문에 반복적인 권투와 개체 복싱은 성능에 심각한 영향을 미칠 수 있다.그러나 기본 Java HotSpot 가비지 수집기와 같은 현대의 가비지 수집기는 단명 객체를 더 효율적으로 수집할 수 있기 때문에 박스화된 객체가 단명할 경우 성능 영향이 그리 심하지 않을 수 있다.
일부 언어에서, 박스화되지 않은 원시 유형과 불변하고 상자화된 개체 유형에 대한 참조 사이에는 직접적인 동등성이 있다.사실, 프로그램의 모든 원시 타입을 박스형 오브젝트 타입으로 대체할 수 있다.원시 개체에서 다른 원시 개체로의 할당은 그 값을 복사하지만, 한 참조에서 상자형 개체로의 할당은 첫 번째 참조와 동일한 개체를 참조하기 위해 기준 값을 복사한다.그러나, 이것은 어떤 문제도 일으키지 않을 것이다. 왜냐하면 개체는 불변하기 때문에, 같은 개체나 다른 개체에 대한 두 개의 언급 사이에는 의미론적으로 실질적인 차이가 없기 때문이다(물리적 평등을 보지 않는 한).산술, 비교, 논리 연산자 등 할당 이외의 모든 연산에 대해서는 상자형식의 상자를 해제하고 연산을 수행하며 필요에 따라 결과를 다시 상자형으로 할 수 있다.따라서 원시형을 전혀 저장하지 않는 것이 가능하다.
오토복싱
자동 복싱은 유형 변환(암묵적 또는 명시적)을 통해 값 유형에서 참조 유형을 추출하는 용어다.컴파일러는 자동으로 객체를 생성하는 추가 소스 코드를 제공한다.
예를 들어 J2SE 5.0 이전 Java 버전에서는 다음 코드가 컴파일되지 않았다.
정수 i = 새로운 정수(9); 정수 i = 9; // 5.0 이전 버전의 오류!
5.0 이전의 컴파일러는 마지막 줄을 받아들이지 않을 것이다. Integer
지표면에서는 기준 개체와 다르지 않다.List
,Object
, 등등.에서 변환하려면int
완전히Integer
, 사람은 정수 객체를 "수동적으로" 인스턴스화해야 했다.J2SE 5.0을 기준으로 컴파일러는 마지막 줄을 승인하고, 값을 저장하기 위해 정수 객체가 생성되도록 자동으로 변환한다.9
이 [1]말은 J2SE 5.0에서 보면Integer c = a + b
어디에a
그리고b
이다Integer
그들 스스로, 지금 컴파일 할 것이다 - a와 b는 박스화되지 않고, 정수 값은 요약되고, 결과는 새로운 것으로 자동복싱된다.Integer
, 마지막으로 변수 내부에 저장됨c
평등 연산자는 참조 유형에 대해 이미 정의되어 있기 때문에, 평등 연산자는 이러한 방식으로 사용될 수 없다. 상자 형태의 가치에 대한 동일성을 검사하려면, 여전히 그것들을 수동으로 개봉하여 원형을 비교하거나, 또는 를 사용해야 한다.Objects.equals
방법의
다른 예: J2SE 5.0은 프로그래머가 컬렉션을 처리할 수 있도록 허용한다(예:LinkedList
)이 포함된 것처럼int
대신 가치관Integer
물건들이것은 위에서 말한 것과 모순되지 않는다: 컬렉션은 여전히 동적 객체에 대한 참조만을 포함하고 있으며 원시 유형을 나열할 수 없다.A이 될 수 없다.LinkedList<int>
, 그러나 그것은 틀림없이LinkedList<Integer>
대신에그러나 컴파일러는 자동으로 코드를 변환하여 리스트가 "침묵하게" 객체를 수신하도록 하고, 소스 코드는 원시 값만 언급한다.예를 들어, 프로그래머는 이제 글을 쓸 수 있다.list.add(3)
라고 생각하고int
3
리스트에 추가되었다. 그러나, 컴파일러는 실제로 라인을list.add(new Integer(3))
.
복싱 해제
Unboxing은 형식 변환(암묵적 또는 명시적)을 통해서만 주어진 객체와 연관된 값을 얻는 것을 말한다.컴파일러는 자동으로 해당 개체에서 어떤 방법을 호출하거나 다른 방법으로 값을 검색하는 추가 소스 코드를 제공한다.
예를 들어 J2SE 5.0 이전 Java 버전에서는 다음 코드가 컴파일되지 않았다.
정수 k = 새로운 정수(4); 인트로 l = k.intvalue(); // 항상 괜찮음 인트로 m = k; // 에러였을 수도 있지만, 지금은 괜찮아
C#는 원시 유형과 객체 유형의 별도 세트가 없기 때문에 자바와 같은 의미로 자동 언박스화를 지원하지 않는다.자바에서 원시 버전과 객체 버전을 모두 가진 모든 유형은 C# 컴파일러에 의해 원시(값) 유형 또는 객체(참조) 유형으로 자동 구현된다.
두 언어 모두에서 자동 복싱은 자동으로 다운캐스트되지 않는다. 즉, 다음 코드는 컴파일되지 않는다.
C#:
인트로 i = 42; 반대하다 o = i; // 상자 인트로 j = o; // 상자 해제(필수) 콘솔.WriteLine(j); // 연결할 수 없는 라인, 작성자가 "42" 출력을 예상했을 수 있음
Java:
인트로 i = 42; 오브젝트 o = i; // 상자 인트로 j = o; // 상자 해제(필수) 시스템.밖으로.인쇄하다(j); // 연결할 수 없는 라인, 작성자가 "42" 출력을 예상했을 수 있음
유형 도움말
모던 오브젝트 파스칼은 FreePascal에서 타입 헬퍼라고 불리는 복싱에 가까운 단순한 타입에 대한 작업을 수행하거나 델파이 모드에서 델파이 및 FreePascal에서 헬퍼스를 기록하는 또 다른 방법이 있다.
언급된 방언들은 Object Pascal compile-to-native 언어들이기 때문에 C#와 Java가 구현할 수 있는 몇 가지 특징들을 놓친다.특히 강하게 입력된 변수에 대한 런타임 유형 추론.
하지만 그 특징은 권투와 관련이 있다.
그것은 프로그래머가 다음과 같은 구조를 사용할 수 있게 한다.
{$ifdef fpc}{$mode delphi}{$endif} 사용하다 시스틸스; // 이 유닛에는 간단한 유형의 랩이 포함되어 있음 시합을 하다 x:정수의=100; s:끈을 매다; 시작되다 s:= x.토스트링; 글씨를 쓰다(s); 종지부를 찍다.