본문 바로가기
척척학사/프로그래밍 언어론

복합타입

by 학사쟁이 2023. 11. 4.
반응형

배열

배열을 정의할 때 핵심은 동질형 데이터의 모음으로 구성된 타입이다. 이를 원소(element)를 배열의 각데이터를 이르고 배열의 크기는 배열이 가지고 있는 원소의 개수를 말한다. 또 각원소는 첨자로 상대적 위치가 구분되는데 이는 인덱스라가 도 불린다. 

데이터의 집합이란 원소의 타입에 해당하는 데이터 집합이 원소의 크기만큼 모인 집합을 말한다. 원소의 타입과 배열의 크기에 따라서 다양한 타입의 존재한다. 

◇원소의 타입 : 단순 타입 및 복합타입 모두가능

◇배열의 크기 : 양의 정수범위 x 차원

double arr [4]
4개의 실수형(double) 타입의 배열로 그 배열의 이름은 arr이다.

 

차원

배열의 사용되는 첨자의 개수를 차원이라고 한다. ex) 1차원 배열[크기] 2차원 배열 [행][열] 3차원배열[면][행][열]

1차원 예 char a [5];

2차원 예 char b [2][3];

3차원 예 char c [2][3][4];

 

저장공간 확보

정적변수 →  Fortran / 

스택 동적변수는 배열의 크기는 동적 바인딩도 가능하고 동적 바인딩도 가능하다. 예를 들어 char arr [3]으로 프로그램이 수행되는 시점에 3개의 크기를 할당받는다(정적바인딩), int =3; char arr [n]; 로 되어있다면 이는 프로그램을 수행하는 시점에 그 크기가 결정되고 이를 동적바인딩이라고 한다.

힙 동적 변수는 배열의 크기도 항상 동적바인딩이고 주로 JAVA이다. char [] arr= new char [5];

 

첨자를 통한 원소의 주소계산은 만약에 크기가 N인 1차원 배열 A가 있다면 배열의 특성상 연속되는 공간을 부여받게 되는 첫 번째 원소를 A [0]이고 그 뒤에 따라서 A [1]이 붙을 겉이다. 그리고 이것이 정수, int라면 4바이트를 차지할 테니 처음 위치가 0이라면 2번째는 4, 세 번째는 8이 될 것이다. 이를 주소(A [i]) = 주소(A [0])+i*원소의 크기로 정리할 수 있다.

만약 크기가 MxN인 2차원 배열 B가 있다고 하면,

우선 행우선 저장을 대부분에 언어가 할 것이다. 실제로 순서대로 저장이 되고 우리가 흔히 그리는 배열은 추상화한 거라는 걸 기억하자. 이에 대한 주소 계산하는 것은 B [i][j] = 주소(B [0][0]) + i*N*원소크기 + j* 원소의 크기이다. 예를 들면 B [1][2] = 주소 B [0][0] + 1* 4 *1 + 2*1

그리고 열 우선 저장은 Fortran에 해당되는데. 이는 열 우선이기에 주소 구하는 방식을 열부터 간다고 생각하면 된다.

char B [3][4]라면 B [i][j] = 주소(B [0][0]) + j*N*원소크기 + i* 원소의 크기, B [1][2] = 주소 B [0][0] + 2*3*1 + 1*1

 

배열의 연산집합은 배열 전체를 다루는 연산들의 집합이 있고, 개별 원소 연산도 가능하고 이때 원소타입의 연산 집합에 의존한다. 배열전체에 대한 연산은 프로그래밍언에따라 다르다. C, C++, Java는 초기화 연산만 기본적으로 제공하고, Ada, Perl, Pythom은 대입연산등이 포함된다.

 

문자열형

문자열이라는 것은 문자의 나열을 말한다. "good morning"등이 있다, 문자열은 " " 이 필요하다.

예를 들어 "a"과  'a' 차이는  "a"는 내부적으로 보면 'a'+NULL문자가 자동적으로 포함된다 쉽게 문자열의 끝이다를 표기하기 위 NULL이 온다.

데이터 집합은 모든 문자열이 모인 집합이다.

C나 C++은 문자형을 1차원 배열로 다룬다. char str [] = "abcd";

Java는 String 클래스 타입으로 String str = "abcd";

연산 집합의 경우 프로그래밍 언어마다 차이가 큰데,

C, C++는 기본적인 문자열 연산은 없다.

Java에서는 대입연산 str2 = str; , 연결연산 "good" + "morning" = "good morning"

 

연관배열과 해싱

일반적인 배열은 순서가 있다, 첨자(인덱스)가 순서를 나타낸다. 연관배열은 동질형 데이터의 순서가 없는 모음으로 구성된 타입을 말한다. 즉 원소 간의 위치관계는 의미가 없다. 이때 각각 원소는 키로 구별한다. 키는 각 원소의 절대적인 위치를 말한다. 키는 서로 중복이 불가하고, 원소는 중복이 가능하다.

Tue Mon Wed Sun
원소 2000 2000 2500 1000

 

데이터의 집합은 키의 데이터집합과 원소 타입의 데이터 집합의 쌍이 모인집합이다.

Perl은 연고나배열로 해시타입이 있다.

% walk = ('Tue'=>2000, 'Mon'=>2000, 'Wed'=>2500, 'Sun'=>1000);

C++ 에는 map이 있다. 이 둘의 삭제연산과 추가는 다음과 같다.

추가
Perl : $walk {'You'}=3000;
C++ : walk.insert({"You", 3000});
삭제
Perl : delete $walk {'You'};
C++ : walk.erase("You");

 

구조체

레코드형으로 데이터의 모음으로 구성된 타입이지만 배열과 다르게 서로 다른 타입도 가능하다. 원소는 동질형과 이질형 모두 가능하다. 각원소는 이름으로 구별되고 각원소의 타입으로 선언된 변수명을 사용한다.

이름 name birth height
원소 문자열 정수

 

이러한 각원소의 타입에 해당하는 데이터집합들이 모인 집합이 구조체를 이루는 데이터집합이다.

그리고 원소의 개수와 원소의 타입에 따라 다양한 타입이 존재한다. 각원소의 타입은 단순타입, 복합타입 모두가능하다.

구조체에서 대비할 수 있는 연산집합은 초기화와 대입연산이 있다.

 

공용체

 

원소들의 구성형태는 구조체와 유사하지만 차이점은 저장공간을 공유하는 데이터의 모음으로 구성된 타입이다. 앞서 안내했던 약타입의 언어가 공용체를 허용하는 것이다. 사용되는 용량 줄이는 장점이 있지만 이로 인해 한 원소의 값이 변경되면 다른 원소들이 영향을 받게 된다. 메모리를 공유하는 건 쉽게 10개 저장공간에 저장되어 있는곳에 어떤 새로운 5개공간만큼 필요한 정의를 하면 앞에 5개 공간의 값은 바뀐다. 그이전에 10개공간에 저장된 값이 바뀌게 된다. 쉽게 덮어씌기라고 생각하면된다. C, C++ => union

 

포인터형

특정 데이터가 저장되어있는 주소 자체를 데이터로 다루는 타입을 말한다. 특정 데이터 타입은 사용자가 지정한다. 이때 단순타입, 복합타입모두 가능하다.

int *ptr; 

즉 데이터가 원하는 값 10이 들어있는 것이 아니라 10이 들어있는 주소지를 가리키는 주소를 데이터로 한다고 생각하면 된다. 대입 연산, 덧셈, 빽 셈이 가능하고 C와 C++는 역참조 연산자 *가 있다. 예를 들어 int a [2]가 지정되어 있고 이때 int *ptr;

 그리고 ptr=a;라고 하면 ptr이 저장되어 있는 곳은 a의 주소값을 저장하게 된다. 그리고 이때 가리키는 주소지를 100이라고 하고 ptr++;를 하게 되면 int는 4바이트임으로 104가 된다.

 

참조형

사용자가 지정하는 타입의 데이터가 저장된 주소자체를 자신의 주소로 사용하는 타입을 말한다. 

int a=1;이라면 int &ref = a;라고 한다면 이때 a의 주소를 자신의 주소로 사용한다는 것이다 실제로 포인터처럼 새롭게 배정받아 주소를 저장하는 것이 아니라 지정된 a의 위치를 공유한다는 것이다.

반응형

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

문장  (0) 2023.11.09
프로그래밍언어론 수식  (0) 2023.11.06
프로그래밍 언어 타입  (1) 2023.10.28
프로그래밍 언어론 변수의 영역  (1) 2023.10.24
변수와 바인딩  (0) 2023.10.12