• 검색 결과가 없습니다.

4. 변수 및 바인딩

N/A
N/A
Protected

Academic year: 2022

Share "4. 변수 및 바인딩 "

Copied!
41
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

대 구 가 톨 릭 대 학 교 I T 공 학 부

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

4. 변수 및 바인딩

(2)

목 차

2

4.1 변수

4.2 바인딩

4.3 변수의 영역

4.4 기억장소 할당과 수명 그리고 참조 환경

4.5 변수 잡동사니

(3)

4.1 변 수

변수(Variable)

기억장치의 한 장소를 추상화 한 것

실행시간에 저장된 값이 변경될 수 있는 객체

변수의 속성

 이름, 주소, 값, 타입, 영역, 수명

변수의 도식 표기법

 예

3

(4)

4.1 변수 속성 – 이름

이름(name)

프로그램에서 어떤 개체를 식별하기 위해 사용되는 문자들의 스트링

프로그램의 구성요소를 구별하게 해주는 역할

이름을 식별자(identifier)라 부르기도 함

예약어(reserved word)는 이름으로 사용될 수 없음

모든 프로그래밍 언어에서 사용되는 이름은 고유한 설계 특징을 가짐

이름 최대 길이는 몇 글자인가?

FORTRAN 95 : 31자까지 허용

C++, Java, Ada : 이름 길이에 제한 없음 -> 프로그래머 스스로 길이제한

사용할 수 있는 문자의 집합은 무엇인가?

밑줄(_) : C - 허용, FORTRAN, COBOL, HTML - 허용 안함

C 기반 언어 (C, C++, Java, C#) 에서 “camel” 표기로 대체 (예: myStack)

공백 : FORTRAN – 허용하되 무시됨

대소문자를 구분하는가?

FORTRAN, COBOL : 대문자만 사용

HTML : 대소문자 구분 안함

C 기반 언어 (C, C++, Java, C#) : 대소문자 구분 -> 가독성 떨어뜨림 (예: rose, ROSE, Rose)

특수어를 이름으로 사용할 수 있는가?

While, for, break 등의 예약어를 변수로 사용할 수 없음 4

(5)

4.1 변수 속성 - 주소

주소(address)

 변수의 값이 저장될 메모리 주소

 변수의 타입에 따라 변수에 할당되는 메모리의 크기에는 차이가 있음

 예)

 x는 4바이트 크기

 ch는 1바이트 크기

 C/C++에서 변수의 시작 주소를 알아내려면 변수 이름 앞에 &를 붙이면 됨

5

int x;

char ch;

printf(“%p”, &x);

(6)

4.1 변수 속성 - 값

값(value)

 변수의 주소에 저장된 내용

 변수의 값은 배정문에 의해 부여됨

x의 주소에 값 20을 저장한다는 의미 y의 값을 x의 주소에 저장한다는 의미

 l-value와 r-value

6

x = 20;

x = y;

(7)

4.1 변수 속성 - 타입

타입(type)

 변수가 가질 수 있는 값의 범위와 그 값에 대해 수행할 수 있는 연산 의 집합

 예) C++

 변수 x

 -2,147,483,648 ~ 2,147,483,647의 값을 가질 수 있음

 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 연산을 수행

 변수 check

 TRUE 또는 FALSE의 값을 가질 수 있음

 and, or, not 등의 연산을 수행

7

int x;

bool check;

(8)

4.1 변수 - 선언문(1)

선언문(declaration statement)

 변수에 이름과 타입 등의 속성을 부여하는 문장

 예)

8

int score[100]; 속성(attribute) 의미

이름(name) score

타입(type) 1차원 배열

배열 요소의 수 100

배열 첨자 범위 0 ~ 99

각 요소의 자료형 정수

(9)

4.1 변수 - 선언문(2)

 선언의 종류

명시적 선언(explicit declaration)

 선언문을 사용하여 변수 이름을 나열하고 이들에 속성을 부여하는 방법

 1960년대 중반 이후의 대부분의 언어에서 사용

예) C 언어

묵시적 선언(implicit declaration)

 선언문을 사용하지 않고 디폴트 규칙에 의해서 변수에 속성을 부여하는 방법

 예) FORTRAN

선언문 없이 변수 이름을 그냥 사용하면 그 이름이 선언된 것으로 간주

변수 이름이 I, J, K, L, M, N으로 시작하면 정수 타입으로, 그렇지 않으면 실수 타입으로 간주

9

int x;

(10)

4.1 변수 - 선언문(3)

 선언문의 역할

보다 효율적인 주기억 장치 사용과 액세스가 가능

 사용할 변수들의 크기, 유형 등에 관한 정보 제공

-> 컴파일러는 이 정보에 따라 효과적인 기억장치 액세스가 가능

보다 효율적인 주기억 장치 관리가 가능

 자료 구조의 크기, 생성 및 소멸 시기 등에 관한 정보를 컴파일 시간 에 알 수 있음

-> 보다 효율적인 기억 장소 할당 기법 사용 가능

컴파일 시간에 변수의 타입 검사 가능

 서로 맞지 않은 연산자와 변수 형이 연관되어 있는 의미 없는 수식을 컴파일 시간에 미리 알아낼 수 있음

-> 프로그램 오류 줄이는데 큰 역할

10

(11)

4.1 변수 - 배정문 (1)

배정문(assignment statement)

 변수의 내용을 변경시키는 기본 연산

변수의 현재 값을 수식에 의해 기술된 값으로 바꾸는 단순문

 프로그램에서 가장 일반적인 연산문 중의 하나

 여러 가지 언어의 배정문 형식

11

프로그래밍 언어 배정문 형식

Pascal, Algol X := Y

C, C++, Perl, Java, FORTRAN X = Y

COBOL MOVE Y TO X

APL X ← Y

(12)

4.1 변수 - 배정문 (2)

자료 형태에 따른 l-value와 r-value의 사용 예

① 모든 변수 이름들은 l-value와 r-value를 가짐. 즉, 그 변수 값을 보 유할 위치와 값을 가짐

② 만일 A가 배열이라면, A[i]의 l-value는 배열 A에서 i번째 원소의 위치를 의미하며, A[i]의 r-value는 그 위치에 저장되어 있는 값

③ 10과 같은 상수는 r-value만 보유할 분 l-value는 갖지 못함

④ ip가 포인터인 경우, ip의 r-value는 ip가 지적하는 위치가 되며, l-value는 ip자신의 값이 들어 있는 위치를 의미함.

12

자료형

l-value r-value

변수 변수의 주소 변수의 값

배열 A[i] i 번째 원소의 주소 원소 A[i]에 저장된 값

상수 10 없음 값 10

포인터 *ip Ip 자신의 주소 다른 변수의 l-value (ip가 지적하는 주소)

(13)

4.2 바 인 딩 (1)

바인딩(Binding)

변수에 변수와 관련된 속성을 연관시키는 것

이름에 속성을 연관시키는 과정

예) Java 선언문 int x = 2;

이름 x에 정수 타입과 값 2가 연결됨

바인딩 시간(Binding time)

바인딩이 일어나는 시간

바인딩 시간에 따른 바인딩 분류

정적 바인딩(static binding)

실행 시간 전에 바인딩이 발생하고, 프로그램 실행 과정에서 변하지 않은 상태로 유지되는 바인

예) 정수 타입을 이름 x에 정적으로 바인딩

동적 바인딩(dynamic binding)

실행 시간 중에 바인딩이 발생하거나 프로그램 실행 과정에서 변경되는 바인딩

예) 할당한 기억장소를 ptr에 동적으로 바인딩 13

int x;

ptr = new int;

(14)

4.2 바 인 딩 (2)

세분화된 바인딩 시간

14

바인딩 시간 설명

언어 정의 시간 프로그래밍 언어를 정의할 때 이루어지는 바인딩 언어 구현 시간 언어에 대한 번역기를 구현할 때 이루어지는 바인딩

번역 시간 원시 프로그램을 번역할 때 이루어지는 바인딩

링크 시간 프로그램을 라이브러리와 링크할 때 이루어지는 바인딩 적재 시간 프로그램의 실행을 위해 메모리로 적재할 때

이루어지는 바인딩

실행 시간 프로그램을 실행할 때 이루어지는 바인딩

빠른 바인딩 -효율성 증가

늦은 바인딩 -융통성 증가

(15)

4.2 바 인 딩 (3)

타입(type) 바인딩

 타입은 프로그램에서 참조(reference)되기 전에 바인딩되어야 함

 타입 바인딩의 고려 사항 : 타입의 명시 방법, 타입 바인딩의 시기

동적 타입 바인딩

배정문에서 값이 배정될 때 타입이 바인딩 (Javascript, PHP)

프로그래밍 유연성이 향상

예) Javascript에서

단점

컴파일러의 오류 검출 능력을 감소

실행 시간이 증가 -> 대부분의 바인딩을 실행시간에 수행

인터프리터 형 언어 : 동적 바인딩

명시적 선언을 요구하지 않고, 실행 시간에 변수의 값을 지정할 때 까지 변수의 형을 바인딩하지 않음

15

List = [10.2, 3.5] // length 2의 일차원 배열 . . .

List = 47 // scalar 변수

(16)

4.2 바 인 딩 (4)

바인딩 시간의 중요성

프로그래밍 언어들간의 가장 중요하고 미묘한 차이점들은 대부분 바인딩 시 간의 차이에서 발생

번역 시간 바인딩과 실행 시간 바인딩의 장단점은 효율성(efficiency)과 융통 성(flexibility)의 상반된 이해 관계와 관련

 실행 효율성을 중시하는 언어

Fortran, COBOL, Algol 과 같은 컴파일러 언어

가능한 많은 바인딩이 번역하는 동안에 이루어지도록 설계된 언어

 융통성을 중시하는 언어

SNOBOL 4, APL, LISP 과 같은 인터프리터 언어

대부분의 바인딩을 자료에 맞출 수 있도록 많은 바인딩을 실행 시간까지 지연

 효율성과 융통성을 모두 고려하여 설계한 언어

PL/I

프로그래머가 바인딩 시간을 선택할 수 있는 일부 선택권을 가짐 16

(17)

4.3 변수의 영역(1)

블록(block)

 일련의 문장 집합으로 자체적인 선언을 가질 수 있는 프로그램 단편

 ALGOL 60에서의 블록 표현

 블록 개념을 처음 도입한 언어

 begin~end 로 묶어 블록을 표현

 임의의 블록 내의 선언: 지역적(local)

 블록 밖의 선언: 비지역적(nonlocal)

 변수 x와 y는 블록 b에 대해 지역적이지만 블록 a에 대해서는 비지역적

 Ada에서의 블록 표현

 declare로 시작하는 begin~ end

 선언문이 없는 경우, declare 생략하여 표현

17

declare 선언문 begin 문장들 end;

begin 문장들;

end;

(18)

4.3 변수의 영역(2)

 C기반 언어의 블록

 중괄호로 묶어 표현

 예) 두 개의 블록 구조

 func 본체를 나타내는 블록

 func 본체 안에 내포된 블록

지역 변수(local variable)

 블록 안에서 선언된 변수

비지역 변수(non-local variable)

 블록 내부에서 가시적이지만, 그곳에 선언되어 있지 않은 변수

전역 변수(global variable)

 프로그램 전체에서 접근할 수 있는 변수

18

(19)

4.3 변수의 영역(3)

영역(scope)

 이름의 사용이 허락되고 있는 범위

 예)

 변수 x의 영역은 선언된 지점부터 func 함수의 끝까지

 변수가 가시적인(visible) 문장의 범위

가시적(visible) : 변수가 어떤 문장에서 참조될 수 있는 경우

 영역은 비지역 변수의 바인딩을 위해 필요

 정적 영역, 동적 영역

19

(20)

4.3 변수의 영역 (4)

float a, b, c, d;

void main() { int a, b;

a=b=12;

...

{ char b, c;

...

} ...

}

Area A

가시적인 변수

 정수변수 a,b, 실수변수 c,d

 실수변수 a, b(전역변수)는 정수변수 a,b(지역변수)에 가려져 접근 불가

Area B

가시적인 변수

 정수변수 a, 문자변수 b,c, 실수변수 d

 문자변수 b,c -> 지역변수

 액세스 가능한 변수 a,d -> 비지역 변 수

 실수변수 a,b,c,d -> 전역변수

20

Area A

Area B

(21)

4.3 변수의 영역 (5)

정적 영역 규칙(static scope rule)

 이름에 해당하는 변수를 찾을 때, 자신을 포함하고 있는 블록에 서 선언되었는지 살펴보고, 없으면 그 바깥쪽 블록에서 선언되었 는지를 살펴봄

프로그램의 외형적 구조에 의해 결정되는 것

프로시저 정의에 기반을 둠

 대부분의 명령형(컴파일러) 언어에서 사용

 이름의 영역이 정적으로 결정

21

(22)

4.3 변수의 영역 (6)

정적 영역을 위한 ALGOL 예제 정적 영역을 위한 C++ 예제

22

01 a: begin integer i, j; real x, y;

02 b: begin integer x, y;

03 i := x;

04 j := y;

05 end b;

06 c: begin real i, j;

07 x := i;

08 y := j;

09 end c;

10 end a;

블록 b : 변수 x, y는 2행에 선언 변수 i,j는 1행에 선언

블록 a : 블록 b의 i, j에 대해 선언 블록 c의 x, y에 대해 선언

블록 c : 변수 i, j는 6행에 선언 변수 x, y는 1행에 선언

01 #include <iostream>

02 using std::cout;

03 using std::endl;

04

05 int x;

06

07 void func(void) 08 {

09 double x;

10 x = 3.14;

11 cout << x << endl;

12 } 13

14 int main(void) 15 {

16 x = 20;

17 cout << x << endl;

18 func();

19

20 return 0;

21 }

지역변수 전역변수

(23)

4.3 변수의 영역(7)

정적 영역이 적용되는 언어에서 변수 참조

 줄 2의 변수 x의 영역 : 줄 2~끝까지

 프로시저 p의 영역 : 줄 3~끝까지

 프로시저 q의 영역 : 줄 10~끝까지

 줄 4의 변수 x의 영역 : 줄4~줄9

줄 2의 전역변수 x는 프로시저 p에서 접근할 수 없음

줄 2의 전역변수 x의 영역은 프로시저 p가 제외  hole-in scope(영역 구멍) 발생

hole-in scope(영역 구멍)

내포된 블록 사이에 동일 지역 변수 선언하면 바깥 블록의 지역변수는 내부 블록 구간에서 사용 할 수 없는 현상

 Ada, Java : procedure_name.variable_name을 사용 해 결(예 : 프로시저 p에서 main의 x를 접근 -> main.x)

C++ : 영역 지정 연산자(::)를 사용하여 은폐된 전역 변 수를 참조

23

(24)

4.3 변수의 영역 (8)

영역 지정 연산자를 사용하는 C++ 예제 바깥 영역에 선언된 변수에 접근 가능한 Ada 예제

24

01 #include <iostream>

02 using std::cout;

03 using std::endl;

04 05 int x;

06 07 void func(void) 08 {

09 double x;

10 x = 3.14;

11

::x = 30;

12 cout << x << endl;

13 }

14 15 int main(void) 16 {

17 x = 20;

18 cout << x << endl;

19 func();

20 cout << x << endl;

21 22 return 0;

23 }

영역 지정 연산자를 사용하여 전역 변수인 5행의 x를 나타냄

01 with TEXT_IO;

02 use TEXT_IO;

03 procedure Main is

04 package INT_IO is new

TEXT_IO.INTEGER_IO (integer);

05 use INT_IO;

06 x: integer := 10;

07 procedure Sub is

08 x: string(1..3) := "abc";

09 begin

10 Main.x := 20;

11 put(x);

12 end Sub;

13 begin 14 Sub;

15 put(x);

16 end Main;

점 표기법으로 바깥

영역에선언된 변수에 접근 가능

(25)

4.3 변수의 영역(9)

정적 영역은 비지역 변수의 접근 방법을 제공

정적 영역의 문제점

 main에서 선언된 모든 변수는 필요에 관계없이 모든 부프로그램에서 사용 가능

 프로그램이 개발된 후 수정이 필요할 때 문제 발생

예) procedure E가 D의 scope에 접근하도록 수정

E를 D에 내포 -> E는 B의 영역에 접근 못함

D의 변수를 main으로 이동 -> D의 변수가 모든 procedure에서 가시적 25

(26)

4.3 변수의 영역 (10)

동적 영역 규칙(dynamic scope rule)

 이름에 해당하는 변수를 찾을 때, 부프로그램들의 호출 순서에 기반

① 먼저 자신을 포함하고 있는 블록에서 선언되었는지 살펴봄

② 없으면 자신을 포함한 블록(부프로그램)을 호출한 문장을 포함하 고 있는 블록에서 선언된 것인지 살펴봄

③ 해당 변수를 찾을 때까지 반복

프로그램의 실행 순서에 따라 결정되는 것

함수 호출 순서에 기반을 둠(부프로그램의 호출 순서에 의해 영역이 결정)

 이름의 영역이 실행 시에 결정

 APL, SNOBOL 4, LISP 초기 버전에서 적용된 방식

26

(27)

4.3 변수의 영역(11)

 예) 호출 순서

 big -> sub2 -> sub1 : sub2의 x

 big -> sub1 : big의 x

27

(28)

4.3 변수의 영역 (12)

28

program scope_rule;

var x: integer;

procedure sub1;

begin

print(x) end;

procedure sub2;

var x: integer;

begin x := 4;

sub1;

end;

begin

x :=2;

sub2 end;

end.

정적 영역 규칙 사용: 결과 2

동적 영역 규칙 사용: 결과 4

→ 일반적으로 사용되는 규칙이 아님.

오류수정이 곤란

(29)

4.4 기억장소 할당과 수명(1)

기억장소 바인딩

할당(allocation )

변수에 메모리 공간을 바인딩 하는 과정

회수(deallocation)

변수로부터 바인딩이 해제된 메모리 공간을 가용 공간으로 돌려주는 과정

수명(lifetime)

변수가 특정 메모리 주소에 바인딩되어 있는 시간

변수의 수명은 변수가 메모리 공간에 바인딩될 때 시작되고, 회수될 때 종료

 C, Pascal 등의 블록 구조 언어

블록의 시작점에서 지역변수가 할당되고, 블록의 실행이 끝나면 할당되었던 모든 지역 변수의 기억장소가 회수

29

변수 temp :

블록 { } 안의 코드가 실행 될 때 할당,

실행이 완료되면 회수

(30)

4.4 기억장소 할당과 수명(2)

변수의 할당은 수명에 따라 정적 할당, 스택 기반 할당, 동적 할당으로 분류

 변수 할당과 관련된 메모리 구조

 정적 영역은 크기가 정해져 있음

 스택과 힙은 각기 반대 방향으로 영역이 성장할 수 있음

30

(31)

4.4 기억장소 할당과 수명(3)

정적 할당

 변수에 메모리 공간이 정적으로 할당되는 것

 한번 할당되면 프로그램 실행이 종료될 때까지 할당 상태가 그대로 유지

정적 할당이 이루어지는 메모리 공간은 정적 영역

주로 전역 변수가 정적 할당을 함

 But, C와 C++ 에서는 static을 이용해서 지역 변수를 정적으로 할당할 수 있음

31

01 #include<stdio.h>

02

03 int func(void) 04 {

05 static int count = 0;

06 count++;

07 return count;

08 }

09 int main(void) 10 {

11 int i;

12 for (i=0; i<10; i++)

13 printf("%d ", func());

14 return 0;

15 }

count 변수 : 지역변수, 정적할당

 func 함수가 종료되어도 count는 메모리에서 회수되지 않음

(32)

4.4 기억장소 할당과 수명(4)

스택 기반 할당

 자동 할당(automatic allocation)이라고도 함

 변수의 타입은 정적으로 할당되지만 메모리 공간은 실행 시간 중에 할당

스택 기반 할당이 이루어지는 메모리 공간은 스택

주로 지역 변수가 스택 기반 할당을 함

 예) 스택 기반 할당을 하는 지역 변수

메모리에 할당되는 과정

main 함수의 x와 y 할당

func 함수의 a와 x 할당

func 함수의 a와 x 회수

main 함수의 x와 y 회수

32

01 void func(void) 02 {

03 int a;

04 double x;

05 }

06 int main(void) 07 {

08 int x, y;

09 func();

10 }

(33)

4.4 기억장소 할당과 수명(5)

동적 할당

명시적인 명령어에 의해 실행 시간에 할당

동적 할당이 이루어지는 메모리 공간은 힙(heap)

동적으로 할당된 영역은 포인터나 참조 변수를 통해서 참조 가능

실행 시간 중에 삽입/삭제가 자주 발생하는 연결 리스트나 트리 구조에서 흔히 사용

예) 동적으로 메모리를 할당하고 회수하는 C 코드

동적 할당 과정

① prt이 동적으로 할당된 영억을 가리킴 ② prt이 가리키는 영역에 20을 배정 ③ 동적으로 할당된 영역의 회수

33

01 int *ptr;

02 ptr = (int *)malloc(sizeof(int));

03 *ptr = 20;

04 free(ptr);

(34)

4.4 기억장소 할당과 수명(6)

수명(lifetime)에 따른 변수의 분류

① 정적(static) 변수

② 스택-동적(stack dynamic) 변수

③ 명시적 힙-동적(explicit heap-dynamic) 변수

④ 묵시적 힙-동적(implicit heap-dynamic) 변수

34

(35)

4.4 기억장소 할당과 수명(7)

정적(static) 변수

프로그램이 실행되기 전에 메모리 셀에 바인딩되며, 프로그램 실행이 종료될 때까지 동일 한 메모리 셀에 바인딩되어 있는 변수

전역 변수(변수의 수명 = 프로그램 실행 시간 전체)

프로그램 실행 중에 동일한 기억장소에 바인딩되게 하는 것이 필요

C, C++ 에서 static 명시자를 사용하여 선언된 변수

장점

기억장소 위치가 실행 도중에 변하지 않아 바로 접근 가능, 할당과 회수를 위한 실행시간 오 버헤드(overhead)가 없음

단점

정적 변수만을 가지는 언어에서는 재귀적 호출이 지원되지 않음

기억 장소가 변수들간에 공유될 수 없음

C, C++에서는 정적 변수(static variable)를 허용

정적 변수는 한번 할당되는 프로그램 종료 시까지 기억장소가 회수되지 않음 35

01 void sub() { 02 static int i=1;

03 int k=i;

04 printf(“i=%d k=%d”,i,k);

05 i++; k++;

06 }

07 int main(void) 08 {

09 void main() { 10 sub();

11 sub();

12 sub();

13 }

i=1 k=1 i=2 k=1 i=3 k=1

(36)

4.4 기억장소 할당과 수명(8)

스택-동적(stack-dynamic) 변수

변수의 타입은 정적으로 바인딩되지만 기억장소 바인딩은 동적으로 바 인딩되는 변수

변수가 선언된 메서드의 호출 시점에서 기억장소가 할당되고, 반환되는 시점에서 회수

 함수나 메서드 내에서 선언된 지역변수(local variable)

장점

 재귀적 부프로그램을 지원

실행시간에 호출될 때마다 스택에 부프로그램의 지역변수에 대한 기억장소를 할당 하고, 반환될 때 스택으로 할당된 기억장소를 반환

단점

 실행시간 오버헤드(overhead)가 증가

36

(37)

4.4 기억장소 할당과 수명(9)

명시적 힙-동적(explicit heap-dynamic) 변수

 프로그래머에 의해 명시된 명시적 실행 시간 명령어에 의해 기억장소가 할당되고 회 수되는 이름 없는 메모리 셀

힙(heap)이라 불리는 메모리 영역에 기억장소가 할당되고 반환

→ 포인터나 참조 변수에 의해서만 참조

힙(heap)

기억 장소에서 그 일부분이 프로그램들에 할당되었다가 회수되는 작업이 되풀이되는 영역

프로그램들이 요구하는 블록의 크기나 요구/횟수 순서가 일정한 규칙이 없음

실행 시간 중에 크기가 커지거나 줄어드는 것이 필요한 연결리스트나 트리와 같은 동적 구조를 위해 사용됨

 단점

포인터와 참조변수를 사용하는 데 어려움

이러한 변수의 참조, 할당, 회수에 따른 비용이 상승

 C 언어의 malloc(), free() 함수

 C++언어의 new, delete 연산자

37

(38)

4.4 기억장소 할당과 수명(10)

묵시적 힙-동적(implicit heap-dynamic) 변수

값이 배정될 때만 힙 기억장소에 바인딩

장점

 높은 유연성(flexibility)  포괄형 코드 작성을 허용

단점

 모든 동적 속성들(배열 첨자 타입이나 범위)을 유지하기 위한 실행 시간 오버헤드(overhead)

 컴파일러에 의한 오류 검출이 불가능

APL, ALGOL68에서 사용

perl, javascript의 string과 array : 배열의 첨자 타입

38

(39)

4.5 변수 초기화

변수 초기화(variable initialization)

 변수의 선언과 동시에 값을 배정하는 것

 변수가 기억장소에 바인딩되는 시간에 값도 바인딩 되는 것

 각 언어에서의 변수 초기화 방법

39

1) Fortran

DATA Sum /0/, Pi /3.14159/

2) Ada

SUM : INTEGER := 0;

3) C

int x=0, y=0;

4) Algol 68

int sum := 0;

5) Pascal, Modula-2

변수 초기화 방법 제공하지 않음 --> 실행 시 배정문 사용

(40)

4.5 상 수(1)

상수

 프로그램 전반에 걸쳐 고정된 값을 가지는 식별자

 변수와는 달리 값이 변경될 수 없음

 판독성과 프로그램 신뢰성을 향상시킴

 판독성 향상 예

40

area = 5 * 5 * 3.14159;

const double pi = 3.14159;

area = 5 * 5 * pi;

 상수 pi 사용하여 판독성 향상

(41)

4.5 상 수(2)

 신뢰성 향상 예

 학생 수가 변경되어도 이름 상수를 선언하는 문장만 수정하면 됨

 Ada : constant로 이름 상수 선언

 Java : final로 이름 상수 선언

int score[100];

for (i=0; i<100; i++) {

} average = sum / 100;

const int number = 100;

int score[number];

for (i=0; i<number; i++) {

} average = sum / number;

const int number = 200;

 학생 수를 의미하는 상수 number 사용

number: constant integer := 100;

final int number = 100;

참조

관련 문서

// 현재 스레드의 이름을 구하여 지역

– BookShelf 필드: BookShelfIterator가 검색할 책꽂이를 가리키는 변수 (생성자에서 넘겨받은 BookShelf의 인스턴스를 가지고 있음) – index 필드: 책꽂이에서의 현재

그 외 사회 전반에 적용되는 광의의 플랫폼 - 공용플랫폼/ 디자인 플랫폼/ 브랜드 플랫폼 등. 플랫폼은 공용하고 차량의 스타일 등을 결정하는

■ 인접 플랫폼이나 신규 플랫폼을 상시 모니터링 하여 자사의 플랫폼 전략에 반영할 필요 있음. 외부 환경과 기업 상황에 맞는

이렇게 작동을 하게 하려면 각 예제 폼들을 자식 윈 도우로 설정해야 하는데 그 방법으로는 다음과 같이 자식으로 생성될 폼 들의 속성을

• 독립변수와 종속변수가 실제 인과관계가 있는데 없는 것처럼 보이게

• false의 경우에는 if 다음의 문장이 실행되지 않고 if 문을

최종으로