반응형

Python3 타입검사(Type Check)

타입에 필자 생각

C/C++ 에서 주로 개발을 한 사람(필자의 경우) 입장에서는 자바스크립트나 파이썬처럼 변수(라고 쓰고 객체라고 읽고 쓰더라)의 형이 자유로운 경우 형이 바뀐 경우 문법상 문제가 없기 때문에 잘못된 변수 사용하는 것에 걱정을 한다. 그리고 결국 컴퓨터에서 동작하기 때문에 변수는 자유롭게 받는 것에 비해 타입 에러도 있다. 때문에 몇몇 유명한 개발자는 파이썬을 안좋게 본다. 그러나 이런 관점과 요구사항은 항상 개선책이 나오는 원동력이 되는 것 같다. 파이썬도 타입검사 메서드가 제공되면서 C++ 스타일의 코딩이 가능하기 때문이다.

type() vs isInstance()

입문자를 위한 서적에서는 대부분 type() 메서드를 잠시 소개했던 것으로 기억한다. 아마 isInstance()도 소개를 한다면, 시대가 많이 바뀌었거나 해당 입문서가 수준이 높다고 생각해야 한다.

type()

type() 메서드의 경우 입문서에서 소개한 것과 같이 파이썬에서 기본적으로 제공하는 자료형에 대해서 구분이 가능하다.

예시)

type(1) is int
# True
type([]) is list
# True
a = 1
b = 3
type(a) is type(b)
# True

그러나 이 type()의 한계는 class의 인스턴스의 경우 해당되는 클래스의 인스턴스인지만 확인을 한다. C++ 처럼 상속의 경우는 고려가 되지 않아서 상속받은 클래스의 인스턴스를 알아 볼 수 없다.

예시)

class Test1:
    pass
class Test2(Test1):
    pass

a = Test1()
b = Test2()
type(a) is Test1
# True
type(b) is Test2
# True
type(b) is Test1
# False

isInstance()

type()의 한계점을 해결해주는 것이 isInstance() 메서드이다. 개발자가 임으로 만든 class의 인스턴스의 특정 클래스인지 검사할 경우 자식 클래스의 인스턴스도 True로 리턴을 해준다. 때문에 개발자는 구현을 하면서 타입에 느슨한 연결을 구현을 좀 더 안전하게 할 수 있다.

예시)

class Test1:
    pass
class Test2(Test1):
    pass

a = Test1()
b = Test2()
isInstance(a, Test1)
# True
isInstance(b, Test2)
# True
isInstance(b, Test1)
# True

추가로 isInstance()는 튜플을 허용된다.

예시) unicode str 검사 방법 둘다 basestring 의 subclass임을 이용하는 방법

tmpStr = 'hello'
isInstance(tmpStr, (str, unicode))

무엇을 사용해야 하는가?

type()과 isInstance() 각각 특징이 있는 것이지 장단점이 있는 것이 아니기 때문에 적절히 활용하는 것이 좋다. 두 메서드를 적절히 사용하여 subclass를 확인 하는 방법도 있기 때문이다.

참조 자료

스택오브플러워

해시코드

반응형
반응형

TypeScript 기초: 기본 타입(Basic Type)

타입스크립트(TS: TypeScript)에서는 기본적으로 제공하는 타입이 존재 한다. 하지만, 항상 염두를 해야 하는 것이 최종적으로 빌드 되었을때는 자바스크립트(JS: JavaScript)가 됨을 잊지 말아야 한다.


기본 타입

JS에서 제공되는 기본 타입과 같은 타입


1. undefined

2. null

3. number

4. string

5. boolean


undefined 와 null은 JS에서 내부적으로 구분이 되기 때문에 역시 타입으로 정의가 가능하다. 주의해야 할 점은 이러한 기본타입은 변수 선언시 초기값이 주어질 경우 굳이 타입을 정의 하지 않아도 된다.


확장된 타입

TS에서 등장한 타입이다. 다만, 지금도 업데이트가 꾸준히 되고 있는 언어이기 때문에 필요에 따라서 새로운 타입이 추가될 가능성이 없는 건 아니다.


1. Tuple

2. enum

3. any

4. never


Tuple

JS에서는 기본적으로 제공되는 타입이 아니다. 대신 Array를 이용해서 간접적으로 구현을 타입스크립트에서는 이를 타입으로 만들어서 정형화를 시켜주는 것이다. 사용방법은 다음과 같다.

예시)

var foo: [string, number];
foo = [5, "hello"]    // error
foo = ["hello", 5]    // no error 


여기서 타입스크립트의 역할은 해당 변수의 튜플의 순서에 대한 문법검사를 해준다는 것을 알 수 있다. 이 문법은 자바스크립트에서는 에러가 나지 않는다는 점을 기억하자.


enum

컴파일러형 언어(C, C++, JAVA, C# 등)에 있는 enum과 동일한 역할을 한다. 선언된 키워드는 따로 정의 하지 않는다면, 선언된 순서대로 0부터 1씩 커진다. 만약 첫 번째 선언된 키워드에 숫자를 정의 하면, 이후 키워드는 강제로 선언된 키워드의 숫자에서 부터 1씩 커진다. 사용방법은 다음과 같다.

예시)

enum NUM{ one = 1, two, three };
var flag = NUM.two
switch(flag)
{
    // ...
    case NUM.two:    // execute this line
    // ...
    break;
    // ...
}


enum으로 호출된 값들은 실제 number형을 갖고 있다. 그리고 자바스크립트로 이러한 형태를 구현을 해주는 것을 타입스크립트의 컴파일러가 코드를 작성을 해준다. 어떻게 코드가 작성되는지 확인하고 싶다면, 타입스크립트 공식 홈페이지의 PlayGround에서 임으로 작성하여 확인을 해봐도 된다.


any

JS에서는 변수를 선언할때 모든 값을 참조하게 할 수 있다. 타입스크립트에서는 자바스크립트에서 내부적으로 갖고 있는 타입을 명시 해주면서 타입검사를 할 수 있다. 하자만, 웹 개발 환경의 경우 종종 어떤 타입이 오는지 알지 못하는 상태에서 개발을 해야 하는 경우가 있다. 이러한 유연성을 위해서 기존의 자바스크립트처럼 모든 타입을 받을 수 타입이다. 사용방법은 타입을 선언을 변수뒤에 ": any"를 작성하면 된다.

예시)

var foo: any;
foo = 5;
foo = "five";    // No Error


이러한 타입으로 자바스크립트와 타입스크립트를 비교하자면, 자바스크립트는 암묵적으로 any타입으로 선언이 되어 있고, 타입스크립트는 참조되는 값에 타입으로 자동선언이 되기 때문에 any타입을 명시 해줘야 자바스크립트와 똑같이 사용할 수 있다.


never

함수의 반환형에서 선언시 사용되는 타입이다. 최근(2016년 버전 2.0 업데이트)에서 논의 되어 추가 되었다. 비동기 방식으로 네트워크 작업이 많은 웹 개발환경에서는 콜백함수를 많이 활용한다. 또한 네트워크는 컴퓨터 또는 디바이스 바깥과 입출력을 하기 때문에 예외(에러) 처리가 필요로 하게 되는데, 타입스크립트에서 이렇게 반환할 수 없는 함수에서 사용하기 위한 서브타입으로 도입하였다.

예시1)

function error(msg: string): never
{
    throw new Error(msg);
}

function fail()
{
    error("fail");
}


예시2)

function infinLoop(): never
{
    while(true){}
}


 그렇다면, 타입스크립트에 이미 있는 void 타입과 겹치게 되는데, 이러한 void 타입은 엄밀하게 따지면, 자바스크립트에서는 undefined를 반환을 하지만 never타입은 이 조차 반환 하지 않는다(할 수 없는 상황이다).

자세한 설명은 아래의 영문 블로그에서 확인을 할 수 있다.

블로그(영문) The never Type  링크

만약 지금 이해가 안된다 하더라도 걱정하지 말자. 해당 타입은 특별한 경우에만 사용하기 때문에 예시에 나온 경우에만 적용하면 된다.


참고자료

타입스크립트 공식 홈페이지의 핸드북(Basic Type)



반응형

+ Recent posts