3-1공부/프로그래밍언어론

5장

KGW2027 2022. 4. 16. 18:31
728x90
반응형

타입(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> 같은것

 

 

728x90
반응형

'3-1공부 > 프로그래밍언어론' 카테고리의 다른 글

기말2] 함수  (0) 2022.06.04
기말1] 의미구조  (0) 2022.06.03
4장  (0) 2022.04.16
3장  (0) 2022.04.16
2장  (0) 2022.04.16