본문 바로가기
Language

[Programming Language] 3. 자료형 (1)

by 삼준 2023. 7. 11.
반응형

직전글

2023.07.09 - [Language] - [Programming Language] 2. 변수, 바인딩, 영역

● 서론

- 자료형(Data Type) : 데이터 값들의 모임과 그들 값들에 대한 미리 정의된 연산들의 집합

- 사용자-정의 타입(User-defined Type) : 사용자가 정의한 자료형 (C언어 typedef)

타입에 대한 의미있는 이름을 사용해 판독성이 올라가며, 프로그램 수정에 도움이 됨.(타입 선언문만 변경해서 타입을 변경 가능하기 때문)

- 추상 자료형(Abstract Data Type) : 사용자 정의 타입에서 더 나아간 개념 (Class)

- 객체 : 사용자-정의 추상 자료형의 인스턴스

 

● 기본 자료형

다른 자료형을 이용하여 정의되지 않은 데이터 타입.

거의 모든 프로그래밍 언어가 기본 자료형들을 제공함.

 

- 수치형

숫자와 관련된 기본형

 

1. 정수

가장 공통된 기본 수치 자료형

ex) int, byte, short, long, unsigned integer 등

 

2. 부동-소수점 수

실수를 모델링한 것으로, 대부분 실수 값에 대한 근사값을 제공하는 것임.

ex) float, double 등

 

3. 복소수

일부 프로그래밍 언어들만 지원함.

ex) Python의 허수부분 j(또는 J) 표시 ( 3 + 5j )

 

4. 십진수

사무 시스템 응용 분야 지원을 위한 언어들에서 지원함.

ex) COBOL, C# 등

 

- 불리언 형(Boolean Type)

모든 타입들 중 가장 단순한 타입.

값들의 범위로 단지 두 개의 요소를 가짐. 참/거짓.

C언어의 경우, 불리언 형을 지원하지 않고 0을 거짓, 0이 아닌 모든 값을 참으로 처리함. 수치 식을 불리언 식처럼 사용 가능함.

Java, Python의 경우, 수치 식을 불리언 식으로 사용하는 것이 불가능함.

 

- 문자 형(Character Type)

문자 데이터는 수치 코딩으로 컴퓨터에 저장됨.

대부분의 언어가 문자를 기본 자료형으로 지원함.

단, Python은 단일 문자를 길이가 1인 문자 스트링(Character String)으로 지원함.

 

1. ASCII

가장 공통적으로 사용되는 8비트 코딩 기법. (실제로는 7비트를 사용해서 0~127 까지 128개의 문자를 표현 가능함)

 

2. Unicode

16비트 문자 코드로 세상 대부분의 자연어 문자를 표현 가능함. 처음 128개는 ASCII와 동일함.

Java는 Unicode를 처음 사용한 언어임.

 

3. UCS-4, UTF-32

4바이트 문자 코드.

+ UTF-8 vs UTF-32

UTF-8은 1~4바이트 사이로 유동적이며, UTF-32는 4바이트로 고정임.

 

● 문자 스트링 타입(Character String Type)

값들이 일련의 문자들로 구성되는 타입.

- 스트링과 연산

가장 공통된 스트링 연산들로는 다음과 같음.

1. 배정

변수에 스트링을 배정함.

2. 집합

두 스트링을 이어 붙임.

3. 부분 스트링 참조

주어진 스트링의 부분 스트링에 대한 참조.

배열의 관점에서 보는 부분 스트링 참조를 슬라이스(Slice)라고 부름.

4. 비교

두 스트링이 같은지 다른지 비교함.

5. 패턴 매칭

스트링 내부에 특정 패턴이 들어있는지 확인함.

 

- 스트링이 기본형이 아닌 언어(C, C++ 등)에서 문자열을 처리하는 법

스트링을 단일 문자(Character)들의 배열로 저장하고 끝을 널(null) 문자로 처리함.

스트링 연산은 표준 라이브러리 함수로 제공함. (strcpy, strcat, strlen 등)

+ 문제점

스트링 데이터를 이동하는 라이브러리 함수가 목적지 스트링이 오버플로우하는 것에 대해 보호하지 않음.

ex) strcpy(dest, src); 명령을 실행시 dest 길이가 더 짧으면 dest 뒤에 더 필요한 만큼을 덮어쓰게 됨.

 

- Java에서

문자열은 String, StringBuffer 두 클래스에 의해 지원됨.

String : 값 변경 불가능, 상수 스트링.

StringBuffer : 값 변경 가능, 단일 문자들의 배열과 유사.

 

- Python에서

스트링이 기본 타입임.

변경 불가하며 Java의 String 클래스와 유사함.

문자와 부분 스트링 참조에 대해서는 문자들의 배열과 유사함. (슬라이싱 가능)

 

- 스트링 길이 선택사항

1. 정적 길이 스트링

길이가 정적이고 처음 생성될 때 결정됨. (ex. Python의 스트링, Java의 String 클래스)

 

2. 제한된 동적 길이 스트링

스트링이 변수 정의에서 선언되고 고정된 최대 길이까지 가변적 길이를 갖는 것을 허용함. (ex. C의 스트링)

 

3. 동적 길이 스트링

최대 길이 제한이 없고 길이가 변할 수 있음. (ex. Java의 StringBuffer 클래스, JavaScript, Perl, 표준 C++ 라이브러리)

 

- 문자 스트링 타입의 구현

1. 정적 길이 스트링

컴파일 과정에서 서술자(Descriptor)라는 것이 요구됨.

서술자는 세 가지 필드를 가짐. (1) 이름, (2) 길이, (3) 주소

 

 2. 제한된 동적 길이 스트링

실행시간에 서술자가 요구됨. 대부분의 경우 서술자들은 심볼 테이블에 저장됨.

 

3. 동적 길이 스트링

앞의 두 스트링보다 더 복잡한 기억공간 관리를 요구함.

이를 지원하는 세 가지 방법이 있음.

    3-1. 연결리스트

스트링이 늘어날 때, 힙의 어느 곳에서든 메모리 셀을 가져옴.

링크 표현을 위한 여분의 메모리가 필요하고, 스트링 연산이 복잡해진다는 단점이 있음.

    3-2. 포인터 배열

스트링을 힙에 할당된 문자 각각을 가르키는 포인터의 배열로 저장함.

여분의 메모리(중간 다리 역할을 하는 포인터 배열)을 사용하지만 연결 리스트 접근 방법보다 더 빠름.

    3-3. 인접한 기억공간 셀들에 저장

스트링이 늘어날 때 문제가 발생하는데, 인접한 곳에 여유가 없다면 새로운 메모리 영역을 찾고 이동시킨 후 이전에 사용되던 메모리 셀을 회수해야 함.

주로 사용되는 방법임.

 

● 사용자-정의 순서 타입(User-defined Oridinal Type)

가능한 값들의 범위가 0과 양의 정수 집합과 쉽게 연관될 수 있는 타입.

Java에서 기본 순서 타입으로 int, char, boolean이 존재함.

프로그래밍 언어에서 지원되는 두 가지의 사용자-정의 순서 타입으로는 (1)열거와 (2)부분 범위가 있음.

 

1. 열거형(Enumeration Type)

이름 상수들인 모든 가능한 값들이 그 정의에서 제공되는, 즉 열거되는 타입.

열거 상수(Enumeration Constants)라 불리는 이름 상수들의 모임을 정의하고 그루핑하는 방법을 제공함.

ex) C 열거형

enum week {Mon, Tue, Wed, Thu, Fri, Sat, Sun}; // 열거형 타입 정의
week myWeek = Mon, yourWeek = Fri;  // 열거형 변수 정의

week 타입은 열거 상수에 대해 디폴트 내부 값 0, 1, ... 을 사용함.

이 열거 값들은 정수 문맥에서 사용될 때 int로 강제 형변환됨. (myWeek++ == Tue)

Java에서는 Java 5.0에서 열거형을 추가함. 클래스라는 것 빼고는 C와 유사함.

최근 개발된 언어들에는 지원을 하지 않는 추세임.(Python, JavaScript, Perl, Ruby 등) 

 

- 장점

판독성 : 이름이 갖는 값은 쉽게 인식됨.

신뢰성 : Java의 경우 열거형은 어떤 산술 연산도 불가능하고, 열거 변수는 정의된 범위 밖의 값을 할당 불가능함. (C는 정수형 취급이라 Java가 제공하는 신뢰성이 없음)

 

2. 부분 범위 타입(Subrange Type)

순서 타입의 연속된 부분 순서열. 수의 유효한 값 범위를 제한하는 데 사용됨.

Pascal, Ada 등의 언어에서 쓰임.

예를 들어, 정수 변수 x가 1부터 10까지의 값만 가질 수 있다고 가정하는 경우,

# Pascal
type
  MyRange = 1..10;

다음과 같이 작성하고 변수 x를 MyRange 타입으로 선언하면, 변수 x는 1부터 10까지의 값만 가질 수 있게 됨.

<<더 자세한 건 배우지 않았으므로 생략함>>

반응형

댓글