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할당하여 사용하는 것이 좋다.
'프로그래밍언어' 카테고리의 다른 글
[프로그래밍언어] Memory Allocation Area(code,data,stack,heap)->Segment (0) | 2020.06.20 |
---|---|
[프로그래밍언어] Data Types_Union Types, Pointer and Reference Types, Type Checking, Strong Typing (0) | 2020.06.20 |
[프로그래밍언어] Syntax and Semantics (0) | 2020.06.19 |
[프로그래밍언어]Subprograms (1) | 2020.06.19 |
[프로그래밍언어] Names, Bindings, and Scopes (0) | 2020.06.18 |