[33-js-concepts] 4. 명시적 변환, 암시적 변환, Nominal, 구조화, 덕 타이핑 (Implicit, Explicit, Nominal, Structuring and Duck Typing)

데이터 타입 변환에는 두가지가 있다.

1.명시적 변환

: 개발자가 의도를 가지고 데이터타입을 변환시키는 것

*  타입을 변경하는 방법
    -> Object(), Number(), String(), Boolean() 와 같은 함수를 이용
         new 연산자가 없다면 타입을 변환하는 함수로서 사용된다.

  Number() != parseInt()

 

2.암시적 변환

 : 자바스크립트 엔진이 필요에 따라 자동으로 데이터타입을 변환시키는

   *산술연산자 - 더하기 + 연산자의 우선순위 : 숫자 < 문자

console.log(4 + "coen");
결과 : coen
console.log("coen" + 4);
결과 : coen4
console.log(4 + 5 + "coen");
결과 : 9coen
console.log(4 + "coen" + 5);
결과 : 4coen5

console.log("coen" + true);

결과 : coentrue

console.log(4 + true);

결과 : 5

console.log("12" + 2);

결과 : 122

 

*그외 다른 연산자(-, *, /, %)의 운선순위 : 숫자 > 문자

console.log("12" - "2");

결과 : 10
console.log(12 - "2");

결과 : 10
console.log("12" - 2);

결과 : 10

console.log("coen" + 3);

결과 : NaN

console.log("12" * "2");

결과 : 24
console.log(12 / "2");

결과 : 6
console.log("12" % 2);

결과 : 0

 

 

아래 3가지는 타입 시스템의 종류이다.

타입 시스템이란 : 값, 표현식, 함수, 모듈 등을 분류하는 규칙의 집합

보다 형식적으로는, "계산될 값을 분류하여 특정한 종류의 프로그램 오류가 일어나지 않음을 증명하는 계산 가능한 방법"으로 정의된다."

1. Nominal Typing (명칭적 타이핑)

특정 키워드를 통해 서로 호환 가능하다고 명시적으로 표현된 타입 간의 할당만을 허용한다.

정적언어인 c#, Java는 nominal typing방식으로 타입 체킹이 이루어진다.

 

각각 별도의 클래스이므로 호환이 가능하지 않기 때문에 에러발생

> extends 와 같이 서로 호환가능함을 명시해줘야함

 

2. Structural Typing (구조적 타이핑)

멤버에 따라 타입을 연관 짓는 방법

nominal typing과 반대인 방법

TypeScript는 구조적타이핑을 기반으로 타입 시스템을 갖추고 있다.

타입스크립트에서는 두 타입의 구조만을 비교하여 호환성을 결정한다.

어떤 타입이 다른 타입이 갖는 멤버를 전부 가지고 있다면 따로 두 타입이 호환되는 타입이라는 명시적인 표시는 필요하지않다.

같은 구조로 되어 있으면 같은 타입처럼 사용할 수 있다.

 

3. 덕 타이핑(Duck Typing)

동적 타이핑의 한 종류로, 객체의 변수 및 메소드의 집합이 객체의 타입을 결정하는 것을 말한다. 

 덕 타이핑이랑 용어는 덕 테스트에서 유래했다.

만약 어떤 새가 오리처럼 걷고, 헤엄치고, 꽥꽥거리는 소리를 낸다면 나는 그 새를 오리라고 부를 것이다.

이 말의 의미는 새지만 오리처럼 행동한다면 오리라고 부른다는 뜻이다.

Duck Typing에서는 형태를 판별하는 대신, 원하는 동작을 수행할 수 있는지 여부를 검사한다.

형을 특정하여 생기는 제약을 피하여 유연하게 코드를 작성할 수 있다.

그러나 형 검사를 하지 않기 때문에 기본적인 오류들이 잠재되어 있으며, 이 때문에 테스트 코드 작성을 강력하게 권장한다.

현재 파이썬, 루비등에서 자주 사용된다.

 

댓글(0)

Designed by JB FACTORY