3.1 자료형(Data Type)
Set과 List의 차이를 아는가? 그렇다. Set은 말그대로, 수학적 집합으로, 중복을 허용치 않으며, 순서는 상관없다. 반대로, List는 순서도 중요하며, 동시에 중복도 가능하다.
한편, List라고 다 같은 List일까? 그것도 아니다. List가 무조건 같은 Type의 요소만 가져야할 수 있고, 또 반면에 그렇지 않은 List도 있다.
다른 이야기를 해보자. 대부분의 프로그래밍 언어는 Von-Neumann Computing Model을 기초로 한다고 했다. 폰-노이만 모델 내에는 CPU와 메인 메모리, 그리고 보조 메모리가 있다. 그리고 CPU 안에는 ALU가 있다. ALU는 사칙연산과 논리연산을 제공하고, 입출력은 단순히 숫자만 받는다.
또한, HW와 가까운 언어인 어셈블리어를 보면, 다양한 자료형이나 그런것이 없다. 배열? 구조체? 직접 만들지 않고선, 미리 제공되는 것은 없다.
왜 High-Level Language에는 다양한 자료형이 있을까?
지난 Chapter2 포스팅에서, HLL가 현재의 모습을 갖춘 이유는 다음과 같다고 했다
1) 폰-노이만 구조
2) 프로그래밍 방법론
여기에 한 가지 더 추가하자면, "프로그램의 용도(Application)"가 들어가야한다.
프로그래밍 언어의 발전사는 "용도에 맞는 필요한 기능들을 만들어가는 과정"이라고 볼 수 있다.
HLL의 다양한 자료형도 모두 그러한 이유에서 고안된 것이다. HW에선 그 어떠한 자료형도 미리 제공해주질 않는다. 숫자나 문자 빼고는 말이다. 결국 HLL에서 이를 고안해 우리에게 제공하여 우리가 용도에 맞게 프로그래밍을 할 수 있는 것이다.
“Computer programs produces results by manipulating data. An important factor in determining the ease with which they can perform this task is how well the data types matches the real-world problem space”
Introduction
Data Type : Collection of Data Values
자료형이란, 가질 수 있는 값들의 집합이다.
그 값들에 허용되는 Predefined 연산들의 집합이기도 하다.
- 프로그래밍 언어가 '내가 해결하고자 하는 문제'에 적합한 자료형을 잘 제공하느냐의 문제는, 프로그래밍의 난이도를 결정하는 가장 큰 요소 중 하나이다.
- 예를 들어, Assembly Language로 Matrix를 다루는 프로그램을 만든다고 해보자. 프로그래머가 일일이 다 인덱싱하고 따져야할 것이다. 반면에, MATLAB을 사용한다고 해보자. 그냥 변수 하나로 간단하게 처리할 수 있다.
-
간략한 '자료형의 발전사' (초기 HLL의 발전, 외우지 말 것)
-
90년대 이전의 FORTRAN
- FORTRAN은 목적 자체가 과학 수식 계산이다. 따라서 Record(구조체) Data Type에 대한 필요성이 낮았고, 그에 따라 Linked List나 Binary Tree를 오로지 배열로만 구현해야했다. 힘들었다.
-
COBOL
- 처음으로 Record 자료형이 도입되었다.
-
PL/I
- PL/I는 통합형 언어가 그 목적이었다. 따라서 당시 기준에서 가장 많은 자료형을 가진 언어였다.
-
ALGOL
- 사용자 정의 자료형 기능을 도입했다. 즉, Flexibility를 높인 것이다.
-
Ada
- Abstract Data Type 개념이 도입되기 시작했다.
-
Primitive Data Type
Primitive Data Type : 다른 Type에 의해 정의되지 않은 Data Type
해당 자료형의 표현과 연산을 하드웨어가 직접적으로 지원하는 자료형
-
Array Data Type의 경우, Array를 위해 따로 Hardware가 존재하는가? : Nope
- Array는 Primitive Data Type이 아니다.
-
Numeric(Integer + Decimal + Floating Point), Boolean, Character(Not String)가 바로 Primitive Data Type에 해당한다.
- 이들은, 다른 Data Type을 구성하는데에 재료로서 쓰인다.
Numeric Type
Integer
-
가장 대표적인 Primitive Numeric Data Type이다.
-
컴퓨터 CPU는 다양한 사이즈의 Integer를 지원한다.
- Byte, Word, Long Word, Quadword 등
- 이에 따라, C나 Java에서 char, short, int, long 등의 자료형이 생긴 것이다.
- Byte, Word, Long Word, Quadword 등
-
Word Size : 이미 이전 Chapter에서 언급했듯이, CPU 사이즈에 따라 Word Size도 달라진다.
- 16Bit CPU 컴퓨터 : Word = 16Bits = 4Bytes
- 32Bit CPU 컴퓨터 : Word = 32Bits = 8Bytes
- 64Bit CPU 컴퓨터 : 대부분은 Word를 16Bits로 함. ★
int a = 3;
/* 32Bit CPU Computer 기준. int == signed int
0 0000000 00000000 00000000 00000011 (맨 앞은 Sign Bit)
~> Word Size만큼 저장했다. 대부분의 32비트 CPU는 Word=16bits
~> int형의 범위 : -2^31 ~ (2^31 - 1) */
- 위와 같이, Signed Integer의 경우, Leftmost Bit(Most Significant Bit, MSB)를 Sign Bit로 둔다.
- 알다시피, 2's Complement 기법을 사용해 음수 표현을 한다.
Floating-Point
부동소수점(Floating-Point) 방식은 실수 Real Number를 표현한다. 그런데, 학부 아키텍쳐나 회로개론 수업에서 배웠듯이, 이들은 '근사값(Approximation)'을 취한다.
- 부동소수점 방식은, 과학적 표기법이다.
- 과학적 표기법 ex) 32.56 = 0.3256 x 10^2
Floating Point Data Type은 대부분의 HLL에 존재하지만, 의외로, 특정 프로세서에는 FPU가 없는 경우가 있다.
~> 만약, CPU가 ALU만 가지고 있다면, 실수 연산을 소프트웨어적으로 해결해야한다. 즉, 특정 라이브러리를 이용해 부동소수점 연산을 위한 특정 알고리즘들을 적용해야한다.
=> 그런데, 이렇게 하면 아무래도 하드웨어와 직접 소통하는 FPU에 비해 훨씬 속도가 느리다.
--> ARM Processor는 대부분 ALU만 가지고 있다. ARM 프로세서는 스마트폰에 많이 들어가는데, 그래서 스마트폰이 컴퓨터에 비해 게임 수행이 느린 것이다.
-
IEEE Floating-Point Standard 754 Format (IEEE 754)
Fraction x 2^(exponent - bias)
-
Sign Bit는 Fraction의 Sign을 표시한다.
-
Exponent는 'Excess Notation' 방식을 취한다.
- Excess Notation : Bias를 더하는 것. 더 넓은 지수 범위를 표현하기 위함임.
-
Single Precision과 Double Precision 방식이 있다. (국문: 단정도, 배정도)
-
ex) 7.25를 단정도 표기법으로 나타내보자.
=> 7.25 = 111.01 (Decimal to Binary)
=> 111.01 = 1.1101 x 2^2 (Left Shift 2번!)
=> 1.1101의 1101이 Mantissa(Fraction)
=> 2^2에서 Exponent-Bias가 2이다. 단정도이므로 Bias는 127이고, 따라서 Exponent는 129
=> 129는 2진수로 10000001이다.
=> 부호는 양수이므로 Sign Bit는 0이다.
~> 답안 : 0 10000001 11010000000000000000000
※ 부동소수점 표기가 위의 예시처럼 항상 딱 나누어 떨어지는 것은 아니다. 아니, 오히려 안나누어 떨어질 때가 훨씬 많다.
ex) 10진수 0.1을 2진수로 표기해보자. 회로개론 수업 때 배운, '2배 방식'을 이용해보자.
0.1 (시작)
____________________
0.2 0
0.4 0
0.8 0
1.6 1
1.2 1
0.4 0
0.8 0
1.6 1
1.2 1
...
~> 10진수 0.1은 2진수로 0.0001100110011...이 반복된다. 이것이 맞아떨어지게 특정 기준에 의거해, 2진수 표기법에서 '몇 번째 자리에서 끊음'을 하면, 근사값을 정할 수 있게 된다.
컴퓨터는 2진수만 알아듣고, 2진수의 소수 표현에는 한계가 있기 때문에, 우리는 '근사값'을 택하는 것이다.
여담) 10진수 0.1의 근사값은 10진수로 0.100000001490116119384765625이다.
(추후 더 업데이트)
Author And Source
이 문제에 관하여(3.1 자료형(Data Type)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@junttang/PL-3.1-자료형Data-Type저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)