- 강타입과 약타입은 형변환(Type Casting 또는 Type Conversion)을 기준으로 구분된다.
- 강타입 언어는 다른 형끼리의 변환이 금지되어있고, 만약 변환을 하고싶다면 명시적으로 타입을 선언해줘야한다.
(자료형이 맞지 않을 시 에러 발생)- 약타입 언어는 다른 형끼리의 변환이 가능하며, 심지어 암묵적으로 변환을 해주기도 한다.
☑️ 예시
먼저 약타입 언어인 C의 코드를 보면, int
형인 a가 float
형으로 변환 된다.
int a = 1;
float b = 1.3f;
float c = a + b;
강타입 언어인 Go의 코드를 보면, int
형인 a가 float32
형으로 변환되지 않고 컴파일 에러가 발생 된다.
var a int = 1
var b float32 = 1.3
var c float32 = a + b // 컴파일 에러 발생
- 타입의 결정 시점 을 기준으로 구분된다.
- 정적타입 언어는 컴파일 시 타입이 결정된다. 때문에 자료형을 명시적으로 지정해줘야한다.
만약 타입이 맞지 않는다면 컴파일 에러를 발생시킨다.- 동적타입 언어는 런타임 시 타입이 결정된다. 때문에 자료형을 명으로 지정해줄 필요가 없다.
☑️ 장점
정적 타입 | 동적 타입 |
---|---|
컴파일 시 타입 에러를 처리하기 때문에 안정성이 높다. | 코드 작성 시 타입에 대한 제한이 없어 유연성이 높다. |
컴파일 시 미리 타입을 결정해 실행속도가 빠르다. | 코드 작성이 효율적이다. |
☑️ 단점
정적 타입 | 동적 타입 |
---|---|
컴파일 타임에 타입에 대한 제한으로 코드 작성 시 유연함이 떨어진다. | 타입에 대한 리스크를 런타임에 감당해야한다. (코드가 길고 복잡해질 경우 타입 에러를 찾기가 어려워짐) |
데이터 타입에 대한 구분이 엄격한 강타입이자 정적타입의 언어이다.
컴파일 시점에 코드의 타입을 검사해 타입이 맞지 않는 경우 컴파일러가 에러를 발생시킨다.
let a: Int = 1
let b: Float = 1.2
let sum = a + b // Binary operator '+' cannot be applied to operands of type 'Int' and 'Float'
위의 예시를 보면 Int
와 Float
형의 합을 구하려하자
Binary operator '+' cannot be applied to operands of type 'Int' and 'Float'
이라는 에러가 뜬다.
언어별 타입 정리
참고 문서
1. 약타입과 강타입
2. 정적타입 동적타입
3. 정적타입 동적타입2