Type은 형(태), 유형, 종류라는 뜻이다.
일반적으로 우리는 타입(유형, 형태)이라는 단어를 어떤 사물이나 개념을 분류하여 묶을 때 사용하게 된다.
대표적인 예시로 MBTI(Myers-Briggs Type Indicator)를 들 수 있다.
MBTI는 사람들의 성격을 외/내향, 감각/직관, 사고/감정, 판단/인식을 활용하여 16가지 타입으로 분류하여 묶는다.
업무 스타일에 따라 사람들을 분류할 수 있다.
물건을 구매하는 방식에 따라 분류할 수도 있다.
🔥 주요한 점은,
여러가지 타입으로 분류될 수 있다는 점이다!
컴퓨터에서 타입을 말할 때 나누는 대상은 사람이 아니라 데이터(자료)이다.
🤔 어떤 데이터(자료)들을 분류할까?
0과1로 이루어진 데이터(자료)들이다.
Data Type은 한글로 자료(Data) 형(Type)으로 변역되고, 풀어보면 자료의 형태가 된다.
컴퓨터는이진법을 사용하기에 모든 데이터(자료)는 0과 1로 이루어져 있다.
이 때 동일한 형태의 0과 1들이 다르게 해석 될 수 있는 여지가 생긴다.
<< 💡 사람이 여러가지 타입에 속하고 다양하게 해석될 수 있는 것과 동일한 것이다.
예를 들면 1000001(2)가 그렇다.
위와 같이 표현된 이진법이 숫자로 해석될 때는 65로, 아스키 코드로 해석될 때는 A로 해석될 수 있다.
그렇기에 우리는 컴퓨터에게 어떤 데이터(자료)의 형을 사용하는 지 명령할 때 알려 주어야 한다.
🤔 어떤 타입인지 알려주어야 한다?
컴퓨터는 전적으로 수동적인 녀석이다.
안 알려 주면 절대 모른다.알려고 하지도 않는다. 안 알려주면 아마 프로그램을 종료 시켜 버릴 것이다. 🙄 읭? 몰라CPU를 실행하기 위해 추상화 되어 있는 ISA(Instruction set architecture) 명령어 세트 아키텍처는
명령어와데이터로 이루어져 있다.즉, 우리는 컴퓨터에 명령어을 통해 일을 시키고, 이 과정에서 어떤 타입의 데이터(자료)들인지 함께 알려주는 것이다.
VAX ISA를 보면 각 명령어에 어떤 타입이 넘어가는 지의 예시를 확인할 수 있다!
✅ 프로그래밍 언어를 만드는 개발자들이 먼저 분류한다.
예를 들면 자바는 String 타입에 null이 포함될 수 있다.
하지만, 코틀린은 String 타입에 null은 포함되지 않는다.
class Main {
public static void main(String[] args) {
String str = null;
System.out.println("str: " + str);
}
}

// kotlin
fun main() {
var str: String = "Hello"
str = null // 오류: null을 허용하지 않음
}

프로그래밍 언어를 만드는 개발자들이 기본적인 타입 분류를 해놓는다.
💡 언어 단에서 제공되는 기본 타입이 아닌 커스텀 타입을 만들고 싶을 때, 우리는 클래스나 인터페이스를 활용한다.
1000001(2)를 고려할 필요가 있을까생각해보면 고급 언어에서 데이터(자료)를 정의하는 예시들은 직관적으로 타입을 알 수 있다.
Int num = 65;
String str = "A"
const num: number = 65;
const str: string = "A";
🎉 고급 언어를 사용하는 우리는 1000001(2)가 문자인지 숫자인지 컴퓨터에게 알려줘야 하는 거 아니야??! 라는 생각할 필요가 없다.
이는 전적으로 컴파일러와 링커의 몫인 것이다.
추상화의 아름다움이다 🙃
🤔 자바스크립트는 타입 지정 안하는데?
아래 코드 예시를 보자.
let obj;
obj.toString();
분명 우리는 obj가 어떤 타입인지 알려주지 않았다.
하지만, 코드를 실행시켜 보면 아래와 같이 TypeError라는 에러가 발생한 것을 볼 수 있다.

🤔 왜 TypeError가 발생할까?
자바스크립트는 대표적인 동적타입 언어(Dynamically typed language)이다.
동적 타입 언어는 실행되는 도중에 타입을 검사하는 언어이다.
즉, 런타임 프로그램이 코드를 읽으며 타입 검사와 동시에 프로그램을 실행시키는 것이다.
1000001가 어떤 타입인지 알려주지 않아도 되는 것과 동일하다 :)