사전 데이터 타입
개념

데이터 타입

gabury1고친 사람 github-actions[bot]

데이터 타입은 값마다 종류를 정해서 그 값으로 할 수 있는 일을 가려 줍니다. 숫자끼리는 더할 수 있지만 글자에서 날짜를 빼는 일은 막힙니다. 종류를 알면 컴퓨터는 그 값을 메모리에 어떻게 적고 어떻게 읽을지도 압니다. 프로그래밍 언어는 변수에, 데이터베이스는 열에 이 종류를 붙입니다.

쉽고 빠른 이해

데이터 타입은 값에 붙이는 「이건 정수」「이건 글자」 같은 딱지입니다. 회원 테이블의 나이 열에 정수 딱지를 붙이면 그 열에는 숫자만 들어갑니다.

메모리에는 0과 1만 있어서 같은 비트 묶음이 숫자로도 글자로도 읽힙니다. 딱지가 없으면 어떻게 읽을지 모릅니다. 글자에 숫자를 더하는 실수도 못 막습니다.

어떻게 도나:

  1. 변수 · 열 · 값에 종류가 붙습니다
  2. 값을 넣거나 계산할 때 종류가 맞는지 확인합니다. 실행 전에 확인하는 언어와 실행 중에 확인하는 언어가 있습니다
  3. 종류에 맞는 방식으로 값을 읽고 계산합니다

종류를 코드에 미리 적어 두면 실행 전에 실수를 잡습니다. 대신 적는 손이 더 갑니다. 데이터베이스 열처럼 값이 쌓이는 곳은 한번 정한 종류를 나중에 바꾸기도 어렵습니다.

종류를 적지 않고 실행 중에 확인하면 손이 덜 갑니다. 대신 실수는 그 줄을 실행할 때에야 드러납니다.

상세

종이에 「12」라고만 적힌 쪽지가 있다고 해 봅시다. 달력 옆에 붙어 있으면 12월로 읽습니다. 줄자 옆에 붙어 있으면 12센티미터로 읽습니다. 여기에 3을 더하면 달력에서는 3월이 됩니다. 줄자에서는 15센티미터가 됩니다.

달력과 줄자처럼 값을 어떻게 읽을지 정해 주는 것이 데이터 타입입니다. 컴퓨터에서는 값마다 이런 종류가 하나씩 붙습니다.

종류 하나는 두 가지를 함께 정합니다. 그 종류에 어떤 값이 들어올 수 있는지, 그리고 그 값으로 무엇을 할 수 있는지입니다. 정수 타입에는 -3 · 0 · 42 같은 값이 들어옵니다. 이 값으로는 더하기와 크기 비교를 할 수 있습니다.

이 절은 먼저 타입이 왜 필요한지를 메모리의 바이트 하나로 봅니다. 이어서 자주 쓰는 타입과 그 한계, 타입을 검사하는 시점, 데이터베이스 열의 타입, 값이 시스템 사이를 옮겨 갈 때 생기는 일을 차례로 봅니다. 예는 자바와 파이썬 코드, 그리고 데이터베이스에 보내는 명령문입니다.

같은 비트를 읽는 두 방법

메모리에는 0과 1만 저장됩니다. 0 또는 1 하나를 비트라고 합니다. 비트 여덟 개를 묶은 단위는 바이트입니다. 메모리 어딘가에 01000001 이라는 바이트가 있다고 해 봅시다.

이 바이트를 정수로 읽으면 65입니다. 글자로 읽으면 대문자 A 입니다. 글자마다 번호를 매긴 표가 65번에 A 를 두었기 때문입니다. 이 표의 이름은 ASCII(American Standard Code for Information Interchange, 미국 정보 교환 표준 부호)입니다.

비트만 봐서는 둘 중 무엇인지 알 수 없습니다. 그래서 값에는 「이 비트를 어떻게 읽어라」라는 딱지가 따라다녀야 합니다. 그 딱지가 데이터 타입입니다. 타입을 알면 읽는 방법이 정해집니다. 더하기 같은 계산도 그 타입에 맞게 이루어집니다.

자바에서 int 는 정수 하나, char 는 글자 하나를 담는 타입입니다. 아래 코드는 같은 65를 두 타입으로 다룹니다.

Java
int n = 65;
char c = (char) n;          // 'A'
System.out.println(n + 1);  // 66
System.out.println(c);      // A

int 로 둔 65는 숫자로 계산됩니다. char 로 바꾼 65는 글자로 찍힙니다. (char) 처럼 값을 다른 타입으로 바꾸라고 적는 것을 형 변환이라고 부릅니다.

자주 쓰는 타입

언어와 데이터베이스마다 타입 이름은 다릅니다. 그래도 거의 모든 곳에 있는 타입은 몇 가지로 추려집니다. 아래 표는 그 종류와 각 종류로 할 수 있는 일을 모았습니다.

타입 담는 값 할 수 있는 일
정수 -3 · 0 · 42 사칙 연산 · 크기 비교
부동소수점 수 3.14 · -0.5 근삿값으로 하는 사칙 연산
십진 소수 19.99 같은 금액 소수점 아래를 잃지 않는 계산
불리언 참 · 거짓 조건 판단 · 그리고 · 또는
문자열 "hello" · "서른" 이어 붙이기 · 길이 재기 · 자르기
날짜와 시각 2026-09-24 두 날짜 사이의 간격 · 며칠 뒤 계산

부동소수점 수와 십진 소수가 어떻게 다른지는 아래 「소수를 담는 두 방식」에서 봅니다.

정수나 불리언처럼 언어가 처음부터 갖추고 더 쪼개지 않는 타입을 기본 타입이라고 부릅니다. 자바의 int · char · boolean 이 기본 타입입니다.

기본 타입 하나로는 회원처럼 여러 값이 모인 것을 한 번에 다룰 수 없습니다. 그래서 기본 타입을 묶어 새 타입을 만듭니다. 이름 문자열과 나이 정수를 「회원」 하나로 묶는 식입니다. 이렇게 이름 붙은 값 여러 개를 한데 묶은 타입이 구조체입니다.

타입이 정하는 범위

타입마다 담을 수 있는 값의 범위가 있습니다. 값 하나를 적는 데 쓰는 비트 수가 타입마다 정해져 있기 때문입니다. 부호가 있는 32비트 정수 타입은 대략 음수 21억에서 양수 21억 사이만 담습니다.

범위를 넘는 값은 담을 수 없습니다. 계산 결과가 이 범위를 넘는 일이 정수 오버플로입니다. 넘친 값을 어떻게 다루는지는 언어마다 다릅니다.

자바의 int 가 32비트 정수입니다. 자바는 넘쳐도 오류를 내지 않습니다. 값이 반대쪽 끝으로 넘어갑니다.

Java
int big = Integer.MAX_VALUE; // 2147483647
int next = big + 1;          // -2147483648

가장 큰 값에 1을 더했더니 가장 작은 음수가 나왔습니다. 오류가 나지 않아서 알아채기 어렵습니다. 주문 수량 합계처럼 계속 커지는 값에서 이런 일이 생기면 틀린 숫자가 조용히 저장됩니다.

소수를 담는 두 방식

컴퓨터가 소수를 담는 가장 흔한 방식이 부동소수점입니다. 부동소수점은 수를 2진수로 적습니다. 그런데 10진수 0.1 은 2진수로 적으면 끝나지 않습니다. 그래서 가장 가까운 근삿값이 저장되고 작은 오차가 생깁니다.

Python
0.1 + 0.2          # 0.30000000000000004
0.1 + 0.2 == 0.3   # False

0.1 과 0.2 의 오차가 더해지면서 0.3 과 다른 값이 나왔습니다. 좌표나 물리량을 다루는 계산에서는 이 정도 오차를 감수합니다. 금액은 다릅니다. 1원이 어긋나도 장부가 맞지 않습니다.

그래서 금액에는 10진수 숫자를 손대지 않고 보관하는 십진 소수 타입을 씁니다. 자바의 BigDecimal, 데이터베이스의 DECIMAL 과 NUMERIC 이 그런 타입입니다. 대가는 계산이 부동소수점보다 오래 걸리고 메모리를 더 쓴다는 것입니다.

타입을 검사하는 시점

타입이 맞지 않는 계산을 언제 막느냐는 언어마다 다릅니다. 프로그램을 실행하기 전에 막는 언어가 있습니다. 실행하는 도중에 막는 언어도 있습니다. 타입을 붙이고 검사하는 규칙 전체를 그 언어의 타입 시스템이라고 부릅니다.

실행하기 전에 검사하는 쪽을 정적 타입 언어라고 합니다. 자바가 그렇습니다. 검사는 소스 코드를 실행할 수 있는 형태로 바꾸는 프로그램인 컴파일러가 맡습니다.

컴파일러는 이름마다 타입을 표에 적어 둡니다. 이 표가 심볼 테이블입니다. 대입이나 함수 호출을 만날 때마다 컴파일러는 이 표와 맞춰 봅니다.

Java
int age = "서른";   // 컴파일 오류

age 는 정수 변수인데 문자열을 넣으려 했습니다. 컴파일러가 이 줄을 거절해서 프로그램이 아예 만들어지지 않습니다.

실행하는 도중에 검사하는 쪽이 동적 타입 언어입니다. 파이썬이 그렇습니다. 변수에는 타입이 없습니다. 변수가 가리키는 값에만 타입이 붙습니다. 계산을 하는 순간 두 값의 타입을 봅니다. 맞지 않으면 그때 오류를 냅니다.

Python
age = "서른"
age + 1        # TypeError

첫 줄은 문제없이 지나갑니다. 둘째 줄에 도착해서야 문자열에 정수를 더할 수 없다는 오류가 납니다. 이 줄을 지나지 않는 실행에서는 오류가 끝내 드러나지 않습니다.

아래 그림은 두 방식이 타입 오류를 어느 단계에서 잡는지 보여 줍니다.

flowchart TD
    subgraph ST["정적 타입 언어"]
        S1["소스 코드"] --> S2["컴파일러가 타입 검사"]
        S2 -->|맞지 않으면| S3["프로그램이 만들어지지 않는다"]
        S2 -->|맞으면| S4["실행"]
    end
    subgraph DY["동적 타입 언어"]
        D1["소스 코드"] --> D2["실행"]
        D2 --> D3["그 줄에 도착해 타입 검사"]
        D3 -->|맞지 않으면| D4["실행 중 오류"]
        D3 -->|맞으면| D5["다음 줄 계속 실행"]
    end
    S4 ~~~ D1

검사 시점이 다르면 개발자가 치르는 비용도 달라집니다. 아래 표가 그 차이입니다.

정적 타입 동적 타입
타입이 붙는 곳 변수와 값 값
코드에 적는 것 변수마다 타입 적지 않는다
타입을 바꿀 때 컴파일러가 고칠 줄을 모두 짚어 준다 고칠 줄을 사람이 찾거나 테스트로 잡는다

정적 타입은 적는 손이 더 가는 대신 타입을 바꿀 때 컴파일러의 도움을 받습니다. 동적 타입은 적을 것이 적은 대신 그 확인을 사람과 테스트가 맡습니다.

정적 타입 언어에서도 타입을 매번 적지 않아도 되는 경우가 있습니다. 컴파일러가 값을 보고 타입을 알아내기 때문입니다. 이 기능이 타입 추론입니다. 자바에서 var n = 65; 라고 쓰면 n 은 int 가 됩니다.

데이터베이스 열의 타입

관계형 데이터베이스도 값에 타입을 붙입니다. 붙이는 곳은 테이블의 열입니다. 테이블을 만들 때 열마다 타입을 적습니다. 그 열에 들어오는 값은 모두 그 타입이어야 합니다.

아래는 데이터베이스에 보내는 명령 언어인 SQL(Structured Query Language, 구조화 질의 언어)로 적은 예입니다.

SQL
CREATE TABLE member (
  name VARCHAR(50),
  age  INTEGER
);
INSERT INTO member VALUES ('김', '서른'); -- 오류

VARCHAR(50) 은 50글자까지 받는 문자열 타입입니다. INTEGER 는 정수 타입입니다. age 열에 '서른' 을 넣으려는 둘째 명령은 거절됩니다.

열 타입을 얼마나 엄격하게 지키는지는 데이터베이스 제품마다 다릅니다. 같은 명령을 거절하지 않는 제품도 있습니다. 그런 제품은 '서른' 을 문자열인 채로 두거나 0 같은 다른 값으로 바꿔 넣습니다.

열에 타입을 두면 잘못된 값이 들어오는 순간 막힙니다. 이 테이블에 쓰는 프로그램이 여럿이어도 모두 같은 검사를 거칩니다. 어떤 열이 있고 각 열이 무슨 타입인지 적은 설계도가 스키마입니다.

대가는 바꾸기 어렵다는 것입니다. 열 타입을 바꾸면 이미 쌓인 행을 모두 새 타입으로 바꿔 적어야 할 수 있습니다. 행이 많으면 이 작업이 오래 걸립니다. 바꿀 수 없는 값이 섞여 있으면 작업이 멈춥니다.

값이 시스템 사이를 옮겨 갈 때

값은 한 시스템 안에만 머물지 않습니다. 데이터베이스에서 읽은 값이 자바 변수에 담깁니다. 그 값이 다시 응답에 실려 브라우저로 갑니다. 거치는 곳마다 갖춘 타입이 달라서 경계마다 타입을 맞춰 줘야 합니다.

첫 경계는 데이터베이스와 자바 사이입니다. 열의 값을 알맞은 자바 타입의 변수로 옮겨 담아야 합니다. INTEGER 열의 값은 int 변수로, VARCHAR 열의 값은 String 변수로 가는 식입니다. 이 짝짓기는 ORM(Object-Relational Mapping, 객체-관계 매핑) 같은 도구가 맡습니다.

둘째 경계는 자바와 브라우저 사이입니다. 이 경계에서는 JSON(JavaScript Object Notation, 자바스크립트 객체 표기법)이 흔히 쓰이는 형식입니다. JSON 이 아는 타입은 문자열 · 숫자 · 불리언 · 널 · 배열 · 객체 여섯 가지뿐입니다. 널은 값이 없다는 표시입니다. 날짜 타입이 없어서 날짜는 "2026-09-24" 같은 문자열로 바뀌어 실립니다.

받는 쪽은 이 문자열이 날짜라는 것을 따로 알고 있어야 날짜로 되돌릴 수 있습니다. 숫자도 비슷합니다. JSON 숫자는 정수와 소수를 가르지 않습니다. 자바스크립트는 JSON 숫자를 모두 부동소수점으로 읽습니다.

부동소수점 수는 유효 숫자를 정해진 개수만큼만 담습니다. 그보다 긴 정수는 끝자리가 반올림됩니다. 자바스크립트의 부동소수점 수는 2의 53제곱(약 9천조)까지의 정수만 빠짐없이 담습니다. 그보다 큰 주문 번호를 JSON 숫자로 보내면 받는 쪽에서 끝자리가 틀어질 수 있습니다.

값을 이렇게 바깥으로 내보낼 형태로 바꾸는 일이 직렬화입니다. 자바의 날짜 값을 "2026-09-24" 문자열로 바꿔 JSON 에 싣는 것이 그 예입니다.

관련 항목

데이터 타입이 붙는 대상

변수 · 열 · 필드 · 값 · 리터럴 · 매개변수 · 반환값

데이터 타입의 하위 종류

기본 타입 · 참조 타입 · 정수 · 부동소수점 · 십진 소수 · 불리언 · 문자 · 문자열 · 배열 · 구조체 · 클래스 · 열거형

타입을 붙이고 검사하는 규칙

타입 시스템 · 정적 타입 · 동적 타입 · 타입 검사 · 타입 추론 · 제네릭 · 타입 안전성

타입 정보를 쥐고 검사하는 도구

컴파일러 · 인터프리터 · 심볼 테이블 · 런타임

타입 때문에 나는 오류

타입 오류 · 정수 오버플로 · 부동소수점 오차 · 널 포인터 역참조

값을 다른 타입으로 옮기는 변환

형 변환 · 직렬화 · 역직렬화 · 파싱 · JSON · ORM

열 타입과 함께 테이블을 정의하는 요소

스키마 · 관계형 데이터베이스 · SQL · 제약 조건 · 널 · 기본값 · 도메인

데이터 타입과 헷갈리는 이웃 개념

추상 자료형 · 자료구조 · 미디어 타입 · 데이터 모델

다른 이름: data type · datatype · data types · 자료형 · 타입