프로그래밍언어

[프로그래밍언어] Data Types_Primitive, Character String, Enumeration, Array Types

variables in Java: 

-primitive types:

boolean, char, byte, int, short,long, float, double.....

-non-primitive types: 

string, arrays, classes

 

Primitive Data Types

Decimal -장점: Accuracy , 단점: limited range(지수표현x), wastes memory 

Boolean -장점: readability, #include<stdbool.h>

Character: stored as numeric codings(scalar), ASCII(8-bit code) or 16-bit coding:Unicode(UCS-2)

 

Character String Types

- C와 C++: Not primitive 

strcpy(dst,src) 불완전성하다. dst:20 bytes, src:50bytes인경우. 

그래서 C++에선 string class를 라이브러리에서 쓸 수 있다. 

- Java: String class(Static 개념) , Stringbuffer class(동적으로 문자열의 내용을 바꾸거나 위치조정가능_Dynamic개념)

reference type이지만 primitive type처럼 사용합니다.

 

Character String Length Options로는 

1. Static length string(자바의 String class): compile time에 길이 지정

2. Limited dynamic length string(C와 C++): compile time에 고정된총길이지정 후 run-time에 그 길이 수정 

3. Dynamic length String(Perl, JavaScript, C++라이브러리_no max_최대길이 제한 없이 가변적길이허용) : 실행시간에 유지.  이를 구현하는 방법들로는 세가지 : 

(1)Linked list에 저장

(2) Heap에 할당된 각 문자들을 가리키는 포인터들의 배열로 저장

(3) 문자열전체를 인접한 메모리셀(adjacent strorage cell)에 저장 

Dynamic Length 경우에는 allocation/deallocation이 가장 큰 구현문제다. 

 

Enumeration Types (열거타입)

named constants(이름상수)가 제공된다. 

enum days{mon,tue,wed,thu,fri,sat,sun}; //implicitly assigned

하면 mon=1부터 할당해서 쭉 1 2 3 4...7의 값을 할당받는다

enum days{mon=1,tue,wed,thu,fri,sat,sun}; //explicitly assigned

이렇게 명시적으로 표시해도 된다. 

 

열거타입의 변수는 산술 연산 안됩니다. 예를 들어 mon+tue //illegal표현

 

days today=tue; 일때   today++//legal표현으로 _정수타입으로 강제변환됩니다.

하지만 today=4.5;//illegal 표현입니다. 

 

(중요!!!!!) Enumeration types는 integer로 implemented됩니다. 

Reliability(신뢰성) 증가를 위해 range of values와 operations에 Restriction(제약)이 존재하는 것입니다. 

 

 

Array Design Issues

(중요한 문제!!) 배열은 자신의 메모리가 할당되었을 때 초기화될 수 있을까? 

 

Array Type

array는 여러 데이터를 묶어서 하나의 단위로 처리하는 데이터 타입으로 homogeneous aggregate(다 같은 타입의) data elements의 요소들을 가집니다. 

Index syntax는 [ ]가 일반적입니다. 

Index range checking은 reliability관련된 문제로 C와 C++는 하지않고 Java와 C#은 체킹합니다.(C, C++보다 심플, safe, more reliable) 

 

Subscript Binding and Array Categories

1. Static : subscript범위와 storage 할당 모두 static.

장점: 효율적(dynamic할당해제가 없다.)

단점: 배열storage가 프로그램 전체실행시간동안 고정되어있다.

static이 붙은 표현

2. Fixed stack-dynamic : subscript범위는 static, storage할당은 dynamic. (즉, 사이즈는 컴파일타임, 스택할당은 런타임에 결정) 

장점: space 효율성. 

단점: 런타임 overhead 

static이 붙지 않은 표현 

3. Stack-dynamic: subscript범위와 storage할당 모두 dynamic. 

4. Fixed heap-dynamic: storage binding은 dynamic하지만 할당 이후로는 fixed. (바인딩은 요구될 때 끝나고 storage는 stack이 아닌 heap으로부터 할당됨) ex) malloc, free (C), new, delete (C++)

ex) int *IGS = malloc(sizeof(int) *100); 

 

(중요!!!) Fixed stack-dynamic과 Fixed heap-dynamic의 차이는

subscript range는 둘다 fixed stack에 compile time에 결정 

allocation은 runtime에 Fixed stack은 stack에, Fixed heap은 heap에 할당된다. 할당 후엔 fixed되어 runtime내내 사용됨_메모리 해제까지) 

 

5. Heap-dynamic: subscript 범위 바인딩과 storage할당 모두 dynamic하고 계속 변경될 수 있다. 

ex) Java의 generic class, C#의 List, ArrayList

 

Array in C - tips

-초기화 습관을 기르자. 

stack 영역은 초기화하지않으면 쓰레기값이라고 부르는 garbage value가 될 수도 있다. 

일반적으로 스택은 여러함수가 공유해서 사용하기 때문이다. 

-한 편, Static data영역을 사용하는 전역변수라면 컴파일러가 알아서 compile time에 0으로 초기화해줌. 

-배열크기가 너무 크다면 alloc() 등으로 heap area할당하여 사용하는 것이 좋다.