KNOU/프로그래밍언어론

[프로그래밍언어론] 9. 타입

워터파슬리 2022. 11. 1. 23:22
728x90
반응형
프로그램은 다양한 형태의 데이터를 처리
→ 다양한 형태의 데이터를 효율적으로 처리하기 위해서 대부분의 프로그래밍 언어는 타입이라는 개념을 지원

 

1. 타입의 개요

 

✅ 타입

  • 데이터 집합연산 집합의 결합
    1. 데이터 집합
      • 처리 대상이 되는 데이터의 집합
      • 예) 정수형의 데이터 집합 = {..., -2, -1, 0, 1, 2, ...}
    2. 연산 집합
      • 해당 데이터에 적용 가능한 연산의 집합
      • 예) 정수형 연산 집합 = {+, -, *, /, %, ...}
  • 변수의 속성(변수명, 주소, 값, 타입) 중 한 가지
💡 어떤 변수의 타입이 결정되면 해당 변수는 그 타입이 제공하는 데이터 집합과 연산 집합을 사용하여 값을 조작할 수 있음
  • 서브프로그램의 인자와 반환에도 이용
  • 연산의 안전성 보장을 위해 필요
  • 프로그램은 "타입 안전하다(type safe)"라는 표현
    • 프로그램 내 모든 연산 및 함수에 대해 다음 성질을 만족하는 경우 : 함수 f의 타입이 f(x): A(입력타입) → B(출력타입)라면 모든 a ∈ A에 대해 f(a) ∈ B 이어야 함
    • 타입 오류가 발생하지 않는다는 의미

 

 

 

 

🔸타입 안전성에 따른 PL의 분류

  • 강타입(strongly typed) 언어
    • 모든 타입 오류를 검출하는 언어
    • Haskell, ML, Java(타입 캐스팅을 제외하면)
  • 약타입(weakly types) 언어
    • 타입 오류를 검출, 그러나 일부 타입 오류를 허용
    • C → 공용체, 타입 캐스팅을 통해 타입 검사 회피
  • 무타입(typeless) 언어
    • 타입 선언문도 없고 어떤 대상의 타입도 계속 변경 가능
    • Python 등 대부분의 스크립트 언어

 

 

 

 

 

 

 


2. 타입의 분류

 

✅ 타입 분류 기준

  1. 데이터의 형태에 따라
    • 정수형, 실수형, 문자형, 배열, 구조체
  2. 타입 정의에 사용자 개입 여부에 따라
    • 원시타입(primitive type)
    • 사용자정의타입(user-defined type)
  3. 데이터 요소의 형태에 따라
    • 단순타입(simple type)
    • 복합타입(structure type)

 

 

 

 

 

🔸사용자 개입 여부에 따른 분류

  1. 원시타입
    • 프로그래밍 언어에서 기본적으로 제공하는 타입
    • "미리 정의된(predefined) 타입", '내장 타입(built-in type)"
    • 대부분 언어: 정수형, 실수형, 문자형, 논리형 등
      • C, C++: int, float, char 등
      • Java: int, float, char, boolean 등
  2. 사용자정의타입
    • 사용자가 직접 정의해서 사용하는 타입
    • 배열, 구조체 등
      • C: enum, 배열, struct, union 등
      • C++, Java: enum, 배열, class 등

 

 

 

 

 

🔸데이터 요소의 형태에 따른 분류

  1. 단순타입
    • 데이터 집합의 요소가 하나의 데이터로만 구성
    • "스칼라 타입(scalar type)"
      • 정수형, 실수형, 문자형, 논리형, 열거형 등
      • C++: int, float, char, bool, enum 등
  2. 복합타입
    • 데이터 집합의 요소가 데이터들의 구조로 구성 → 단순타입 혹은 다른 복합타입을 활용
    • "구조타입"
    • 배열, 구조체, 클래스 등
      • C: 배열, struct, union 등
      • C++, Java: 배열, class 등

 

 

 

 

 

 

 


3. 단순타입

 

✅정수형: 정수 데이터를 다루는 타입

 

🔸데이터 집합 

  • {-∞, ..., -2, -1, 0, 1, 2, ..., +∞} 중 일부만 표현
    • 정수 표현을 위해 할당된 메모리의 크기에 의존
  • 표현 가능한 정수 범위에 따라 다양한 타입이 존재
    • C, C++: short, int, long, long long, unsigned short 등
    • Java: byte, short, int, long 

 

C, C++ 정수형
타입명 최소 사용 비트 최소 데이터 집합 범위
short 16 -2^15 ~ (2^15) -1
(-32768 ~ 32767) 
int  16 -2^15 ~ (2^15) -1
long  32 -2^31 ~ (2^31) -1
(약 -21억 ~ 약 21억)
long long  64 -2^63 ~ (2^63) -1
unsigned short  16 0 ~ (2^16) -1
(0 ~ 65535)
unsigned int 16 0 ~ (2^16) -1
unsigned long  32 0 ~ (2^32) -1
unsigned long long 64 0 ~ (2^64) -1
  • signed(부호있는 정수): 주어진 비트 중 맨 왼쪽 첫번째 비트를 부호 비트로 사용
  • unsigned(부호없는 정수): 주어진 비트 모두를 사용(= 0과 양의 정수만 나타낼 수 있음, 음수 표현 불가)

 

 

Java 정수형
타입명 사용 비트 데이터 집합 범위
byte 8 -2^7 ~ (2^7)-1
short 16 -2^15 ~ (2^15)-1
int 32 -2^31 ~ (2^31)-1
long 64 -2^63 ~ (2^63)-1
  • 각 타입의 사용 비트가 고정됨
  • unsigned가 붙는 정수형이 없음

 

 

 

 

 

🔸연산 집합

  1. 사칙연산: 덧셈, 뺄셈, 곱셈, 나눗셈 → 연산 결과 값도 정수형 (예: 10/3 = 3)
    • C, C++ 에서 16 비트로 구현된 short(-32768 ~ 32767)타입의 경우
      • 32767+1 == 최대값+1 → 최소값(-32768)
      • -32768-1 == 최소값-1 → 최대값(32767)
      • 특정 타입의 데이터를 가지고 연산을 하면 그 연산의 결과도 항상 해당 데이터 집합 안에 존재해야 됨!
  2. 나머지 연산: mod, % (예: 7 mod 3 = 1)
  3. 비트 연산: ^, &, | 등
  4. 관계 연산: <, >, <=, >=, == != 등 → 연산의 결과 값은 논리형

 

 

 

 

 

✅ 실수형: 실수 데이터를 다루는 타입

 

🔸데이터 집합

  • -100.05, -8.7, 0.0, 1.234, 256.3500187  등
  • 전체 실수 중 사용 비트의 크기에 따라 일부 범위의 실수만 표현 가능
  • 일반적으로 부동소수점 수(floating-point number) 로 표현

 

 

 

📌 부동소수점 수

출처: 방송통신대학교

  • 부호: 양수 = 0, 음수 = 1
  • 지수부: 지수 + bias
    • bias는 지수부의 크기에 따라 결정됨
    • (2^m-1)-1
  • 가수부: 소수점 이하 부분만 표현
    • 가수부는 1.xxxx 형태를 갖도록 정규화를 거침

 

💡정수 5 vs 실수 5.0

short a = 5; //0 0000000000000101
float b = 5.0; //0 101 0100000000000000000

 

 

 

🔸연산 집합

  • 사칙연산: 덧셈, 뺄셈, 곱셈, 나눗셈 → 연산 결과 값도 동일한 실수형 (예: 1.5 + 2.5 = 4.0)
    • float의 경우, 5E37*10.0 == 최대값 초과 → 무한대 inf
  • 관계 연산: <, >, <=, >=, ==, != 등 → 연산 결과 값은 논리형

 

 

 

 

 

✅ 문자형: 하나의 문자 데이터를 다루는 타입 ('A', 'a'...)

 

🔸데이터 집합

  • ASCII: 특수기호, 구두점, 숫자, 영어 대소문자 등 128개의 문자로 구성
    • C, C++: char == 8비트
  • 유니코드: 전 세계의 다양한 문자 표현 가능
    • Java: char == 16비트

 

 

 

🔸연산 집합

  • 관계 연산: 연산의 결과 값은 논리형
    • 'A' < 'B' == true
  • C, C++는 char 타입을 8비트 정수형으로 간주 → 사칙연산, 비트연산 등 가능
    • 'A' + 32 == 65+32 → 97 == 'a'
    • 'a' - 32 == 97-32 → 65 == 'A'

 

 

 

 

 

✅ 논리형: 참과 거짓의 논리 데이터를 다루는 타입

 

🔸데이터 집합

  • true(참), false(거짓)
    • C: _Bool = {0, 1}
    • C++: bool = {true, false}
    • Java: boolean = {true, false}

 

 

 

🔸연산 집합

  • 논리곱(and), 논리합(or), 논리부정(not) 등
    • 연산 결과 값도 동일한 논리형 → ture && false == false

 

 

 

 

 

✅ 열거형: 순서 관계가 있는 이름들을 데이터로 다루는 타입

 

🔸데이터 집합

  • 사용자가 직접 지정한 이름들
  • 각 이름은 0이상의 정수와 대응 → 순서 관계 성립
    • 예) C, C++ enum 타입
/*
열두 달의 이름
개발자 입장에서는 이름을 사용했지만 컴퓨터 내부에서는 나열된 순서대로 이름마다 숫자를 대응

enum Year {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
*/
enum Year {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};

//각 이름에 대응되는 정수도 사용자가 지정 가능
enum Year {Jan=1, Feb, Mar, Apr=10, May=15, Jun=1, Jul, Aug, Sep, Oct, Nov, Dec};

 

 

 

🔸연산 집합

  • 관계 연산: 연산 결과 값은 논리형
    • C: 대응되는 정수 값에 대한 사칙연산도 가능
#include <stdio.h>
int main()
{
	enum Year {Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec};
    enum Year Go;
    for(Go=Jan; Go<=Dec; Go++)
    	printf("%d\n", Go);	// 출력: 0 1 2 3 4 5 6 7 8 9 10 11
	return 0;
}

 

 

 

728x90
반응형