[프로그래밍 언어론] 자료형

2025. 7. 3. 16:54·CS/프로그래밍 언어론

자료형

 프로그램에서 표현하고 저장하는 데이터에는 여러 종류가 있다. 이 데이터의 종류, 유형을 자료형(Data Type)이라 한다. 자료형의 정의는 다음과 같다. 자료형은 값들의 집합과 이 값들에 대한 연산들의 집합이다. 선언문 int x;에 대해 생각해 보자. 여기서 자료형은 int이고, int 타입은 이 타입의 변수가 가질 수 있는 값들의 집합을 의미한다. 

 

기본 자료형

 자료형은 값들의 타입을 의미한다. 기본 자료형(Basic Type)이란 더 이상 쪼갤 수 없는 값들로 구성된 자료형을 말하며, 빌트인(built - in) 기본 자료형과 사용자 정의(user defeined) 기본 자료형으로 나눈다. 

 

 빌트인 기본 자료형은 프로그래밍 언어에 의해 사전 정의된 기초 자료형이며, 예시로 boolean, char, short, int, long, float 등이 존재한다. 사용자 정의 기본 자료형에는 무엇이 있을까? 열거형(enum)은 사용자가 정의하여 사용할 수 있는 기본 자료형으로 C / C++, Ada 언에에서 사용할 수 있다. 

 

 이외에도 사용자가 정의 가능한 기본 자료형에는 부분범위형(Subrange Type)이 있다. 부분범위형은 Ada, Pascal, Python 등의 언어에서 제공되며 다음과 같이 사용할 수 있다. 하지만 C, C++, Java 등의 언어에서는 사용자가 부분범위형을 정의할 수 없으니 유의해야 한다. 

 

subtype Digit is Integer range 0 .. 9;

subtype Weekday is Day range Monday .. Friday;

 

복합 타입

 복합 타입이란 기본 타입을 이용해 더 복잡한 타입을 구성한 것이다. 복합 타입을 구성하는 타입 구성자는 여러 가지가 있으며 대표적인 타입 구성자로는 배열(array), 리스트(list), 레코드(record), 공용체(union), 포인터(pointer) 등이 있다. 이러한 복합 타입 구성자 중 몇 가지를 알아보자. 

 

레코드

 레코드는 서로 다른 타입의 데이터를 한 곳에 묶어 관리할 수 있도록 하는 자료구조이며, 서로 다른 타입을 여러 필드 변수로 구성하는 자료형이다. 레코드는 C 언어에서 구조체로 불리며 Pascal, Ada에서는 레코드라 불린다. C++의 클래스는 C의 구조체의 확장이라 볼 수 있다.

 

C에서는 다음과 같이 사용할 수 있다. 

struct Person

{

  int age;

  char name[10];

}

 

위에서 언급한 공용체(union) 타입은 필드 변수를 선택적으로 사용한다는 점을 제외하면 구조체 타입과 거의 유사하다.

 

배열

 배열 자료형은 익숙하므로 그닥 어렵지 않다. 배열은 같은 타입의 연속된 변수들로 구성하는 자료형으로, 배열을 구성하는 변수를 요소(element)라 하며 배열 요소는 배열 이름과 요소의 인덱스로 나타낸다. 배열의 선언 방법은 다음과 같다. 

Type arr_name[arr_lenght];

 

 이렇게 선언한 배열 array의 원소 주소는 다음과 같다. array[i]' address = base + i * sizeof(type). 배열의 시작 주소 base에서 배열 요소의 자료형 크기만큼 오프셋으로 떨어진 위치에 요소들이 저장될 것이다. 이외에도 2차원 배열, 3차원 배열도 사용이 가능하다. 

 

리스트

 리스트는 항목(item)들의 모음으로, 다수의 항목을 집합적으로 처리하는 경우 유용하다. 이러한 리스트는 Python의 대표적 자료구조이며 []를 이용해 항목을 정의한다. Python에는 배열 대신 이러한 리스트를 사용한다. 다음과 같이 다른 타입의 요소도 저장 가능하다.

 

python의 List

>>> b = [1, 'two', 3, 'four', 5]

>>> b[1]

'two'

 

Java의 ArrayList

 본래 배열을 이용하려면 C, Java에서는 배열을 선언할 때 배열의 크기(길이)도 지정해야 한다. 하지만 Java의 ArrayList는 배열의 크기가 동적으로 변하는 동적 배열이므로 미리 크기를 지정할 필요가 없다. Java의 ArrayList에도 여러 타입의 객체를 저장할 수 있지만 이러한 경우 저장된 객체를 가져와 사용하려면 저장된 객체의 타입을 확인한 후에 따로 처리를 해야한다. 따라서 제네릭 클래스를 이용해 ArrayList에 저장될 객체의 타입을 미리 지정하여 사용하면 이러한 번거로움을 해결할 수 있다. 

ArrayList<Integer> list = new ArrayList<Integer>();

 

포인터

 포인터는 C 언어의 꽃이라 할 수 있다. 포인터 타입은 메모리의 주소를 값으로 사용하는 자료형이다. C 언어의 포인터 변수 예시를 살펴보자.

 

1) T *p;       포인터 변수 선언

2) p = E;     포인터 변수에 대입 

3) *p = E;   포인터가 참조하는 변수에 대입

 

포인터와 관련된 연산은 다음과 같다.

 

1) malloc(x)    x 크기의 메모리 할당 + 시작 주소 반환

2) &x              변수 x의 주소(포인터)

3) *x               포인터 변수 p에 저장된 포인터 주소 참조

 

재귀 타입

 어떤 타입을 정의하는 경우 자신의 이름을 다시 사용하는 경우를 재귀 타입이라 한다. 다음과 같이 포인터를 사용해 재귀 타입을 정의할 수 있다. 이 구조체는 2개의 필드를 가지며, 2번째 필드 next는 이 타입의 다른 구조체를 가리키는 포인터이다.

struct CharList

{

  char data;

  struce CharList* next; 

}

 

형변환

 이항 연산에서 두 변수의 자료형이 일치하지 않으면 둘 중 한 변수의 자료형을 다른 변수의 자료형과 일치하도록 변환해야 한다. 이러한 경우에 C, C++, Java에서는 표현 범위가 작은 쪽에서 큰 쪽으로 자동으로 자료형을 변환해 준다.

 

 자동으로 형을 변환하는 것을 묵시적 형변환 / 자동 형변환이라 한다. 표현 범위가 더 넓은 쪽으로 변환한다면 상향 변환 / 확장 변환이며, 표현 범위가 더 작은 쪽으로 변환하면 축소 변환이다. Java 언어의 자동 형변환은 대부분 확장 변환이다. 만약 축소 변환을 하게 되면 어떻게 될까? x = 3.14, y = 5일 때 x + y에서 축소 변환이 발생하면 x의 값이 3으로 변환될 것이다. float 타입에서 int 타입으로 축소 변환이 발생한 것인데, 이 경우 유효 숫자의 일부가 소실된다. 간단한 덧셈 1번이므로 드라마틱한 차이는 발생하지 않았다고 생각할 수 있겠지만 부품 설계 / 로봇 궤도 계산 등의 많은 연산이 필요한 프로그램에서 이렇게 유효 숫자가 소실된다면 큰 피해를 입을 수 있다.

 

Java의 확장 변환 순서는 다음과 같다. 괄호 안의 숫자는 자료형의 크기이다.

 

byte(1) < short(2) < int(4) < long(8)

float(4) < double(8)

 

그렇다면 형변환은 어떻게 할 수 있을까? 형변환을 하기 위해서는 타입 캐스팅 연산자를 이용하면 되는데, 간단하게 다음과 같이 그냥 괄호 내에 타입을 작성하고 이어서 수식을 작성하면 된다. (Type) Expr와 같이 작성하면 되는데, 예시를 통해 살펴보자.

byte i = (byte) 456;을 예시로 살펴보자. 456은 이진수로 표현하면 1 1100 1000인데, byte는 8비트까지의 값만 저장할 수 있으므로 축소 변환이 발생한다. 따라서 상위 비트 1을 절삭하여 1100 1000의 값이 i에 저장되는데, 이 이진수 값은 -56의 음수 값이다. 이와 같이 축소 형변환과 강제 형변환을 실행하면 의도치 않은 값이 변수에 저장될 수 있으니 주의해야 한다. 

 

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

[프로그래밍 언어론] 타입 시스템  (0) 2025.07.04
[프로그래밍 언어론] 타입과 언어의 분류  (0) 2025.07.03
[프로그래밍 언어론] 문장의 의미  (1) 2025.07.02
[프로그래밍 언어론] 구조적 프로그래밍  (0) 2025.07.02
[프로그래밍 언어론] 의미론(sementics) - 수식의 의미  (1) 2025.07.02
'CS/프로그래밍 언어론' 카테고리의 다른 글
  • [프로그래밍 언어론] 타입 시스템
  • [프로그래밍 언어론] 타입과 언어의 분류
  • [프로그래밍 언어론] 문장의 의미
  • [프로그래밍 언어론] 구조적 프로그래밍
hyeon0117
hyeon0117
컴공으로 살아남기
  • hyeon0117
    컴공 생활기
    hyeon0117
  • 전체
    오늘
    어제
    • 분류 전체보기 (66) N
      • Algorithm (2)
      • PS (22) N
        • Solve (22) N
      • CS (42) N
        • 객체지향설계 & 패턴 (12)
        • COLMAP (2)
        • 머신러닝 (1)
        • 프로그래밍 언어론 (19)
        • 형식언어 (7) N
        • 운영체제 (1)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    형식언어론
    그리디 알고리즘
    자료형
    BOJ
    형식언어
    함수
    디자인 패턴
    PLT
    boj 1343
    백준
    객체지향설계
    객체지향언어
    촘스키 계층
    자료구조
    최단 경로
    java
    구현
    Formal Language
    컴파일러
    알고리즘
    의미론
    프로그래밍 언어론
    CS
    정규 문법
    선택 정렬
    PS
    유한 오토마타
    디자인패턴
    객체지향
    정규 언어
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
hyeon0117
[프로그래밍 언어론] 자료형
상단으로

티스토리툴바