앞서 Go 언어의 대표적인 특징에서 언급한 것처럼,
Go 언어는 강타입(strongly-typed) 언어이다.
프로그래밍 언어를 배우거나 다루다보면,
강타입/약타입이란 용어가 빈번하게 등장하곤 한다.
본 포스팅 에서는 이 용어가 의미하는 것이 무엇인지,
그리고 Go 언어에서는 이러한 특징이 어떠한 형태로 나타나는지를 알아볼 것이다.
강타입과 약타입
앞 포스팅에서 언급하였듯,
프로그래밍 언어에서 '타입'이란 자료형을 의미한다.
또한 여기에서의 강과 약이란, 자료형의 변환을 기준으로 구분된다.
흔히 Type Casting 또는 Type Conversion이라고 불리는 형변환은
언어를 능숙하게 다루기 위해서 반드시 숙지하여야 할 개념이다.
(구글에 C++을 치면 'C++ int to string'. 'C++ char to string' 등의 연관 검색어가 나오는 이유이다.)
먼저 위키백과를 보자.(원문을 번역한 것이므로, 어색한 어투는 눈감아주자)
"
- 만약 어떤 언어에서 형 선언이 값 혼자가 아닌 변수에 선언되어 있으면 강형 언어이고, 값에만 형이 연결되어 있으면 약형 언어이다. (정확한 용어는 정적 형 선언과 동적 형 선언이다.)
- 만약 어떤 언어가 컴파일 시간에 형 제한 위반에 대한 체크를 한다면 강형 언어이고, 모든 체크가 실행 시간에 이루어지면 약형 언어이다.
- 만약 어떤 언어가 컴파일 시간 또는 실행 시간에 형 제한 위반에 대한 체크를 한다면 강형 언어이고, 아무 체크도 하지 않는다면 약형 언어이다.
- 만약 어떤 언어에서 서로 다른 형 사이의 변환이 금지되어 있으면 강형 언어이고, 그러한 변환이 허용되면 약형 언어이다.
- 만약 어떤 언어에서 서로 다른 형 사이의 변환이 항상 명시적으로 지정되어 있어야 한다면 강형 언어이고, 묵시적인 변환이 허용된다면 약형 언어이다.
- 만약 어떤 언어에서 형 체계를 비활성시키거나 피해 가는 언어 수준에서의 방법이 존재하지 않으면 강형 언어이고, C 스타일의 캐스팅이나 다른 방법들이 존재하면 약형 언어이다.
- 만약 어떤 언어가 복합 형에 대해서 복합적이고 잘 정의된 형 체계를 갖추고 있다면 강형 언어이고, 적은 수의 형이나 스칼라 형만이 존재할 경우 약형 언어이다.
- 만약 어떤 언어에서 어떤 객체의 형이 고정되어 있고 객체의 생존 시간 동안에 변하지 않는다면 (보통 "정적 형 선언"이라 부름) 강형 언어이고, 그 형이 변할 수 있다면 약형 언어이다.
- 만약 어떤 언어의 형 체계가 실행 시간에서의 행동에 대해 강한 보장을 한다면 강형 언어이고, 그러한 보장을 하지 않는다면 약형 언어일 가능성이 높다.
"
강타입 언어의 특징을 위 9개 문항을 보고 정리하자면
컴파일 또는 실행시간에 자료형 위반 관련 체크를 하며,
서로 다른 자료형 사이의 변환이 금지되어 있으며,
서로 다른 자료형으로의 변환을 위해서는 명시적으로 선언되어야 한다
정도가 되겠다.
반대로 약타입 언어의 특징을 강타입과 반대로 정리하자면
자료형 위반 관련 모든 체크가 실행 시간에 이루어지거나 아무 체크도 하지 않으며,
서로 다른 형 사이의 변환이 허용되어 있으며,
묵시적인 자료형 변환이 허용되어 있다
정도가 되겠다.
사용 예시
대표적인 약타입에 속하는 C++를 예로 들자면,
//C++
int num1 = 10;
unsigned int num2 = num1; // int와 unsigned int는 자료형이 같음
long long num3 = num1; // long long이 int보다 크기가 큼
//자동 형변환, 정상 동작
float num1 = 3.56f;
int num2 = num1; // 실수형 값을 정수형 변수에 저장, 값 손실 발생
//컴파일 중 warning이 뜨지만, 정상 동작
이처럼 서로 다른 자료형 변수 간의 묵시적 변환이 이루어지고 있는 것을 확인할 수 있다.
반대로 대표적인 강타입 언어에는, 마성의 Go언어가 있다.
//golang
var num1 int = 17
var num2 float32 = 19.2
var sum1 float32 = num1 + num2 //컴파일 에러 발생(자동 형변환 X)
var num3 float32 = float32(num1) //int를 float32로 명시적 형변환 필요
var sum2 float32 = num3 + num2 //정상 동작
int 자료형인 num1과 float32 자료형인 num2를 더하려 하였더니,
묵시적 형변환이 허용되지 않아 컴파일 에러가 발생한다.
이와 같은 상황에서는, num3처럼 명시적 변환이 필요하다.
이처럼 Go는
서로 다른 자료형으로의 변환을 위해서는 명시적으로 선언해주어야 하는
강 타입(Strongly-typed) 언어임을 반드시 기억하자!
'Language > go lang.' 카테고리의 다른 글
[Go] 고루틴(go-routine) (1) | 2020.09.13 |
---|---|
[Go]GO 가비지 컬렉션(Garbage Collection) (5) | 2020.09.11 |
[Go]Go 언어 정적타입(static type) (0) | 2020.09.07 |
[Go] VSCODE에 Go 환경 설정 (1) | 2020.09.05 |
[Go] 윈도우에서 Go 설치하기 (0) | 2020.09.04 |
댓글