2009-03-01 1 views
0

'캐스팅'을 제외하고 Java 및 C++과 같이 정적 유형 언어로 변수 유형을 변경하는 다른 방법이 있습니까?정적 유형 지정은 유형을 변경하려면 변수를 변환해야한다는 의미입니까?

나는 동적 인 것과 정적 인 타이핑 사이의 실제적인 차이점을 알아 내고 매우 학문적 인 정의를 찾는 것을 계속 시도하고있다. 내 코드가 어떻게 생겼는지는 무엇을 의미하는지 궁금해.

+0

주조 변수의 유형을 변경하지 않습니다. 캐스트의 결과는 암시 적으로 어디에도 저장되지 않은 새 표현식입니다. – recursive

답변

11

강력한 대 약한 입력과 혼동하는 정적 대 동적 입력이 없는지 확인하십시오.

  • 정적 유형 지정 : 각 변수, 메소드 매개 변수, 리턴 유형 등은 컴파일 타임에 알려진 또는 유추 된 유형을가집니다.
  • 동적 유형 지정 : 유형은 컴파일 타임에 무시되거나 존재하지 않습니다.
  • 강력한 유형 지정 : 런타임시 각 객체는 특정 유형을 가지며 해당 유형에 대해 정의 된 조작 만 수행 할 수 있습니다.
  • 약한 입력 : 런타임 개체에는 명시 적 형식이 없거나 시스템은 필요한 경우 형식을 자동으로 변환하려고 시도합니다.

이 두 쪽이 자유롭게 결합 할 수 있습니다

  • 자바는 정적이며 강하게 C 정적 및 약하게 입력 된
  • 입력
  • 루비는 동적이며 강력
  • 을 입력 (포인터를 arithmetics를!)
  • JavaScript가 동적으로 약하게 입력되었습니다.

일반적으로 정적 유형 지정은 컴파일러에서 동적 유형 지정 언어의 런타임 오류 인 많은 오류가 발견되었음을 의미하지만 유형에 대해 많은 시간을 할애하여 많은 경우 불필요하게 사용합니다 (인터페이스 대 오리 타이핑).

강력한 타이핑은 유형 간의 변환이 형 변환을 통해 또는 변환 메소드 (예 : 문자열을 정수로 구문 분석)를 통해 명시 적이어야한다는 것을 의미합니다. 이것은 더 많은 타이핑 작업을 의미하지만, 당신을 통제 할 수있는 장점을 가지고 있습니다. 반면 약한 타이핑은 시스템이 어둡지 않은 암시 적 변환을 수행 할 때 종종 혼란을 낳습니다. 선.

+0

굉장합니다. 감사. –

4

C++/Java에서는 변수 유형을 변경할 수 없습니다.

정적 입력 : 변수에는 컴파일 유형에 할당 된 하나의 유형이 있으며 변경되지 않습니다.

동적 타이핑 : 런타임 중에 변수 유형이 변경 될 수 있습니다. JavaScript에서 :

js> x="5" <-- String 
5 
js> x=x*5 <-- Int 
25 
+0

캐스팅하지 않고 유형을 변경 하시겠습니까? –

+1

@ 마크, VALUE 유형을 변경할 수 있지만 VARIABLE은 변경할 수 없습니다. int i = 42; // float로 변경할 수 없습니다. 그러나 i (42)의 값은 다음과 같이 나타낼 수 있습니다. 내 예를 보아라. – strager

+1

변수 유형이 아닙니다. 값/표현식의 유형을 변경할 수 있습니다. –

1

동적 인 유형화 된 언어의 주요 차이점은 런타임에 메서드를 사용하여 해당 메서드가 있는지 여부를 알기 전까지는 알 수 없습니다. 정적으로 형식화 된 언어에서는 컴파일 타임에 검사가 수행되고 메서드가 존재하지 않으면 컴파일이 실패합니다.

0

은 명시적인 주조가 필요합니다. 많은 경우 암시 적 캐스팅이 작동합니다. 예를 들어

는 :

int i = 42; 
float f = i; // f ~= 42.0 
int b = f; // i == 42 

class Base { 
}; 

class Subclass : public Base { 
}; 

Subclass *subclass = new Subclass(); 
Base *base = subclass; // Legal 

Subclass *s = dynamic_cast<Subclass *>(base); // == subclass. Performs type checking. If base isn't a Subclass, NULL is returned instead. (This is type-safe explicit casting.) 

당신은, 그러나, 변수의 유형을 변경할 수 없습니다. C++에서 유니온을 사용할 수 있지만, 일종의 동적 타이핑을 구현할 수 있습니다.

1

내 코드가 어떻게 표시되는지는 궁금합니다.

유형 시스템이 어떤 코드에 어떤 영향을 줄지는 않습니다. 예 : 정적 유형 지정, 유형 유추 및 암시 적 변환 (예 : 스칼라)이있는 언어는 동적 유형 지정 언어와 비슷합니다. 참조 : What To Know Before Debating Type Systems.

0

역동적으로 입력 된 언어와 자바 스크립트를 자바에서 살펴 봅니다. Java에서 객체의 경우 변수는 객체에 대한 참조입니다. 객체에는 런타임 유형이 있고 참조에는 유형이 있습니다. 참조 유형은 런타임 객체 또는 해당 조상 중 하나이어야합니다. 이것이 다형성이 작동하는 방식입니다. 참조 유형의 계층 구조를 위로 이동하지만 아래로는 이동하지 않아야합니다. 컴파일러는 이러한 조건이 충족되는지 확인합니다. JavaScript와 같은 언어에서 변수는 바로 변수 인 변수입니다. 원하는 개체를 가리 키도록 할 수 있으며 검사 할 때까지 그 개체의 유형을 알 수 없습니다.

변환의 경우 변환을 수행하고 동일한 상대 값을 갖는 새로운 유형의 객체를 생성하려면 toInteger 및 toFloat와 같은 메소드가 많이 있습니다. JavaScript에서는 변환 메소드도 있지만 새 오브젝트도 생성합니다.

+0

그래서 Java의 toFloat는 기존 객체를 변경하지 않습니다. 나는 당신이 x = "abc"그리고 x = "100"이라고 말할 수있는 Ruby를보고있다. Javascript는 새로운 객체를 생성하지만 Ruby는 기존 객체를 새로운 유형으로 변경한다고 생각했다. 아니면 내가 틀렸어? –

0

정적으로 입력 된 언어를 사용하는지 여부에 관계없이 코드는 실제로 많이 달라지지 않아야합니다. 동적으로 입력 된 언어로 변수의 데이터 유형을 변경할 수 있다고해서 그렇게하는 것이 좋습니다.

예를 들어, VBScript에서는 헝가리 표기법을 사용하여 변수의 기본 데이터 형식을 지정합니다. 그렇게하면 코드가 유형을 혼합하는지 쉽게 알 수 있습니다. (이것은 헝가리 표기법의 원래 사용법이 아니지만 매우 유용합니다.)

동일한 데이터 유형을 유지함으로써 코드가 실제로 무엇을하는지, 그리고 코드가 단순히하지 않는 상황을 피할 수 있습니다 제대로 작동하지 않습니다.

Dim id 
id = Request.QueryString("id") ' this variable is now a string 
If id = "42" Then 
    id = 142 ' sometimes turned into a number 
End If 
If id > 100 Then ' will not work properly for strings 

당신은 같은 종류의 혼합되는 코드를 발견 할 수 헝가리어 표기법을 사용 : 예를 들어

lngId = Request.QueryString("id") ' putting a string in a numeric variable 

strId = 42 ' putting a number in a string variable 
관련 문제