정적 타이핑은 유형을 변경하려면 변수를 캐스트해야한다는 것을 의미합니까?

StackOverflow https://stackoverflow.com/questions/600126

문제

'캐스팅'을 제외하고 Java 및 C ++와 같은 정적으로 입력 된 언어로 변수 유형을 변경하는 다른 방법이 있습니까?

나는 역동적 인 타이핑과 정적 타이핑 사이의 실질적인 용어의 주요 차이점을 파악하고 매우 학문적 정의를 계속 찾으려고 노력하고 있습니다. 내 코드가 어떻게 보이는지 측면에서 그것이 무엇을 의미하는지 궁금합니다.

도움이 되었습니까?

해결책

정적 대 다이내믹 타이핑이 강한 타이핑과 약한 타이핑과 혼동하지 않도록하십시오.

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

이 두 가지 반대는 자유롭게 결합 할 수 있습니다.

  • Java는 정적으로 강력하게 입력되었습니다
  • C는 정적으로 그리고 약하게 입력되었습니다 (포인터 산술!)
  • 루비는 동적이고 강력하게 입력되었습니다
  • JavaScript는 동적이고 약하게 입력되었습니다

장르에서 정적 타이핑은 동적으로 입력 된 언어로 런타임 오류 인 컴파일러에 의해 많은 오류가 잡히는 것을 의미하지만, 또한 많은 경우 불필요하게 유형에 대해 걱정하는 데 많은 시간을 소비한다는 것을 의미합니다 (인터페이스 대 오리 참조 참조. 타자).

강력한 타이핑은 캐스트 또는 변환 방법을 사용하여 유형 간의 변환이 명시 적이어야 함을 의미합니다 (예 : 문자열을 정수로 구문 분석). 이것은 더 많은 타이핑 작업을 의미하지만 사물을 제어 할 수있는 이점이있는 반면, 약한 타이핑은 종종 시스템이 어두운 암시 적 변환을 수행 할 때 혼란을 초래하여 완전히 잘못된 변수 값을 남겨 두어 Havoc Ten Method가 선.

다른 팁

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

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

동적 타이핑: javaScript에서 런타임과 같은 변수 유형이 변경 될 수 있습니다.

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

주요 차이점은 동적으로 입력 한 언어에서 해당 메소드가 존재하는지 여부에 관계없이 런타임에 메소드를 사용하기 전까지는 알 수 없다는 것입니다. 정적으로 입력 한 언어에서는 컴파일 시간에 확인이 이루어지고 메소드가 존재하지 않으면 컴파일이 실패합니다.

내 코드가 어떻게 보이는지 측면에서 그것이 무엇을 의미하는지 궁금합니다.

유형 시스템은 정적 타이핑, 유형 추론 및 암시 적 변환이있는 언어 (예 : Scala와 같은)가 동적으로 입력 한 언어와 비슷하게 보이는 코드의 모습에 반드시 영향을 미치지는 않습니다. 또한보십시오: 토론 유형 시스템에 대해 알아야 할 사항.

당신은 그렇지 않습니다 필요 명백한 캐스팅. 많은 경우에 암시 적 주조 공장.

예를 들어:

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 ++에서 노동 조합을 사용하여 일종의 동적 타이핑을 달성 할 수 있습니다.

Dynamc에 대한 언어와 JavaScript에 대한 Java를 보자. java에서 객체의 경우 변수는 객체에 대한 참조입니다. 객체에는 런타임 유형이 있고 참조에는 유형이 있습니다. 참조 유형은 런타임 개체의 유형이거나 조상 중 하나 여야합니다. 이것이 다형성의 작동 방식입니다. 참조 유형의 계층 구조를 올리려면 캐스트해야하지만 다운되지는 않습니다. 컴파일러는 이러한 조건이 충족되도록합니다. JavaScript와 같은 언어에서 변수는 변수입니다. 원하는 객체를 가리킬 수 있으며 확인할 때까지 유형을 모릅니다.

그러나 전환의 경우 Java에는 Tointeger 및 Tofloat와 같은 많은 방법이 변환을 수행하고 동일한 상대 값을 가진 새로운 유형의 객체를 생성하는 방법이 많이 있습니다. JavaScript에는 변환 방법도 있지만 새로운 객체도 생성됩니다.

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

예를 들어 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top