프로그래밍 언어론 - 데이터 타입
프로그램의 모든 데이터에는 데이터 타입(Type)이 있다
즉 데이터 타입은 그 타입의 변수가 가질 수 있는 값들의 집합이다.
데이터 타입의 종류
기본 데이터 타입
- 정수 타입, 부동 소수점 타입과 같이 해당 언어에서 기본적으로 제공
사용자 정의 데이터 타입 - 레코드 타입과 같이 기본 데이터 타입을 이용하여 사용자가 생성
정수 타입
- 주요 관심사항은 정수 값을 표현하는 데 사용하는 바이트 수
- FORTRAN과 같은 언어는 한 가지 크기만을 제공
- Java와 C와 같은 언어는 여러 가지 크기를 제공
- 오버 플로우 : 해당 타입이 제공하는 범위를 넘어서면 오버플로우가 발생한다
- 비부호 정수 타입
- C나 C++에서 제공
- 0과 양의 정수만 표현하며, unsigned로 시작하는 타입
부동 소수점 타입
- 실수 표현
- 대부분의 컴퓨터들은 IEEE 754 표준 형식을 사용
- 단일 정밀도는 이중 정밀도에 비해 연산 속도는 빠름
- 정밀도는 이중 정밀도에 비해 떨어짐
- 4바이트 크기의 float와 8바이트 크기의 double 타입 제공
- C 언어는 sizeof 사용
불린 타입
- true와 false라는 두 개의 값
- ALGOL60에서 처음 도입
- C를 제외한 대부분의 언어에서 제공
- 불린 타입 테이터에 대한 대표적인 연산
- C++에서 and 연산자는 &&, or 연산자는 ||, 그리고 not 연산자는 !
- 예: ch에 저장된 값이 영문자인지를 판별하는 C++
문자 타입
- C 언어의 문자 타입
ch = 'a';
- 문자 코딩 기법을 사용하여 표현
- ASCII
- 0~127까지 총 128개 문자 표현 가능
- 유니코드
- ASCII로 표현할 수 없는 나라별 언어 표현 가능
- Java, C#에서 사용
- 예 : Java의 유니코드 사용
문자열 타입
- C언어의 문자열 타입
printf("Hello")
- 1960년대 중반에 들어 프로그래밍 언어에 문자열 처리를 위한 기능들이 크게 요구
- 변수들이 문자열을 값으로 가질 수 있도록 하는 것
- 문자들의 순서를 기반으로 하여 관계 연산자를 문자열 비교에 그대로 사용할 수 있도록 하는 것
- 이러한 기능을 처음 제공한 언어가 PL/I
- 0으로 끝나는 문자열 형식
- C, C++, Java 등의 다양한 언어에서 사용
- 예: 메모리에 표현된 ‘String’
순서 타입(Orinal type)
- 변수가 가질 수 있는 값들을 나열해 놓은 타입으로 양의 정수 집합과 연관
- 열거(enum) 타입
- 가질 수 있는 모든 값들은 타입 정의에서 정해지는 이름 상수
- 이름 상수를 열거 상수라 함
- C 예제
enum day {SUN, MON, TUE, WED, THU, FRI, SAT};
enum months {JAN=1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC};
enum day currentDay;
- 가독성 향상을 위해 사용 된다.
부분 범위 타입
- 미리 정의된 열거 타입 또는 정수의 부분 집합을 값으로 하는 타입
- Pascal과 Ada에서 제공 • Ada에서는 subtype을 사용해서 부분 범위 타입을 정의
예시 - Ada에서 day라는 열거 타입을 정의
type day is (SUN, MON, TUE, WED, THU, FRI, SAT);
- day 타입의 부분 집합을 값으로 하는 부분 범위 타입인 workday 정의
subtype workday is day range MON..FRI;
- 정의된 workday 타입의 변수 선언
today : workday;
- 변수 today에 workday 타입에 속하는 값의 배정
today := TUE;
- day에는 속하나 workday에 속하지 않는 값은 workday 타입 변수에 배정할 수 없다.
구조적 데이터 타입
-
여러 데이터를 묶어서 하나의 단위로 처리하는 데이터 타입
-
배열, 레코드, 공용체로 구분
-
배열
- 집합체의 첫 번째 원소의 상대적 위치로 원소를 식별하는 동질형 데이터의 모임
- 배열의 원소는 배열 이름과 첨자에 의해 참조
-
1차원 배열 원소의 주소
- 첫 번째 원소의 첨자가 a, 배열의 시작 주소가 base, 각 원소의 크기가 size일 때 A[i]의 주소는?
A[i]의 주소 = base + (i - a) × size
- 예시 : A[3]의 주소 계산하기
- A[0]의 시작 주소가 200이고, 각 원소의 크기가 4바이트라고 가정한다면, base + (i-a) x size로 주소를 구할 수 있다.
- 첫 번째 원소의 첨자가 a, 배열의 시작 주소가 base, 각 원소의 크기가 size일 때 A[i]의 주소는?
-
2차원 배열
A[1][2]
,A(1,2)
- C, C++, Java에서의 배열 선언
- FORTRAN, Ada에서의 배열 선언
-
메모리에 저장 되는 방식
- 행 중심 저장 방식: 첫 행부터 순서대로 저장 되는 방식, 대부분의 언어에서 사용
- 열 중심 저장 방식: 첫 열부터 순서대로 저장 되는 방식, FORTRAN에서 사용
- 행렬 벡터 계산할 때 편하다!
- 행렬 벡터 계산할 때 편하다!
-
행 중심 저장 방식의
A[2][0]
주소
base + (m×(i-a) + (j-a)) × size
= 200 + (2×(2-0) + (0-0)) × 4
= 216
- 열 중심 저장 방식의
A[2][0]
주소
base + (n×(j-a) + (i-a)) × size
= 200 + (3×(0-0) + (2-0)) × 4
= 208
- C/C++에서 배열의 초기화
int intArray[5] = {1, 2, 3, 4, 5};
int matrix[2][3] = {1, 2, 3, 4, 5, 6};
int intArray[] = {1, 2, 3, 4, 5};
➔ 배열 크기 생략 시 초기 값의 개수에 따라 배열 크기 설정int matrix[][3] = {1, 2, 3, 4, 5, 6};
➔ 행의 크기만 생략 가능
- Ada에서 배열의 초기화
intArray: array(1..5) of integer := (1, 2, 3, 4, 5);
intArray: array(1..5) of integer := (2=>5, 4=>10, others=>0);
- Ada는 => 로 값들의 위치를 지정 할 수 있다
레코드 타입
- 집합체의 원소를 이름으로 식별하는 이질형 데이터의 모임
- 1960년대 초기에 COBOL에 도입
- 레코드 정의와 선언 예 : Pascal
- 정의된 레코드 타입인 student 타입의 변수 A 선언
var A : student;
- 레코드 정의와 선언 예 : C
- 레코드 정의와 선언 예 : Ada
- 레코드 타입 변수 A의 구조도
- 필드(field): 레코드를 이루고 있는 데이터
- 필드 접근 시, C/Pascal/Ada는 변수 이름.필드이름 사용
- Ada) 한 번에 레코드 타입 변수의 모든 필드에 값 배정 가능
- Ada) 동등 연산자 적용 가능
공용체
-
레코드와 형식이 유사
-
구조체와 달리 모든 필드가 같은 메모리를 공유하면서 필요에 따라 한 필드만을 사용할 수 있음
-
개념 설명 예
- 음료수는 float 타입의 liter(용량), 과일은 int 타입의 number(개수), 꽃은 char 배열의 name(이름)으로 가정
- liter, number, name은 동시에 사용되는 경우는 없고 상황에 따라 하나만 사용되는데 이러한 경우에 공용체를 사용하는 것이 바람직
-
정의된 가변 레코드 product 타입 변수 선언
-
각 필드에 값을 배정하는 문장
포인터
- 변수가 임의의 객체를 참조하기 위해 메모리 주소를 값으로 갖는 타입
- Pascal, C, C++, Ada 등 최근 언어들은 포인터 개념을 제공
▪ 포인터 개념이 도입된 큰 이유 - 기억장소의 동적 관리
- 동적으로 할당받는 메모리 공간 : heap
▪ 포인터 개념
- 포인터 변수 선언시, 변수 이름 앞에
*
를 붙임 - ptr : 포인터 변수
- int 타입의 데이터를 저장하고 있는 메모리 주소를 저장
- 포인터 변수에
*
를 붙이면 ptr이 가리키는 곳을 의미
포인터를 이용한 동적 기억 장소 관리
▪ 예: 구조체 선언, 포인터 타입 변수 선언 후 동적 메모리 할당
- 생성되는 ptr은 struct list 타입 데이터를 저장하고 있는 메모리 주소를 저장할 수 있음
- malloc 함수 사용, 동적으로 메모리를 할당한 후 ptr이 이 영역을 가리킴
ptr = (struct list *)malloc(sizeof(struct list));
- ptr이 가리키는 영역의 data에 접근하는 표현 형식 : ptr -> data
- 또 다른 메모리 영역을 동적으로 할당받고 ptr->next가 이 영역을 가리키게 하는 코드
- 새롭게 생성된 영역의 data에 20 저장
ptr->next->data = 20;
- 다른 영역을 가리키고 있지 않음을 의미하는 NULL을 저장
ptr->next->next = NULL
- 이 상태에서 다음을 실행
ptr->next=NULL
- 쓰레기 발생 : 20을 저장한 영역은 더 이상 접근 불가
- 동적으로 할당된 영역을 회수하기 위한 free 함수
- 새롭게 생성된 영역의 data에 20 저장
참조 타입
- C++는 참조 타입이라는 포인터 타입을 추가적으로 제공
- 참조 타입 변수는 변수 선언과 동시에 반드시 초기화되어야 함
- 그 후에는 값을 변경할 수 없음
- 참조 타입 변수는 선언할 때 변수 이름 앞에 &를 붙임
부프로그램의 형식 매개 변수로 사용할 때 매우 유용
- 포인터를 이용해서 main의 count 변수의 값을 1 증가시키는 예
- 참조 타입 변수를 이용해서 main의 count 변수의 값을 1 증가시키는 예
- 판독하기 쉽고, 프로그램 안정성이 높다
- 판독하기 쉽고, 프로그램 안정성이 높다
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
728x90
'Computer Science > 프로그래밍 언어론' 카테고리의 다른 글
프로그래밍 언어론 - 식 (2) | 2023.05.25 |
---|---|
오토마타 (0) | 2023.05.23 |
EBNF (0) | 2023.05.22 |
구문 도표 (0) | 2023.05.22 |
정규 문법의 연산 순서 (1) | 2023.05.22 |