전공과목 정리/프로그래밍언어론

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

최연재 2025. 8. 31. 09:44

출처 : 프로그래밍 언어론 : 원리와 실제 (창병모, 인피니티북스, 2021)

 

6.1 자료형 개요

1) 자료형의 의미

- 자료형

  • 해당 타입의 변수가 가질 수 있는 값들의 집합
  • 그 값들에 적용 가능한 연산들의 모음

 

2) 기본 자료형

- 사전 정의된 기본 자료형 : boolean, char, int, float, double, ...

- 사용자 정의 기본 자료형

  • 열거형 : 열거된 값들로 이루어진 타입

 

3) 부분 타입 (subtype)

- 부분 타입 

  • 기반 타입(base type)의 일부분 값들로 정의된 자료형
  • 기반 타입의 모든 연산을 부분 타입에 적용 가능
  • Ada, Pascal

 

6.2 복합 타입

1) 타입 구성자

- 기본 자료형으로부터 더 복잡한 자료형(복합 타입)을 구성하는 방법

  • 배열 타입 (Array type)
  • 리스트 타입 (List type)
  • 레코드 타입 (Record type)
  • 공용체 (Union type)
  • 포인터 타입 (Pointer type)

- 사용자 정의 타입

 

2) 구조체(레코드) 타입

- 구조체 : 여러 개의 (필드) 변수들을 묶어서 구성하는 자료형

  • struct in c
  • record in Pascal, Ada, ...

- C++의 class

  • C의 struct를 확장
  • 데이터뿐만 아니라 연산(함수)들을 포함하도록 확장한 자료형

 

3) 배열 타입

- 배열 타입

  • 같은 타입의 연속된 변수들로 구성하는 자료형
  • 배열 요소(element), 인덱스

- 이차원 배열

  • 선언 : 자료형 배열이름[][]
  • 행 우선(row major order) 배치 : 행부터 배치
  • 열 우선(column major order) 배치 : 열부터 배치

- C의 배열 : 배열의 크기가 정적 결정

- Java의 배열

  • 자료형[] 배열이름 or 자료형 배열이름[]
  • 배열 변수는 참조 변수 ➡️ 배열 변수의 선언 != 배열의 자동 생성
  • 동적 배열 : 배열 크기가 실행 시간에 결정됨

 

4) 리스트 (list)

- 리스트

  • 항목들의 모음으로 다수의 항목을 집합적으로 처리하는 데 용이
  • 파이썬의 대표적인 자료 구조
  • 원소가 같은 타입일 필요가 없음.

- 부분 리스트 (slicing)

  • 하나의 리스트를 인덱스를 이용해 부분 리스트로 분리
  • ex) python ➡️ list[start:end]

- Java의 ArrayList

  • 일반적인 배열 : 배열의 크기가 한 번 결정되면 그 크기가 고정
  • 리스트 혹은 동적 배열 : 배열의 크기가 동적으로 변함
  • Java의 ArrayList : 동적 배열이며, 다양한 타입의 객체를 저장할 수 있음.

 

5) 포인터 타입 (pointer type)

- 메모리의 위치(주소)를 값으로 사용하는 자료형

- 포인터 변수 관련 구문

T *p; // 포인터 변수 선언
p = E; // 포인터 변수에 대입
*p = E; // 포인터가 참조하는 변수에 대입

- 포인터 관련 연산

  • malloc(n) : 크기 n의 메모리 할당 및 시작 주소 반환
  • &x : 변수 x의 포인터 (주소)
  • *p : 포인터 변수 p에 저장된 포인터 주소 참조

 

6) 재귀 타입 (Recursive type)

- 타입 정의에 자신의 이름을 사용

 

 

6.3 형 변환

1) 자동 형변환 (automatic type conversion)

- 자동으로 형을 변환하는 묵시적 형변환 (implicit type conversion)

- 이항 연산에서 두 피연산자의 자료형이 다른 경우 (C/C++, Java)

- 확정 변환 (widening conversion)

  • 표현 범위가 더 넓은 쪽으로 변환하는 상향 변환 (promotion)
  • Java에서 자동 형변환은 거의 대부분 확장 변환

2) 축소 변환 (narrowing conversion)

- 확장변환의 반대로 표현 범위가 더 작은 자료형으로 변환

- 대입 변환 (assignment conversion)

  • 대입문의 경우에도 확장 변환인 경우에만 자동으로 수행
  • 축소 변환인 경우에는 자동으로 수행되지 않음. 
  • 예외적으로 int 상수에 대해서 byte, short, char에 대입할 때 정보 손실이 없으면 자동 변환

3) 형변환 연산자

- 타입 캐스팅 연산자 (type casting operator) 또는 캐스트(cast)

  •  (자료형) 수식

- 수식에 의해 계산된 값을 명시된 자료형의 값으로 변환

- 정보 손실 발생 가능

 

6.4 타입과 언어 분류

1) 정적 타입 언어 (statically typed language)

- 변수의 타입이 컴파일 시간에 결정되어 고정되는 언어

- 컴파일 시간에 타입 검사 진행

- Java, C, C++, FORTRAN, Pascal, Scala

 

2) 동적 타입 언어

- 변수의 타입이 저장되는 값에 따라 실행 중에 바뀔 수 있는 언어

- 실행 시간에 타입 검사 진행

- Perl, Python, Scheme, JavaScript

 

3) 타입 규칙 (typing rule)

- 타입 규칙 (typing rule)

  • 언어를 설계할 때 프로그램 구성요소의 타입 사용 규칙도 정함
  • 타입 규칙의 엄격성에 따라 강한/약한 타입 언어로 분류

- 강한 타입 언어 (strongly typed language)

  • 엄격한 타입 규칙을 적용하여 (모든) 타입 오류를 찾아낼 수 있는 언어
  • Java, C#, Python

- 약한 타입 언어 (weakly typed language)

  • 느슨한 타입 규칙을 적용한 언어
  • C, C++, PHP, JavaScript, Perl