Computer Science/프로그래밍 언어론

프로그래밍 언어론 - 데이터 타입

Beomsu Koh 2023. 5. 23.

프로그래밍 언어론 - 데이터 타입

프로그램의 모든 데이터에는 데이터 타입(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로 주소를 구할 수 있다.
  • 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 함수

참조 타입

  • C++는 참조 타입이라는 포인터 타입을 추가적으로 제공
    • 참조 타입 변수는 변수 선언과 동시에 반드시 초기화되어야 함
    • 그 후에는 값을 변경할 수 없음
    • 참조 타입 변수는 선언할 때 변수 이름 앞에 &를 붙임

      부프로그램의 형식 매개 변수로 사용할 때 매우 유용
  • 포인터를 이용해서 main의 count 변수의 값을 1 증가시키는 예
  • 참조 타입 변수를 이용해서 main의 count 변수의 값을 1 증가시키는 예
    • 판독하기 쉽고, 프로그램 안정성이 높다

부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>

'Computer Science > 프로그래밍 언어론' 카테고리의 다른 글

프로그래밍 언어론 - 식  (2) 2023.05.25
오토마타  (0) 2023.05.23
EBNF  (0) 2023.05.22
구문 도표  (0) 2023.05.22
정규 문법의 연산 순서  (1) 2023.05.22

댓글