45
I T 2014 소프트웨어공학연구실 5. 프로그래밍 자료형

5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

대 구 가 톨 릭 대 학 교

I T 공 학 부

Ⓒ2014 소프트웨어공학연구실

5. 프로그래밍 자료형

Page 2: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

목 차 2

5.1 개요

5.3 문자열

5.5 포인터

5.7 레코드

5.8 공용체

5.6 구조적 자료형 - 배열

5.4 열거

5.2 단순자료형

Page 3: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.1 개요

데이터 타입(data type)

그 타입의 변수가 가질 수 있는 값들의 집합과 그 값들을 조작(생성, 작성,

소멸, 수정, 분해)하는 연산들의 집합

컴퓨터 프로그램은 데이터를 조작함으로써 결과를 생성

데이터 타입이 실세계의 문제 공간과 얼마나 잘 일치하는가?

따라서, 프로그래밍 언어는 적절하고 다양한 데이터 타입과 데이터 구조를

제공해야 함

프로그래밍 언어는 기본 자료형과 사용자 정의 자료형으로 나뉨

기본 자료형 : 해당 언어에서 기본적으로 제공 (예:정수,부동소수점 타입)

사용자 정의 자료형 : 기본 데이터 타입을 이용하여 사용자가 생성 (예:레코

드 타입)

3

Page 4: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.2 단순자료형

단순자료형(기본 자료형)

다른 데이터 타입으로 정의되지 않는 프로그램 언어에서 기본적으로 제공하는 데이터 타입

언어에 내장된 단순 자료형들

종류

수치 타입

정수

부동소수점

불린 타입

문자 타입

4

Fortran 77 C Java Ada

INTEGER

REAL

LOGICAL

CHARACTER

DOUBLE

COMPLEX

Int

short

long

float

double

char

int

short

byte

long

float

double

char

Boolean

integer

float

boolean

character

natural

duration

priority

Page 5: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.2 단순자료형 - 수치 타입(1)

1) 정수(integer) 타입 주요 관심사항은 정수 값을 표현하는 데 사용하는 바이트 수

FORTRAN과 같은 언어는 한 가지 크기만을 제공

Java와 C와 같은 언어는 여러 가지 크기를 제공

부호 없는 정수(unsigned integer) 타입

C나 C++ 언어에서 제공

0과 양의 정수만 표현하며, unsigned로 시작되는 타입

예) Java의 정수 타입 C/C++의 정수 타입

5

타입 크기

byte 1바이트

short 2바이트

int 4바이트

long 8바이트

타입 크기

short int 2바이트

unsigned short int 2바이트

int 2바이트 of 4바이트

unsigned int 2바이트 of 4바이트

long int 4바이트

unsigned long int 4바이트

Page 6: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.2 단순자료형 - 수치 타입(2)

2) 부동 소수점(floating-point) 타입

실수를 표현하기 위해 사용

최근 대부분의 컴퓨터들은 IEEE 754 표준 형식을 사용

4바이트 크기의 float와 8바이트 크기의 double 타입 제공

C언어는 sizeof를 사용하여 데이터 타입의 크기를 알 수 있음

예) float 타입과 double 타입의 크기 확인

6

printf("float: %dbytes\ndouble: %dbytes", sizeof(float), sizeof(double));

Page 7: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.2 단순자료형 - 수치 타입(3)

IEEE 754 표준 형식

단일 정밀도가 float 타입에 해당, 이중 정밀도가 double 타입에 해당

단일 정밀도는 이중 정밀도에 비해 연산 속도는 빠르지만, 정밀도는 떨어짐

7

64bit 이중 정밀도 실수 : bias는 1023

32bit 단일 정밀도 실수 : bias는 127

Page 8: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.2 단순자료형 – 불리언(booloan) 타입

불리언(boolean) 타입

값 범위는 단지 2개의 원소로 구성 : 참(true), false(거짓)

ALGOL60에서 처음 도입

불리언 타입 데이터에 대한 대표적인 연산자 : and, or, not

C++

and 연산자는 &&, or 연산자는 ||, 그리고 not 연산자는 !

프로그램에서 스위치(on,off)나 플래그 비트의 표현에 사용

8

x y x and y x or y not x

true true true true false

true false false true false

false true false true true

false false false false true

Page 9: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.2 단순자료형 - 문자(character) 타입

문자(character) 타입

예) C 언어의 문자 타입

대부분의 언어의 문자는 ASCII 코드로 저장

ASCII 코드 : 0~127까지 총 128개의 문자를 허용하는 7bit 코드

영어 대문자, 소문자, 수학 기호, 제어 문자와 escape 기호를 포함

확장된 ASCII 코드 : 128 문자를 더 추가

유니코드

ASCII로 표현할 수 없는 나라별 언어 표현 가능

Java, C#에서 사용

9

ch = ‘a’;

Page 10: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.3 문자열 타입(1)

문자열 타입

예) C언어의 문자열 타입

FORTRAN과 ALGOL60은 수치 계산을 강조하는 언어로, 문자열 데이

터 처리에 대해서는 빈약함

1960년대 중반에 들어 프로그래밍 언어에 문자열 처리를 위한 기능

들이 크게 요구

변수들이 문자열을 값으로 가질 수 있도록 하는 것

문자들의 순서를 기반으로 하여 관계 연산자를 문자열 비교에 그대로 사

용할 수 있도록 하는 것

=> 이러한 기능을 제공한 첫 번째 언어가 PL/Ⅰ

10

printf( “Hello”);

Page 11: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.3 문자열 타입(2)

PL/I : 문자열과 관련된 여러 연산 제공

| : 문자열과 문자열 연결

LENGTH : 문자열의 길이를 알아내는 연산

SUBSTR(A, I, J) : 문자열 A의 I번째 문자부터 J개 문자열 추출

INDEX(A, B)

문자열 A에서 문자열 B의 위치를 찾아 정수값으로 반환

문자열 A에 문자열 B가 없으면 0을 반환

VERIFY(A, B)

문자열 A에서 문자열 B에 속하지 않는 첫번째 문자의 위치를 정수값으로 반환

문자열 B에 속하지 않는 문자가 없으면 0을 반환

TRANSLATE(A, B, C)

문자열 A에서 C에 해당하는 문자를 문자 B로 교체

11

DCL A CHAR(10); -> 문자열의 길이가 10인 문자열 변수 A 선언, 문자열의 길이가 10보다 작으면 공백으로 채워짐

A = 'PROGRAMMING ' | 'LANGUAGE' ‘PROGRAMMING LANGUAGE’

VERIFY(B, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')

TRANSLATE(B, ‘_’, ‘-’)

-->

-> 영문자가 아닌 문자의 위치를 찾아 반환

-> 문자열 B에서 ‘-’를 ‘_’로 교체

Page 12: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.3 문자열 타입(3)

Pascal

PL/I의 문제점 보완

문자열 타입 구현 어려움 문자열을 기본 타입에서 제외

실행 시간면에서 비효율적 배열을 이용한 문자열 처리

예: char 타입의 배열을 이용해 문자열 저장이 가능한 name 선언

Java

char 배열을 이용한 문자열 처리 가능

string 클래스를 이용한 문자열 처리

C/C++

char 배열을 이용한 문자열 처리 가능

Char 포인터를 이용한 문자열 처리 가능

C++ : string 클래스를 이용한 문자열 처리 가능

12

var name: array[1…20] of char;

string str = “programming”;

char[ ] str = {'p', 'r', 'o', 'g', 'r', 'a', 'm', 'm', 'i', 'n', 'g'};

char *str = “programming”;

string str = “programming”;

char str[] = “programming”;

Page 13: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.4 열거 타입(1)

사용자 정의 순서 타입(User defined ordinal types)

순서 타입(ordinal type)

변수가 가질 수 있는 값들을 나열해 놓은 타입

가능한 값의 범위가 양의 정수 집합과 연관

종류

열거(enumeration) 타입, 부분범위(subrange) 타입

13

Page 14: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.4 열거 타입(2)

열거 타입(enumeration type) 열거 타입에서 가질 수 있는 모든 값들은 타입 정의에서 정해지는

이름 상수

이름 상수를 열거 상수라 함 Ada의 예

type DAY is (Mon, Tue, Wed, Thu, Fri, Sat, Sun);

C의 예 enum day {Mon, Tue, Wed, Thu, Fri, Sat, Sun}; enum month {JAN=1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP,

OCT, NOV, DEC}; enum day currentDay;

열거 타입은 가독성을 향상시키기 위해 사용

C++에서는 열거 타입 변수에 수치 값을 배정하면 오류 캐스트 연산자 사용하여 명시적인 타입 변환으로 해결

14

Mon, Tue, …, Sun의 열거 상수에는 정수값 0,1,…,6이 묵시적으로 할당됨

임의의 정수를 명시적으로 할당할 수도 있음 JAN에는 1, FEB에는 2가 할당

정의된 enum day 타입을 이용해 변수 currentDay를 선언

currentDay가 가질 수 있는 값은 Mon, Tue, …, Sun임

if (currentDay == 0) if (currentDay == MON)

currentDay = MON; currentDay = 0;

currentDay = (day)0;

Page 15: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.4 열거 타입(3)

부분범위 타입(subrange type)

미리 정의된 열거 타입 또는 정수의 부분 집합을 값으로 하는 타입

Pascal과 Ada에서 제공

Ada에서는 subtype을 사용해서 부분 범위 타입을 정의

type Days is (Mon, Tue, Wed, Thu, Fri, Sat, Sun);

subtype Workdays is Days range Mon . . Fri;

today : Workdays;

today := Tue;

장단점

판독성 향상 : 변수의 값 범위를 보다 명확히 함

신뢰성 향상 : 범위 밖의 값 배정 시 컴파일러나 실행 시간 시스템에 의해 오류로 검출

Ada 95를 제외한 다른 언어에서는 부분범위 타입을 제공하지 않음

15

-> Days라는 열거 타입 정의

-> Days 타입의 부분 집합을 값으로 하는 부분범위 타입인 Workdays 정의

-> 정의된 Workdays 타입의 변수 선언

-> 변수 today에 workdays 타입에 속하는 값의 배정

Page 16: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.5 포인터(1)

포인터(Pointer)

포인터 : 다른 객체를 가리키는(point) 데이터 타입

값의 범위로 메모리 주소 또는 nil을 갖는 타입

nil : 유효한 주소가 아니며, 아무런 객체를 가리키고 있지 않음을 의미

포인터 변수 : 변수가 임의의 객체를 참조하기 위해 메모리 주소를 값으로 갖는 변수(데이터를 저장하는 변수가 아님)

포인터의 용도 : 동적 기억장소 관리를 위해 사용

실행시간까지 데이터 크기(개수)를 알 수 없는 프로그램

포인터를 이용해 프로그램 실행 중에 필요에 따라 동적으로 기억장소를 할당 받아 데이터를 저장

초기의 언어에는 포인터 개념이 포함되지 않았으나, Ada, Pascal, C, C++ 등 최근 언어들은 포인터 개념을 제공

포인터는 타입 연산자를 사용하여 정의

C, C++ : *

Ada : access

Pascal : ↑

16

Page 17: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.5 포인터(2)

포인터 개념

C 예

포인터 변수 선언 시, 변수 이름 앞에 * 를 붙임

ptr : 포인터 변수

int 타입의 데이터를 저장하고 있는 메모리 주소를 저장

선언이 아닌 실행 문장에서 포인터 변수 앞에 *를 붙이면, ptr이 가리키는 곳을 의미(여기서 *를 역참조 연산이라 함)

* : 내용(역참조) 연산자, & : 주소 연산자

17

int a=3; int *ptr; ptr = &a; printf("%d", *ptr);

Page 18: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.5 포인터(3)

Ada를 이용한 동적 메모리 관리

18

01 with TEXT_IO;

02 use TEXT_IO;

03 procedure pointer is

04 package INT_IO is new TEXT_IO.INTEGER_IO (integer);

05 use INT_IO;

06 type list;

07 type ptrList is access list;

08 type list is record

09 data: integer;

10 next: ptrList;

11 end record;

12 ptr: ptrList;

13 begin

14 ptr := new list'(10, null);

15 ptr.next := new list'(20, null);

16 put(ptr.data);

17 put(ptr.next.data);

18 end pointer;

Page 19: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.3 포인터(4)

예) Pascal type nodeptr =↑node; node = record number:real; next:nodeptr end

var x, y : nodeptr; x, y : nodeptr 형의 포인터 변수 ...

new(x); new(x) : node 형의 객체 생성 (x의 지정)

...

dispose(x) dispose(x) : x에 배정된 객체 소멸

19

• x : node형 객체를 가리키는 포인터 변수

x↑: node 형 객체 (무명 변수(anonymous variable))

x↑.number : x가 가리키는 객체의 실수부분

x↑.next : x가 가리키는 객체의 포인터 부분

• 연산 - 지정연산, 동등연산, 역참조(dereference)

• 포인터 상수 – nil (널 포인터)

• 수명(life time) - 생성(new())부터 소멸(dispose())까지

Page 20: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.5 포인터(5)

참조 타입

C++는 참조 타입이라는 포인터 타입을 추가적으로 제공

참조 타입 변수는 변수 선언과 동시에 반드시 주소값으로 초기화되어야 함

그 후에는 다른 변수를 참조하도록 변경될 수 없음

참조 타입 변수는 선언할 때 변수 이름 앞에 &를 붙임

주로 함수 정의에서 형식 매개 변수를 위해서 사용

C++ 예

참조타입 변수 ref 선언 후, val과 ref는 이름만 다른 같은 변수가 됨

3행 실행 후 val도 20이 됨

20

int val = 10; int &ref = val; ⋮ ref = 20;

ref와 val은 서로 alias

Page 21: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.5 포인터(6)

Java

안정성을 향상시키기 위해 주소를 직접 다루는 포인터 타입을 완전히 없앰

C++의 참조 타입을 확장한 형태의 기능을 두고 있음

C#

Java의 참조와 C/C++의 포인터를 모두 제공

21

Page 22: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.5 포인터 – 문제점(1)

1) 허상 포인터(Dangling pointer)

포인터 변수가 더 이상 의미 없는 것을 가리키고 있을 때, 이 포인터를 말함

PL/I, Pascal, C에서는 발생 가능하지만, Algol 68에서는 불가능

허상 포인터가 가리키는 장소, 혹은 그 현상을 허상 참조 (dangling reference)라고 함

C언어에서 허상 포인터의 예

22

void main() { int *m; { int n; m=&n; n=4; …… } // n을 선언한 블록이 끝남. 즉, n의 기억장소는 회수됨 ..... // m은 허상참조가 됨 }

Page 23: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.5 포인터 – 문제점(2)

2) 쓰레기(garbage)

garbage는 할당되었으나 프로그램에서 접근할 수 없는 기억장소를 말함

사용자 프로그램에 의해 더 이상 접근할 수 없는 힙-동적 변수

C언어에서 garbage의 예1

23

void main() { { char *ptr; ptr=(char *) malloc(24*sizeof(char)); //heap 영역에서 24개의 문자를 기억할 수 있는 공간 할당 ...... } // 포인터 ptr의 영역이 끝남. *ptr은 접근 불가능 }

프로그램 실행 시 포인터 ptr은 회수되고, 힙 영역의

문자열 기억 장소는 더 이상 액세스 할 수 없는

garbage가 됨

Page 24: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.5 포인터 – 문제점(3)

C언어에서 garbage의 예2

24

void main() { char *ptr1=“this is a string”; char *ptr2=“this is another string”; ...... ptr1=ptr2; ...... }

ptr1이 가리키던 “this is a string”은 더 이상 액세스 할 수 없는

garbage가 됨

Ptr1, ptr2가 선언되었을 때

ptr1=ptr2를 실행한 후

Page 25: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.5 포인터 - 문제점(4)

Garbage는 기억 장소가 낭비되지만, 허상 참조(dangling reference)를 가지는 프로그램보다는 문제가 작음

내부적으로 바르게 동작하므로 기억 장소가 부족하지 않다면 바른 결과를 생성할 수 있음, 그러나 기억 장소가 부족하면 실행이 중단됨

허상 참조(dangling reference)를 가지는 프로그램은 실행은 되지만, 내용이 바뀌거나 위치를 알기 어려워 실행 시간 에러를 야기하여 틀린 결과를 낼 수 있음

Garbage를 자동적으로 재활용하는 시스템을 garbage collection이라고 함

포인터의 평가

허상 포인터와 쓰레기 문제를 유발시키지만 대부분의 언어에서 제공

동적 데이터 구조를 정의하는 수단으로 사용

Linked list, tree

힙(heap)에서 동적 기억 장소를 관리하는 메커니즘을 제공

25

Page 26: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.6 배열(1)

구조적 자료형(structured data type)

여러 데이터를 묶어서 하나의 단위로 처리하는 자료형

배열, 레코드, 공용체

배열(array)

첫 번째 원소의 상대적 위치로 원소를 식별하는 동질형 데이터 원소(homogeneous data elements)의 집합

배열 원소의 참조 : 배열 이름, 첨자

FORTRAN, PL/1, Ada 예 : A(3)

소괄호를 이용해서 배열 원소를 나타냄

문제점 : 부프로그램 호출 형식과 유사하여 구별이 어려움

ALGOL 60, Pascal, C, C++, Java, C# 예 : A[3]

대괄호를 이용해서 배열 원소를 나타냄

부프로그램 호출과 쉽게 구분 가능

26

Page 27: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.6 배열(2)

첨자 범위

프로그래머가 명시

어떤 언어에서 첨자 범위의 하한은 묵시적임

C 기반 언어의 하한 : 0

FORTRAN 95의 하한 : 1

Ada는 첨자 범위를 프로그래머가 지정해야 함

A: array (-2..2) of integer

배열 연산

Fortran, Algol60

배열 원소에 대한 연산만 가능

APL, PL/I, Algol68

배열 배정 연산

A←B, A = B, A:=B

PL/I 예) DCL A(10,10), B(10)

배열 복사 => B = A(i , *)

27

Page 28: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.6 배열 - 초기화

배열 초기화

배열이 기억 장소에 할당되는 시간에 그 배열을 초기화하는 것

FORTRAN : data문에 의해 초기화

INTEGER LIST(3)

DATA LIST/0, 5, 5/

C : 선언문에서 초기화

int list[ ] = {0, 5, 5}

char name[ ] = "cho"

char *names[ ] = {"Bob", "Jake", "Darcie"}; // 스트링 배열

java :

String[ ] names = ["Bob", "Jake", "Darcie"];

Ada : 2가지 초기화 방법 제공

① 값들을 저장하는 순서대로 나열하는 방법 LIST : array (1 . . 5) of INTEGER := (1, 3, 5, 7, 9);

② 값들을 => (arrow) 연산자를 사용하여 인덱스 위치에 직접 배정하는 방법 LIST : array (1 . . 5) of INTEGER := (1 => 3, 3 => 4, others => 0);

Pascal과 Modula-2는 선언부에서 배열 초기화를 허용하지 않음

28

Page 29: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.6 배열 - 배열 유형(1)

배열의 유형

① 정적 배열(static array)

첨자 범위가 정적으로 바인딩

기억장소 할당이 정적으로 바인딩

장점 : 효율성 좋음(즉, 동적 기억장소 할당 및 회수가 불필요_)

C, C++에서 static 명시자를 사용하여 선언한 배열

② 고정 스택-동적 배열(fixed stack-dynamic array)

첨자 범위가 정적으로 바인딩

기억장소 할당은 선언문을 포함하는 프로시저가 활성화할 때 바인딩

장점 : 기억장소 공간을 효율적으로 사용(동일 공간을 여러 프로시저의 배열이 사용할 수 있음)

C와 C++ 함수에서 선언된 배열(static 명시자를 포함하지 않는)

Pascal의 procedure에서 선언된 배열

29

Page 30: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.6 배열 - 배열 유형(2)

③ 스택-동적 배열(stack dynamic array)

첨자 범위가 동적으로 바인딩

기억장소 할당이 동적으로 바인딩

첨자 범위와 기억장소가 그 배열의 수명(lifetime) 동안 고정됨(변경불가)

장점 : 정적 배열과 고정 스택-동적 배열에 비해 유연성이 좋음

단점 : 배열을 사용할 때까지 배열의 크기를 알 수 없음

Ada의 배열 예

④ 힙-동적 배열(heap-dynamic array)

첨자 범위, 기억장소 할당이 동적으로 바인딩

그 배열의 수명(lifetime) 동안 변경이 가능

최고의 유연성 : 배열의 크기가 동적으로 변경(프로그램 실행 중 필요한 기억장소 공간이 변화함에 따라 커지거나 줄어들 수 있음)

30

GET (LIST_LEN); declare

LIST : array (1 .. LIST_LEN) of INTEGER;

Page 31: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.6 직사각형 배열과 톱니형 배열

직사각형 배열(Rectangular Array)

모든 행이 동일 개수의 원소를 포함하고, 모든 열이 동일 개수의 원소를

포함하는 다차원배열

Fortran, Ada, C#

원소 참조 예 : myArray[3,7]

톱니형 배열(Jagged Array)

행의 크기가 동일하지 않는 다차원배열

C, C++, Java, C#

원소 참조 예 : myArray[3][7]

31

Page 32: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.6 배열 - 슬라이스

배열 슬라이스(Slice)

배열의 슬라이스는 배열의 부분구조(substructure)

예) Fortran 95

Integer Vector(1:10), Mat(1:3,1:3), Cube(1:3,1:3,1:4)

32

Vector

Mat

Cube

Page 33: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.6 배열 - 원소 주소 계산방법(1)

다차원 배열을 1차원 배열로의 mapping(메모리 저장방식)

예 : int A[3][2];

행우선 순서(row major order) : 대부분의 언어

열우선 순서(column major order) : FORTRAN

33

Page 34: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.6 배열 - 원소 주소 계산방법(2)

배열 원소의 주소 계산

1차원 배열 A[i]의 주소

2차원 배열 A[i][ j]의 주소

34

a : 첫 번째 원소의 첨자 base : 배열의 시작 주소 size : 각 원소의 크기

A[i]의 주소 = base + (i - a) × size

행 중심 저장 방식 : A[i][j]의 주소 = base + (m×(i-a) + (j-a)) × size

열 중심 저장 방식 : A[i][j]의 주소 = base + (n×(j-a) + (i-a)) × size

a : A[n][m]의 첫 번째 원소의 행과 열의 첨자 base : 배열의 시작 주소 size : 각 원소의 크기

Page 35: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.7 레코드(1)

레코드(Record)

집합체의 원소를 이름으로 식별하는 이질형 데이터 원소들의 집합

1960년 초반 COBOL에서 소개, 이후의 대부분의 언어에서 사용

C : struct 데이터 타입으로 지원

C++, C# : 캡슐 구조체(encapsulation structures)로 사용

레코드 정의와 선언 예 : Pascal

name, number, address 데이터를 하나의 레코드로 묶음

정의된 레코드인 student 타입의 변수 A 선언

35

type student = record name: packed array[1..20] of char; number: integer; address: packed array[1..30] of char end;

var A: student;

Page 36: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.7 레코드(2)

레코드 정의와 선언 예 : C 레코드 정의와 선언 예 : Ada

레코드 타입 변수 A의 구조도

■ 필드(field) : 레코드를 이루고 있는 데이터

■ 필드 접근 시, C/Pascal/Ada는 변수 이름, 필드 이름 사용

예 : 변수 A의 number 필드에 10 저장하기

A.number = 10; ⋯ C

A.number := 10; ⋯ Pascal, Ada

NUMBER OF A ⋯ COBOL

36

struct student { char name[20]; int number; char address[30]; }; struct student A;

type student is record name: string (1..20); number: integer; address: string (1..30); end record; A: student;

Page 37: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.7 레코드(3)

C 언어

레코드 선언

레코드 필드의 참조

37

Page 38: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.7 레코드(4)

다른 레코드를 필드로 지정할 수 있음

Ada 예 : student 레코드의 grade 필드가 score 레코드 타입

math 필드 접근 방법 : A.grade.math

38

type score is record korea: integer; math: integer; computer: integer; end record; type student is record name: string (1..20); number: integer; address: string (1..30); grade: score; end record; A: student;

중첩된 레코드 타입 변수 A의 구조도

Page 39: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.7 레코드(5)

레코드 연산

Ada : 한 번에 레코드 타입 변수의 모든 필드에 값 배정 가능

Ada : 동등 연산자 적용 가능

C/C++ 레코드에 대해서는

동등 연산자 적용 불가능

39

type score is record korean: integer; math: integer; computer: integer; end record; student: score; student := (70, 80, 90);

type score is record math: integer; computer: integer; end record; student1, student2: score; student1 := (70, 80); student2 := (70, 80); if student1 = student2 then put("equal"); else put("not equal"); end if;

Page 40: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.7 레코드(6)

레코드 타입의 구현

레코드의 필드들을 인접한 메모리 위치에 저장

필드는 오프셋 주소(offset address)에 의해 접근

40

레코드의 컴파일 시간 서술자

Page 41: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.8 공용체(1)

공용체(Union)

레코드(구조체)와 형식이 유사

모든 필드가 같은 메모리를 공유하면서 필요에 따라 한 필드만을 사용

할 수 있음

여러 타입의 필드 중 상황에 따라 한 멤버만을 필요로 하는 경우에 사용

Fortran의 EQUIVALENCE문, C/C++의 union

C의 공용체 예

41

Page 42: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.8 공용체(2)

C/C++ 공용체 예

liter 필드 접근 방법 : A.liter

프로그래밍 예

42

union product { float liter; int number; char name[10]; }; union product A;

공용체 타입 변수 A의 구조

switch(type) { case DRINK: printf("%f\n", A.liter); break; case FRUIT: printf("%d\n", A.number); break; case FLOWER: printf("%s\n", A.name); break; default: printf("bad type\n"); }

type은 A의 상품 종류를 위한 변수

Page 43: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.8 공용체(3)

Ada 언어 : 가변 레코드 - 판별자 이용

예) 판별자 kind에 따라 사용되는 필드가 달라짐

정의된 가변 레코드 product 타입의 변수 선언

각 필드에 값을 배정하는 문장

43

type Class is (DRINK, FRUIT, FLOWER); type product(kind: Class) is record name: string(1..5); no: integer; case kind is when DRINK => liter: float; when FRUIT => size: integer; number: integer; when FLOWER => bunch: integer; end case; end record;

goods1: product(DRINK); goods2: product(FRUIT);

goods1 : name, no, liter 필드로 이루어짐 goods2 : name, no, size, numbe 필드로 이루어짐

goods1.name := "cider"; goods1.no := 1; goods1.liter := 1.5; goods2:= (kind=>FRUIT, name=>"apple", no=>2, size=>3, number=>5);

Page 44: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.8 공용체(4)

Ada 예)

44

Page 45: 5. 프로그래밍 - KOCWcontents.kocw.net/KOCW/document/2014/deagucatholic/... · 2016-09-09 · C나 C++ 언어에서 제공 0과 양의 정수만 표현하며, unsigned로 시작되는

5.8 공용체(5)

공용체의 평가

공용체는 안전하지 않은 구조

Fortran, C, C++는 공용체의 참조에 대해 타입 검사를 허용되지 않음

공용체는 유연성을 제공

공용체의 사용은 사용자의 주의를 요함

Java, C#은 안정성을 위해 공용체를 제공하지 않음

45