그냥 공부

"프로그래밍언어개론" 5주차 정리

seungh2 2020. 6. 3. 15:03

기본 데이터 타입

?데이터 타입이란?

: 비슷한 종류의 데이터 개체들과 그 개체들을 가지고 수행할 수 있는 연산들의 집합

하나의 데이터 타입은 다른 데이터 타입을 사용해서 복잡하게 정의될 수 있다.

데이터 타입의 목적

- 실제 세계의 대상들을 표현

- 공간을 효과적으로 쓸 수 있도록 해준다. (컴파일러가 적절한 크기의 메모리를 할당)

- 타입 검사로 오류를 사전에 알려준다. (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

 

 

 

 

728x90