타입(Type)
- 값의 집합과 그 값들에 대한 연산 집합
-> 정수 집합은 값 ( ..., -2, -1, 0, 1, .... )과 연산 ( +, -, *, / 등.. ) 으로 구성됨.
- 컴퓨터의 타입은 값을 저장하기 위한 메모리의 크기가 고정되어있음.
-> 부동소수점 저장 방식같은 경우, 이로 인해 정확한 실수값을 표현할 수 없음. ( 0.2 => 1.999999... )
-> 그래서 0.2*5를 하면 1이지만, 정확한 1이 아닌 0.99999999.... 와 같은 근삿값임.
- 초기의 고급언어(Fortran, Algol, Cobol 등)는 기본 타입만 가졌다.
1. 기계어 수준에서는 타입정보를 가지고 있지 않음.
-> 단순한 비트들의 열임.
- 한 기계어 word에 대해서 정수, 실수, 문자열 등으로 다양하게 해석할 수 있음.
- 타입오류 : 어떤 연산을 해당하지 않는 타입 값에 적용하면 발생하는 오류
-> 고급언어의 경우 컴파일러가 타입 오류를 찾아내도록 설계되어짐.
2. 타입 결정
- 컴파일 시간에 결정되는 정적타입 결정과 실행 시간에 결정되는 동적타입 결정이 있음.
- EBNF에서는 타입 결정을 문법적으로 표현할 수 없음. ( 문맥을 고려해야 하는데, EBNF는 문맥자유 문법 )
- 타입 검사는 컴파일 시간에 하거나, 실행 시간에 하거나, 둘 다 하는 경우도 있음.
-> 둘다 하는 경우는 Java 등에서 하며, 컴파일 시간에는 계층구조에 대한 타입검사가 불가능하기 때문에 한다.
- 컴파일이나 실행 중에 모든 타입오류를 찾아 낼 수 있는 언어를 엄격한 타입(Strongly typed) 언어 라고 한다.
-> C언어 등에 있는 Union 타입이 타입 검사에서 오류를 만들어 내게 된다.
- 동적타입 : 값에 타입을 함께 저장하는 것이다.
3. 기본 타입
- Nibble : 0.5 Byte (4bit)
- Byte : 8bit 등...
- 대부분의 언어에서 숫자 타입은 유한한 크기를 갖는다.
-> a+(b+c) 와 (a+b)+c의 결과가 다를 수 있다.
-> a와 b가 매우 큰 양수이고, c가 음수일 경우, a+(b+c)는 overflow가 발생하지 않고, (a+b)는 overflow가 발생할 수 있기 때문.
- 원래보다 더 적은 수의 비트열로 결과를 생성하는 것을 타입변환을 좁힌다(Narrowing)라고 표현한다.
- 원래보다 더 넓은 수의 비트열로 결과를 생성하는 것은 타입변환을 넓힌다(Widening)라고 표현한다.
-> 타입변환을 좁히는것은 정보의 손실을 일으킬 수 있으므로 권장되지 않는다.
4. 포인터
- 포인터는 메모리 주소를 참조하는 방식이다.
- C언어에서 '&'기호는 변수의 포인터값을 받아오고, '*'기호는 포인트 변수의 값을 가져온다.
&T : T -> ref T (Pointer T)
*T : ref T -> T
- 메모리 참조는 신뢰성있는 소프트웨어의 개발을 방해하고 오류가 생기기 쉽게 한다.
-> 버퍼 넘침, 메모리 누출 등이 발생할 수 있다.
Non-categorical
문자열의 표준
- ASCII, UNICODE(UTF) 등이 있다.
- ASCII는 알파벳 대소문자와 특수기호들을 포함한 8비트 (1byte) 표준이다.
- 유니코드 표준은 UTF-8, UTF-16, UTF-32 등으로 나뉘어지는데, UTF-8은 1~4byte로 표현하고, UTF-16은 2or4byte로 표현한다.
- 유니코드 표준또한 ASCII 코드를 기반으로 그 위에 표현하며, 몇십만개의 문자를 표현할 수 있다.
(JAVA에서는 기본적으로 UTF-16을 사용한다.)
숫자표현
- Signed magnitude : word의 bit-0에 양수면 0, 음수면 1을 표현하는 방식이다.
- 보수 관계 : 2진수에서 0과 1, 10진수에서 6과 4 같이 서로 더하면 10이 되는 수
- 2진수에서 1의 보수는 0과 1을 뒤집은 것이고, 2의 보수는 그 결과에 1을 더하면 된다.
- 2진수로 소수를 표현해보자.
Q. 3.375는 2진수로 어떻게 표현할까?
1. 정수 부분인 3을 2진수로 표현 => 11
2. 소수 부분에 2를 곱하고, 정수부분을 적는다. 이 과정을 반복하는데,
정수 부분이 1이 되면, 1을 적고 -1을 한다. 소수부분이 0이되면 종료.
-> 0.375*2 = 0.75 => 0
-> 0.75*2 = 1.5 => 1
-> 0.5*2 = 1.0 => 1
=> 0.375 = 0.011
3. 정수 부분에 1만 남기고 모두 소수점으로 민다음, 옆에 옆으로 민 만큼 2의 제곱수를 더한다.
-> 11.011 -> 1.1011 * 2^1
4. [양수/음수 표현] [2의 지수 표현] [소수점 부분] 으로 작성한다.
이 때, 2의 지수 부분은 127을 더해서, 음수 최소값(-128)이 00000000, 양수 최대값(127)이 11111111이 된다.
-> 양수 / 1+127 + / 1011
-> 01000000010110000....
구조체(Struct) 표현
- Tuple에 대응하며, 다른 타입의 원소들의 모음이다.
- Cobol 등에서 처음 사용되었으며, Java에서는 class와 중복되는 개념이라 사용되지 않는다.
유니온(Union) 타입
- C, Pascal 등의 언어에서 사용되었으며, 시스템 소프트웨어 개발에 유용하다.
int[][] a[5], b[10]이 있으면, a와 b의 자료형은 같다.
다형성 : 하나의 객체가 여러가지 타입을 가질 수 있는것을 의미하며, 코드의 재사용을 가능하게 한다.
제너릭 : 데이터 타입을 일반화하는 것으로, 내부 데이터 타입을 컴파일 시에 미리 지정한다.
- java에서 <T> <E> 같은것