유형 변환

Type conversion

컴퓨터 과학에서 유형 변환,[1][2] 유형 주조,[1][3] 유형 강제 [3]유형 저글링[4][5] 데이터 유형 간식을 변경하는 다른 방법입니다.예를 들어 정수 값을 부동소수점 값으로 변환하거나 문자열로 텍스트 표현하거나 그 반대로 변환할 수 있습니다.유형 변환은 유형 계층 또는 데이터 표현특정 기능을 활용할 수 있습니다.유형 변환의 두 가지 중요한 측면은 그것이 암묵적으로(자동적으로) 발생하는지 아니면 명시적으로 [1][6]발생하는지, 그리고 기본 데이터 표현이 하나의 표현에서 다른 표현으로 변환되는지, 또는 주어진 표현이 단지 [6][7]다른 데이터 유형의 표현으로 재해석되는지 여부이다.일반적으로 원시 및 복합 데이터 유형을 모두 변환할 수 있습니다.

프로그래밍 언어에는 유형을 변환하는 방법에 대한 자체 규칙이 있습니다.타이핑이 강한 언어는 일반적으로 암묵적인 변환이 거의 이루어지지 않고 표현을 재해석하지 않는 반면, 타이핑이 약한 언어는 데이터 유형 간에 암묵적인 변환을 많이 수행합니다.타이핑 언어가 약하기 때문에 컴파일러가 데이터 항목을 다른 표현으로 임의로 해석하도록 강제하는 경우가 많습니다.이는 명백한 프로그래밍 오류이거나 기본 하드웨어를 직접 처리하는 기술적 방법일 수 있습니다.

대부분의 언어에서 강제라는 단어는 컴파일 중 또는 실행 암묵적인 변환을 나타내기 위해 사용됩니다.예를 들어, 정수와 부동소수점 숫자를 혼합한 식(5 + 0.1 등)에서 컴파일러는 자동으로 정수 표현을 부동소수점 표현으로 변환하여 분수가 손실되지 않도록 합니다.명시적 유형 변환은 추가 코드 작성(예: 유형 식별자 추가 또는 내장 루틴 호출) 또는 컴파일러가 유형 불일치로 중단될 때 사용할 변환 루틴을 코딩함으로써 나타납니다.

Pascal, Modula-2, AdaDelphi같은 대부분의 ALGOL 유사 언어에서 변환과 캐스팅은 확연히 다른 개념입니다.이러한 언어에서 변환이란, 예를 들면 16비트 정수를 32비트 정수로 하는 등, 암묵적으로 또는 명시적으로 값을 변경하는 것을 말합니다.변환에 따라 스토리지 요구 사항이 변경될 수 있습니다. 여기에는 정밀도 손실이나 절단이 포함될 수 있습니다.한편, 캐스트라는 단어는 값을 나타내는 비트 패턴의 해석을 명시적으로 변경하는 것을 의미합니다.예를 들어 32개의 연속 비트는 32개의 부란, 4바이트 문자열, 부호 없는 32비트 정수 또는 IEEE 단정도 부동소수점 값의 배열로 취급할 수 있다.저장된 비트는 변경되지 않기 때문에 프로그래머는 의미 있는 캐스팅을 위해 표현 형식, 바이트 순서, 정렬 요구 등 낮은 수준의 세부사항을 알아야 합니다.

C 계열의 언어 및 ALGOL 68에서 단어 캐스트는 일반적으로 명시적 유형 변환(암묵적 변환과는 반대)을 참조하기 때문에 이것이 비트 패턴의 재해석인지 실제 데이터 표현 변환인지에 대해 애매한 부분이 있다.더욱 중요한 것은 포인터에 의해 어떤 데이터 유형(또는 클래스)이 위치하는지, 오브젝트(클래스) 상속과 같은 경우 컴파일러에 의해 포인터가 어떻게 조정되는지에 적용되는 다양한 방법과 규칙입니다.

언어 비교

C어족 언어

암묵적 유형 변환

암묵적 타입 변환은 강제 또는 타입 저글링이라고도 하며 컴파일러에 의한 자동 타입 변환입니다.컴파일러가 강제성을 제공할 수 있는 프로그래밍 언어도 있고, 필요한 언어도 있습니다.

혼합형 표현식에서는 프로그램이 올바르게 실행되도록 실행 필요에 따라 하나 이상의 서브타입 데이터를 슈퍼타입으로 변환할 수 있다.예를 들어, 다음은 합법적인 C 언어 코드입니다.

이중으로 하다  d;     l; 인트     i;  한다면 (d > i)   d = i; 한다면 (i > l)   l = i; 한다면 (d == l)  d *= 2; 

비록 ~일지라도d, l i는 서로 다른 데이터 유형에 속하며 비교 또는 할당이 실행될 때마다 동일한 데이터 유형으로 자동 변환됩니다. 동작은 의도하지 않은 결과가 발생할 수 있으므로 주의해야 합니다.부동소수점 값의 부분 성분이 잘리기 때문에 부동소수점에서 정수로 변환할 때 데이터가 손실될 수 있습니다.반대로 부동소수점 타입이 정수 타입을 정확하게 나타낼 수 없기 때문에 표현을 정수에서 부동소수로 변환할 때 정밀도가 저하될 수 있습니다.예를들면,float는 IEEE 754 싱글 정밀도 타입일 수 있습니다.이것은 정수 16777217을 정확하게 나타낼 수 없는 반면 32비트 정수 타입은 표시할 수 있습니다.이 경우 다음 코드로 알 수 있듯이 의도하지 않은 동작이 발생할 수 있습니다.

#실패하다 <stdio.h>  인트 주된(무효) {     인트 i_value   = 16777217;     흘러가다 f_value = 16777216.0;     인쇄물("정수: %d\n", i_value);     인쇄물("플로트: %f\n", f_value);     인쇄물("그들의 동등성: %d\n", i_value == f_value); } 

플로트를 IEEE 단정도로서 구현하고 ints를 32비트 이상으로 하는 컴파일러에서는, 이 코드에 의해서 다음과 같은 독특한 인쇄 출력이 됩니다.

정수: 16777217 플로트: 16777216.000000 등식: 1

1은 위의 마지막 줄에서 동등함을 나타냅니다.이 이상한 동작은 암묵적인 변환에 의해 발생합니다.i_value비교해서 뜨다f_value변환에 의해 정밀도가 저하되어 비교 전 값이 같아집니다.

중요한 요점:

  1. float로.int절단(예: 부분 부분 제거)을 일으킵니다.
  2. double로.float자리 반올림을 일으킵니다.
  3. long로.int과도한 고차 비트를 드롭합니다.
형식 프로모션

암묵적 유형 변환의 한 가지 특별한 경우는 유형 승격입니다. 여기서 객체는 원래 유형의 슈퍼셋을 나타내는 다른 데이터 유형으로 자동 변환됩니다.프로모션은 일반적으로 산술 및 논리 연산 전에 타깃 플랫폼의 ALU(산술 로직 유닛)의 네이티브 유형보다 작은 유형으로 사용되며, ALU가 여러 유형으로 작동할 수 있는 경우 이러한 연산을 가능하게 하기 위해 사용됩니다.C 및 C++는 int로 승격되는 부울, 문자, 와이드 문자, 열거형 및 짧은 정수형 개체와 더블로 승격되는 플로트형 개체에 대해 이러한 프로모션을 수행합니다.일부 다른 유형의 변환과 달리 프로모션은 정확성을 잃거나 개체에 저장된 값을 수정하지 않습니다.

자바어:

인트 x = 3; 이중으로 하다 y = 3.5; 시스템..나가..인쇄(x + y); // 출력은 6.5가 됩니다. 

명시적 유형 변환

명시적 유형 변환(일명 타입 캐스팅)은 프로그램 내에서 명시적으로 정의된 유형 변환입니다(암묵적 유형 변환을 위한 언어의 규칙에 따라 자동으로 수행되지 않음).이것은 프로그램에서 사용자에 의해 정의됩니다.

이중으로 하다  = 3.3; 이중으로 하다 db = 3.3; 이중으로 하다 직류 = 3.4; 인트 결과 = (인트) + (인트)db + (인트)직류; // 결과 == 9 // 암묵적 변환을 사용하는 경우("result = da + db + dc"와 같이), 결과는 10이 됩니다. 

명시적 변환에는 몇 가지 종류가 있습니다.

확인했다
변환이 실행되기 전에 실행 시 체크가 실행되어 행선지 타입이 송신원값을 유지할 수 있습니다.그렇지 않으면 오류 조건이 발생합니다.
체크되어 있지 않다
체크는 실행되지 않습니다.대상 유형이 소스 값을 유지할 수 없는 경우 결과는 정의되지 않습니다.
비트 패턴
소스의 원시 비트 표현은 그대로 복사되고 수신인 유형에 따라 다시 해석됩니다.이는 에일리어싱을 통해서도 가능합니다.

오브젝트 지향 프로그래밍 언어에서는 오브젝트도 다운캐스트할 수 있습니다.기본 클래스의 참조는 파생 클래스 중 하나로 캐스트됩니다.

C# 및 C++

C#에서 타입 변환은 안전한 방법 또는 안전하지 않은 방법(즉, C-like)으로 이루어질 수 있으며, 이는 체크된 타입 [8]캐스트라고 불립니다.

동물 동물성 = 신규 고양이();  불독 b = (불독) 동물성;  // (animal이 Bulldog인 경우), stat.type(animal)은 Bulldog이고, 그렇지 않은 경우 예외입니다. b = 동물성 ~하듯이 불독;         // (동물이 Bulldog인 경우), b = (Bulldog인 경우), 그렇지 않은 경우 b = null  동물성 = 무효; b = 동물성 ~하듯이 불독;         // b == null 

C++에서는 C++ 스타일의 캐스트 구문을 사용하여 유사한 효과를 얻을 수 있습니다.

동물* 동물성 = 신규 고양이;  불독* b = static_cast< >불독*>(동물성); // Animal 또는 Bulldog 중 하나가 다른 것(또는 동일한 것)에서 파생된 경우에만 컴파일합니다. b = dynamic_cast< >불독*>(동물성);         // (동물이 Bulldog인 경우), b = (Bulldog*) 동물, 그렇지 않은 경우 b = nullptr  불독& br = static_cast< >불독&>(*동물성); // 위와 동일하지만 nullptr이 반환되면 예외가 발생합니다.                                               // 예외 처리가 회피되는 코드에는 표시되지 않습니다. 동물성 = 특수; b = dynamic_cast< >불독*>(동물성);         // b == nullptr  삭제하다 동물성; // 자원을 항상 해방 

에펠

에펠에서는 유형 변환의 개념이 유형 시스템의 규칙에 통합됩니다.할당 규칙에는 다음과 같은 할당이 명시되어 있습니다.

x := y 

는 소스 표현의 유형이 다음과 같은 경우에만 유효합니다.y이 경우 는 대상 엔티티의 유형과 호환됩니다.x이 경우는, 규칙에서 compatible은 소스 표현의 유형이 타겟 표현과 일치하거나 변환되는 것을 의미합니다.유형의 적합성은 객체 지향 프로그래밍에서 다형성을 위한 익숙한 규칙에 의해 정의됩니다.예를 들어, 위의 할당에서,y유형에 적합하다x의 수업이라면y그 바탕이 되는 것은 그 바탕이 되는 것이다.x기반이 됩니다.

에펠의 유형 변환의 정의

에펠에서 유형 변환, 특히 변환변환의 액션은 다음과 같이 정의됩니다.

클래스 CU에 근거한 타입은 클래스 CT에 근거한 타입 T로 변환됩니다(및 T는 U에서 변환됩니다).

CT에는 U를 변환 타입으로 사용한 변환 프로시저가 있습니다.
CU에는 T를 변환 유형으로 나열하는 변환 쿼리가 있습니다.

Effel은 Microsoft에 대한 완전한 호환 언어입니다.NET 프레임워크개발 전.넷, 에펠은 이미 광범위한 도서관을 가지고 있었다.사용방법특히 문자열과 같이 일반적으로 사용되는 유형의 NET 유형 라이브러리는 변환 문제를 일으킵니다.기존 Effel 소프트웨어는 문자열 클래스를 사용합니다(예:STRING_8Eiffel 라이브러리의 Eiffel 소프트웨어입니다.NET은 를 사용해야 합니다.NET 문자열 클래스(System.String많은 경우, 예를 들어 를 호출하는 경우.의 항목을 상정하다NET 메서드인수로 전달되는 NET 유형.따라서 이러한 유형의 변환은 가능한 한 원활해야 합니다.

    my_string: 스트링_8                 -- 원어민 에펠 문자열     my_system_string: SYSTEM_STRING     -- 원어민.NET 문자열          ...              my_string := my_system_string 

위의 코드에서는 2개의 문자열이 선언되어 있습니다.각 타입의 1개입니다(SYSTEM_STRING에펠 준거한 시스템 별칭입니다.문자열).왜냐면System.String준거하지 않다STRING_8위의 할당은 다음 경우에만 유효합니다.System.String로 변환하다.STRING_8.

에펠교실STRING_8변환 절차가 있다make_from_cil활자체의 경우System.String전환 절차도 항상 작성 절차로 지정된다(시공자와 유사).이하에, 의 발췌를 나타냅니다.STRING_8클래스:

    학급 스트링_8         ...     만들다         make_from_cil         ...     개종시키다         make_from_cil ({SYSTEM_STRING})         ... 

변환 절차가 존재하면 할당이 다음과 같이 이루어집니다.

            my_string := my_system_string 

의미적으로는 다음과 같습니다.

            만들다 my_string.make_from_cil (my_system_string) 

그 안에서my_string새로운 유형의 개체로 구성됨STRING_8와 동등한 함량을 가지다my_system_string.

원래 소스 및 대상이 반대로 설정된 할당을 처리하려면:

            my_system_string := my_string 

학급.STRING_8변환 쿼리도 포함되어 있습니다.to_cil그 결과,System.String일례로STRING_8.

    학급 스트링_8         ...     만들다         make_from_cil         ...     개종시키다         make_from_cil ({SYSTEM_STRING})         행선지: {SYSTEM_STRING}         ... 

과제:

            my_system_string := my_string 

그러면 다음과 같아집니다.

            my_system_string := my_string.행선지 

에펠에서는 유형 변환 설정이 클래스 코드에 포함되지만 클라이언트 코드의 명시적 유형 변환과 마찬가지로 자동으로 수행됩니다.에는 할당뿐만 아니라 인수(파라미터) 치환 등 다른 유형의 첨부 파일도 포함됩니다.

녹은 원시 유형 간의 암묵적 유형 변환(공용)을 제공하지 않습니다.단, 명시적 유형 변환(캐스팅)은 다음 명령을 사용하여 수행할 수 있습니다.as키워드를 [9]지정합니다.

프린트!("u16으로 1000은: {}", 1000 ~하듯이 u16); 

보안 문제

해킹에서 타이프캐스팅은 변수의 데이터 유형을 원래 [10]정의 방식에서 일시적으로 변경하기 위해 유형 변환을 오용하는 것입니다.이는 변수가 "타입캐스트"된 후 타입 변환에서 컴파일러는 해킹된 변수를 특정 작업에 [11]대한 새로운 데이터 유형으로 취급하기 때문에 해커에게 기회를 제공합니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b c Mehrotra, Dheeraj (2008). S. Chand's Computer Science. pp. 81–83. ISBN 978-8121929844.
  2. ^ Programming Languages - Design and Constructs. 2013. p. 35. ISBN 978-9381159415.
  3. ^ a b Reilly, Edwin (2004). Concise Encyclopedia of Computer Science. pp. 82, 110. ISBN 0470090952.
  4. ^ Fenton, Steve (2017). Pro TypeScript: Application-Scale JavaScript Development. pp. xxiii. ISBN 978-1484232491.
  5. ^ "PHP: Type Juggling - Manual". php.net. Retrieved 27 January 2019.
  6. ^ a b Olsson, Mikael (2013). C++ Quick Syntax Reference. pp. 87–89. ISBN 978-1430262770.
  7. ^ Kruse, Rudolf; Borgelt, Christian; Braune, Christian; Mostaghim, Sanaz; Steinbrecher, Matthias (16 September 2016). Computational Intelligence: A Methodological Introduction. p. 269. ISBN 978-1447172963.
  8. ^ Mössenböck, Hanspeter (25 March 2002). "Advanced C#: Checked Type Casts" (PDF). Institut für Systemsoftware, Johannes Kepler Universität Linz, Fachbereich Informatik. p. 5. Retrieved 4 August 2011. C# 튜토리얼에서
  9. ^ "Casting - Rust By Example". doc.rust-lang.org.
  10. ^ Jon Erickson 해킹, 제2판: 이용의 기술 2008 1593271441 p51 "타이프캐스팅은 변수의 데이터 유형을 원래 어떻게 정의되었든 간에 일시적으로 변경하는 단순한 방법입니다.변수가 다른 유형으로 타이프캐스트되면 컴파일러는 기본적으로 해당 변수를 새로운 데이터 유형으로 취급하도록 지시받습니다.단, 해당 작업에만 해당됩니다.typecasting 구문은 다음과 같습니다. (type_data_type) 변수..."
  11. ^ Arpita Gopal Magnifying C 2009 8120338618 p. 59 "위에서 볼 때, 활자 주조 사용은 한 가지 유형의 변수를 만들고 한 가지 작업에 다른 유형의 변수처럼 행동하는 것이 분명합니다.따라서 이 타이프캐스팅 기능을 사용하여 정수를 타이프캐스팅하여 ASCII 문자를 생성할 수 있습니다."

외부 링크