프로그래밍 언어론 6-1-3강. 초기화(Initialization)

[프로그래밍 언어론]

2019. 11. 15. 17:27

 

[명령형 언어들에서의 초기화(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 : '사용자 정의 복합 유형 변수'(구조체등)의 하위 구성요소에 재귀적으로 적용되 작동된다.