배열
배열을 정의할 때 핵심은 동질형 데이터의 모음으로 구성된 타입이다. 이를 원소(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 |