[명령형 언어들에서의 초기화(Initialization)]
: 명령형 언어들은 항상 각 선언에 대한 초기값을 지정하는 명령을 제공하진 않는다.
( 이 언어들이 항상 변수에 대한 값을 지정하는 assignment statement를 지원하기 때문에 )
[초기화의 유용성]
1. subroutine에 위치해 있는 static 변수(or 전역변수)들은 유용하게 사용되기 위해서 초기값이 있어야 한다.
func() {
int a = 3; // 초기값 지정해서 뒤에서 변수 a 유용하게 사용 가능
}
2. 정적 할당된 변수들을 선언시점에 초기화 해주면, 실행시점에 할당되는걸 피해 컴파일 시점에 메모리에 선할당(preallocate)될 수 있다.
3. 초기화되지 않은 변수를 실수로 사용하는 것은 프로그래밍 오류중 일반적인 형태중 하나이다.
[built-in types 초기화]
: 대부분의 언어들은 built-in type의 변수들에 대해 선언 시점에 초기화하는것을 허용해준다. (built-in type : int, str 등)
: 초기화에 대한 더 완벽하고 직교적인 접근은 aggregates에 대한 개념을 요구한다. ( aggreagate : 값들 모아놓은 구조체)
[변수 할당 방식에 따른 초기화]
: 초기화는 정적할당된 변수(static-allocated)에 대해서만 시간을 절약한다.
: 스택이나 힙에 할당될 변수(전역변수X)들은 어짜피 실행시점에 초기화되기 때문에 굳이 초기화 하지 않는다.
// 정적 할당=>컴파일 시점에 할당되는 변수=>컴파일 시점에 초기값 할당하면 이득
static int a = 3;
int A(){
// 동적 할당(스택에 저장)=>결국 실행시점에 메모리에 할당=>컴파일시점에초기값할당해도 소용X
int b = 4;
}
[초기화되지 않은 변수 사용 문제]
: 앞서 말했던 초기화 되지 않은 변수를 사용하는 문제는 elaboration(스택등 메모리에 저장되는 실행시점) 이후에만 문제가 발생하는 것이 아니라,
변수의 값을 새로 제공하지 않고 변수의 값을 파괴하는 작업을 수행할때도 발생한다.
# 1. elaboration 이후에 초기화 되지 않은 변수 사용 문제 발견 예시
int a;
...
a = a + 3; // 오류 발생(실행되며 변수 a에 값 할당되는 순간(elaboration)에 문제 발견)
# 2. 변수를 값을 새로 제공하지 않고 변수의 값을 파괴하는 예시(aliases)
int* p = (int*) malloc(sizeof(int) * 10);
int* newp = p; //newp값 초기화(참조모델 - newp와 p가 같은 공간 참조)
free(p); // newp 참조중인데 제거하면.. dangling pointer 문제 발생..
# 3. union 타입에 대해 다중 초기화
: union타입은 내부에서 정의된 변수들중 하나만 사용될것을 가정해 한 메모리공간만 할당받는다.
: 그로인해 해당 타입의 변수들을 여러개 초기화 하면 문제가 발생한다.
typedef union { // 이 type내 변수들중 하나만 사용될것이라 가정
int type;
int intValue;
float floatValue;
double doubleValue;
} UNION;
UNION u;
u.type = 0;
u.intValue = 3; // error
u.type = 2; // error
printf("doubleValue = %lf\n", doubleValue);
[언어에 따른 Default value(기본값)]
: 만약 선언에 대해 초기값이 명시되지 않으면, 언어는 해당 선언된 변수에 대해 default value(기본값)을 부여할 것이다.
1) C언어 : 선언된 정적 할당 변수가 초기화 되어 있지 않고 사용되면, 해당 변수를 '0'으로 초기화 한다 ( 'null' for string )
2) JAVA, C# : 정적 할당 변수뿐만 아니라 모든 클래스 타입 객체들에 대해 비슷한 형태로 제공한다.
3) 대부분의 스크립팅 언어 : 모든 변수, 타입에대해 scope나 lifetime과 관계없이 default 초기 값을 제공한다.
# 대부분의 OS에서 메모리 할당될때 해당 메모리 공간을 0으로 채우다(Zero-initialization의 역할)
# Zero-initialization : '사용자 정의 복합 유형 변수'(구조체등)의 하위 구성요소에 재귀적으로 적용되 작동된다.
'[프로그래밍 언어론]' 카테고리의 다른 글
프로그래밍 언어론 6-1-3강(3). 확실한 초기값 할당 (Definite Assignment) (0) | 2019.11.15 |
---|---|
프로그래밍 언어론 6-1-3강(2). 초기화 동적 확인(Dynamic Checks) (0) | 2019.11.15 |
프로그래밍 언어론 6-1-2강(4). Assignments(할당) - 할당 연산자의 조합 (0) | 2019.11.11 |
프로그래밍 언어론 6-1-2강(3). Assignments(할당) - Orthogonality(직교성) (0) | 2019.11.10 |
프로그래밍 언어론 6-1-2강(2). Assignments(할당) - Boxing (0) | 2019.11.08 |