2013-04-10 1 views
1

약한 타이핑 (동적 타이핑과 혼동하지 말아야 함)의 정의는 두 값이 다른 타입 일 때 이진 연산자가 작동한다는 것입니다.약한 타이핑, 자동 보호, 확대 변환의 차이점은 무엇입니까?

파이썬 프로그래머는 1+"hello"이 자동으로 다른 작업을 수행하는 대신 실패하기 때문에 파이썬을 강력하게 입력한다고 주장합니다. 반대로 일반적으로 약형으로 간주되는 다른 언어 (예 : PHP, JavaScript, Perl)는 피연산자 중 하나 또는 둘 다 자동 변환합니다. 예를 들어, JavaScript에서는 1+"hello" ->"1hello"이고 Perl에서는 1+"hello" ->1이지만 1+"5" ->6입니다.

이제 Java는 강력한 형식의 언어로 간주되지만 자동 (해제) 복싱 및 확장 변환은이 문제를 해결하는 것으로 보입니다. 예를 들어, 1+new Integer(1) ->2, hello+"1" ->"hello1", 'A'+1 ->66 및 long은 일반적으로 잘린 경우에도 자동으로 float로 변환 할 수 있습니다. 자바는 약한 타입인가? 약한 타이핑, 자동 저장 및 확대 변환의 차이점은 무엇입니까?

+0

당신은 그 정의를 어디에서 들었습니까? 나에게 아주 이상한 것 같아. "강한"및 "약한"이라는 용어는 일반적으로 내 경험에 매우 유용하지는 않지만 여기서하는 것처럼 사용하지 않을 것입니다. –

+0

@ 존 키 스케 (JonSkeet), 어떻게 정의하겠습니까? – Dog

답변

3

약한 타이핑은 컴파일러/인터프리터가 필요로하는 경우 특정 변환 및 임시 다형성이 암시 적으로 수행되는 경우입니다.

자동 보강은 리터럴 및 비 객체 유형이 필요할 때 자동으로 각각의 객체 유형으로 변환되는 경우입니다. (예를 들어, 자바는 문자열 리터럴의 메소드를 문자열 객체처럼 호출 할 수있게 해줍니다.) 이것은 타이핑 시스템과는 아무런 관련이 없습니다. 실제로는 객체를 명시 적으로 생성하지 않아도되는 구문적인 설탕입니다.

확대 변환은 약한 타이핑 형식입니다. 매우 엄격하게 형식화 된 언어에서는 허용되지 않습니다. 그러나 Java와 같은 언어에서는 부작용이 없으므로 허용됩니다. 이것이 자바만큼 강력한 유형의 언어라고 생각하지 않을 정도로 작습니다.

Java는 또한 문자열 연결에 + 연산자를 오버로드합니다. 이것은 약한 타입의 언어에서 볼 수있는 기능이지만, 자바를 약하게 타입 지정하는 것은 충분하지 않습니다. (비록 그것이 정말로 어리석은 아이디어라고 생각한다.)