"프로그래밍언어개론" 5주차 정리
기본 데이터 타입
?데이터 타입이란?
: 비슷한 종류의 데이터 개체들과 그 개체들을 가지고 수행할 수 있는 연산들의 집합
하나의 데이터 타입은 다른 데이터 타입을 사용해서 복잡하게 정의될 수 있다.
데이터 타입의 목적
- 실제 세계의 대상들을 표현
- 공간을 효과적으로 쓸 수 있도록 해준다. (컴파일러가 적절한 크기의 메모리를 할당)
- 타입 검사로 오류를 사전에 알려준다. (type checking)
1) 기본 데이터 타입
ex) 정수, 실수, 참거짓, 문자
다른 데이터 타입을 사용하지 않고도 스스로 정의되는 데이터 타입
1. 정수 Integer type
- 컴퓨터 HW에서 직접 지원된다.
- 한 언어 내에서도 서로 다른 여러가지 정수 타입을 가질 수 있다.
(int, signed integer, unsigned integer)
2. 실수 Floating Point Type
- 수학적 실수는 오직 근사치로만 표현 가능
- 표현방법은 부동 소수점
3. 십진수 Decimal Type
- 근사치가 아니라 정확한 표현이 꼭 필요할 때 사용하는 타입
- 고정된 개수의 십진수를 저장, 소수점 위치도 고정
- 정확성이라는 장점을 갖지만 메모리 낭비, 표현 가능한 수의 제한의 단점이 있다.
4. 참거짓 Boolean Type
- 조건 검사 등 프로그램에서 많이 사용된다.
- 주로 1Byte 로 표현된다. (1bit만 필요하지만 저장, 사용의 편의를 위해 1Byte)
- 대부분의 언어에서 별도의 데이터 타입을 가지지만 그렇지 않은 경우도 있다.
- C. C++은 정수 타입을 빌ㄹ서 사용한다.
5. 문자 타입 Character Type
- 문자 한글자가 코드가 되어 사용
- ASCII(8bit)
- Unicode(Java, C#)
- 완성형한글(KS5601)
2) 유도된 데이터 타입
순서타입(enumeration), 배열(array), 레코드(record), 유니온(union), 포인터(pointer) ....
문자열 타입 String Type
- 문자들의 열을 나타냄 (char형에서 유도된 것 같다.)
- 문자열 타입은 언어마다 나타 내는 방법이 다르다.
1) Ada, FORTRAN : 문자열 타입이 기본타입
2) C : 문자열 타입이 일련의 문자 타입으로 구성된다. Char*
3) Java : 또 다른 방법으로 문자열 타입이 구성된다. String/StringBuffer
문자열 길이
1) 고정길이 FORTRAN, ADA, COBOL
2) 제한적 가변 길이 C, C++
3) 가변길이 SNOBOL4, Perl, JavaScript
실제 사용되는 양을 알고 있으므로 메모리 사용이 효율적이다.
대신 수행시간이 길어지고 실행효율이 좋지 않다. overhead가 있다.
문자열 연산은 Assignment, 비교(=, >..), 붙이기, 부문자열 추출, 패턴매칭.. 가능하다.
User-Defined Ordinal타입 = 사용자 정의 순서 타입
- 그 값들이 자연수에 대응시킬 수 있을 때 사용한다.
- Enumeration 타입 (열거 타입), Subrange 타입 (부분 범위 타입)
- 가독성 향상, Type Checking으로 런타임 오류 방지
- 만약 요일을 표현할 때 그냥 정수로 표현하면 요일인지, 숫자인지 구별이 불가
Enumeration 타입 (열거 타입)
- 모든 값들을 열거하여 타입을 정의한다. (대부분 그 값들은 상수들)
- 초기 값을 주지 않으면 0부터 시작한다.
논점
수치값과 enumeration 타입 간의 자유로운 변환 허용??
PASCAL - input/output에는 사용 못됨, 상수 재사용 안됨
Ada - 상수 재사용 가능 (상황으로 타입 판단함)
C/C++ - PASCAL과 동일. input/output에는 정수로 변환되어 사용
Java/C# - C/ C++과 동일하며, Enumeration 타입 정의에 사용가능한 연산들이 추가될 수 있다.
Subrange 타입
- 수의 연속적인 범위를 타입으로 지정할 수 있도록 함
- for문, 배열 인덱스 등 범위 검사가 중요한 곳에 사용된다. (PASCAL, Ada)
- 장점 : 가독성, 신뢰성 등 향상
- 어떤 변수가 절대 음수면 안될 때 Subrange 타입을 사용하면 신뢰성이 높다.
- 정수 타입 등 상위 타입과 동일하게 처맇면서 동시에 범위 검사를 위한 코드를 삽입하여 구현한다.
- 논점: 꼭 데이터 타입 형태로 지원해야 하는가? 대부분의 언어가 요즘은 제공하지 않음
배열
- 동일한 데이터 타입을 가지는 값들의 모임
- 각 원소는 index에 의해 인식됨. index의 첫 번째 원소를 기준으로 한 상대적인 위치를 의미
- index의 데이터 타입 : 정수 (FORTRAN, C, Java) integer, boolean, char, enum(Pascal, Ada)
- FORTRAN1과 FORTRAN77만 index 개수를 제한하고 나머지는 제한 없음 (multi-dimensional 배열)
1. Static 배열
- FORTRAN 77
- index의 최대 범위가 정적으로 수행 전에 결정
- 배열의 메모리 할당도 정적으로
- 프로그램 수행동안 변하는 것이 없기 때문에 실행 효율성이 좋다.
2. Fixed Stack-Dynamic 배열
- C의 local배열 : int a[10]
- index의 최대 범위는 정적으로 결정
- 배열의 메모리 할당은 실행 중에 Stack에
- 수행동안 메모리 위치가 변한다. 함수가 끝나면 메모리에서 사라지기 때문에 그 공간을 재활용 가능하다.
3. Stack-Dynamic 배열
- Ada의 declare block
- index 범위와 메모리 공간은 수행 중에 Stack에 동적으로 결정된다.
- 그러나 시작할 때 한 버 결정되면 그 변수 생명주기가 끝날 때 까지 변할 수 없다.
- 배열의 크기를 실행 중에 받을 수 있다.
- 항상 상수로 결정되는게 아니라 변수로도 가능하다.
- 융통성이 좋다. (배열이 사용되기 직전에야 index 범위, 배열 크기 등을 알 수 있을 때 유용)
4. Fixed Heap-Dynamic 배열
- index 범위, 메모리 공간이 동적으로 결정된다.
- 메모리 위치가 Stack이 아닌 heap
- C의 malloc/free, C++의 new/delete로 조작되는 배열
- Java의 모든 배열, C#도 이 유형의 배열 제공
5. Heap-Dynamic 배열
- 굉장히 자유로운 배열
- index범위, 메모리 공간이 수행 중 동적으로 결정된다.
- 수행하다가 변할 수 있다. (길이가 변화함)
배열 초기화
주로 메모리에 자리잡은 순서대로 초기화 됨
배열 연산
- ADA : 배열 assignment(:=), 이어붙이기, 같은지 비교
- FORTRAN : 행렬, 벡터 연산 라이브러리가 풍부함
- APL : 가장 강력함 : 배열에 대한 사칙연산, 벡터의 원소 역순, 행렬의 행/열의 역순, 전치행렬, 역행렬
Rectangle 배열. 장방형 배열
- 모든 행이 동일 개수의 원소들을 포함, 모든 열이 동일 개수의 원소들을 포함. (table 형태)
Jagged 배열. 비장방형 배열
- 행, 열의 크기가 동일하지 않은 multi-dimensional 배열
- 배열의 배열로 본데
Slice
- 배열의 부분을 한 단위 (또 다른 작은 배열)로 보는 것
배열의 구현 방법
- 배열 원소의 접근에 대한 코드를 컴파일러가 생성
Associative 배열 (연상 배열)
- 숫자가 아닌 index를 가질 수 있다.
- index를 key라고 부른다. key와 value
- hash table