toggle-toggle / javascript-basic

🌱우아한 테크코스 프론트엔드 자바스크립트 기초 스터디 입니다.
9 stars 0 forks source link

[2021.03.04] 명시적 변환, 암시적 변환, Nominal 타이핑, 구조화 타이핑, 덕 타이핑 #4

Closed bucketHaneul closed 3 years ago

bucketHaneul commented 3 years ago

데이터 타입 변환 2가지

1. 명시적 변환

값의 타입은 개발자의 의도에 따라 다른 타입으로 변환할 수 있다. 개발자가 의도적으로 값의 타입을 변환하는 것을 명시적 타입 변환 또는 타입 캐스팅이라 한다.

var x = 10;
var str = x.toString();
console.log(typeof str, str); // string 10

// 그렇다고 변수 x의 값이 변경된 것은 아니다.
console.log(typreof x, x); // number 10

또한 String(), Number(), Boolean()과 같은 생성자 함수를 new 연산자 없이 호출하는 방법도 있다.

String(123) // -> "123"
Number("123") // -> 123

2. 암묵적 변환

자바스크립트 엔진에 의해 암묵적으로 타입이 자동 변환되기도 한다. 이를 암묵적 타입 변환 또는 타입 강제 변환이라 한다.

var str = x + '';
console.log(typrof str, str) // string 10

암묵적 타입 변환은 기존 변수 값을 재할당하여 변경하는 것이 아니다. 자바스크립트 엔진은 표현식을 에러 없이 평가하기 위해 피연산자의 값을 암묵적으로 타입 변환해 새로운 타입의 값을 만들어 단 한 번 사용하고 버린다.

2.1 문자열 타입으로 변환

1 + "2" // -> "12"

2.2 숫자 타입으로 변환

1 - "1" // -> 0
1 * "20" // -> 20
1 / "one" //-> NaN
"1" > 0 // -> true

2.3 불리언 타입으로 변환

if (' ')       console.log("true") // -> "true"
if ('string')  console.log("true") // -> "true"
if (null)      console.log("true") // -> (아무것도 찍히지 않음)

타입 종류 시스템 3가지

1. Nominal Typing

특정 키워드를 통해 타입을 지정하는 방식으로, 서로 호환 가능 하다고 명시적으로 표현된 타입 값의 할당만을 허용한다. 정적언어인 C#, C++, Java가 nominal typing방식으로 타입 체킹이 이루어진다.

int num = 100;
char str = "abc";

num = str // -> ERROR

2. Structural Typing

nominal typing과 반대인 개념으로, 멤버에 따라 타입을 검사하는 방법이다. 비교하는 두 데이터의 타입 구조를 비교하여 호환되는지 검사한다. 한 타입이 다른 타입이 갖는ㄴ 멤벌르 모두 가지고 있다면 두 타입은 호환 가능하다. Typescript, Go가 구조적 타이핑을 기반으로 타입 시스템을 갖는다.

interface Named {
    name: string;
}

class Person {
    name: string;
}

let p: Named;
// 성공, 구조적 타이핑이기 때문입니다.
p = new Person();

3. Duck Typing

동적 타이핑의 한 종류로, 변수 및 메소드의 집합이 객체의 타입을 결정하는 것을 말한다. 파이썬과 루비에서 사용된다.

class Duck:
    def __init__(self):
        self.name = "오리"

    def sound(self):
        print("꽥꽥!")

    def walk(self):
        print(f"{self.name}가 걷는다.")

class Dog:
    def __init__(self):
        self.name = "개"

    def sound(self):
        print("왈왈!")

    def walk(self):
        print(f"{self.name}가 걷는다.")

Duck클래스와 Dog클래스 모두 sound, walk 메서드를 갖는다. 즉, 두 클래스는 서로 다른 클래스이지만 같은 메서드와 필드를 갖는다. 따라서, 아래와 같은 코드가 에러없이 동작한다.

def make_sound(duck):
    duck.sound()

def take_walk(dog):
    dog.walk()

duck = Duck()
dog = Dog()

make_sound(duck) # 꽥꽥!
make_sound(dog) # 왈왈!

take_walk(duck) # 오리가 걷는다.
take_walk(dog) # 개가 걷는다.

단축 평가

  'Cat' && 'Dog' // -> "Dog"

출처

https://alstn2468.github.io/Javascript/2020-05-11-Implicit_Explict_Nominal_Structuring_DuckTyping/ https://corock.tistory.com/459 https://typescript-kr.github.io/pages/type-compatibility.html 모던 자바스크립트Deep Dive

bucketHaneul commented 3 years ago

단축 평가 내용 추가했습니다😁