티스토리 뷰

이번 포스팅은 중요한 내용을 담고 있다.

이번에 다룰 내용은 참 많은데, 주제는 Variable이다.

이 Variable에 대해서 name, binding time, blocks, global variable (전역 변수), local variable (지역변수), memory allocation, lifetime, named constant (이름 상수), Type에 대해 알아보도록 하겠다.

 

 

1. Name

Name은 정말 간단하게 변수의 이름을 말한다.

int a; 에서는 a가 변수 이름이다.

이 이름은 간단하지만, 제약이 있는 경우가 있다.

예를 들면 int for = 1; 이런 식으로 for라는 실제 사용되는 단어로 변수의 이름을 설정할 수 없다.

이런 단어들을 predefined name이라고 한다.

 

2. Binding time

변수에 attribute (주소, 값, 타입, 영역, 속성) 등을 할당하는 과정을 binding이라고 한다.

이때 binding을 하는 time에 따라 static binding과 dynamic binding으로 구별할 수 있다.

- static binding : compile time에 bind 하여 실행 과정 중에 변화가 생기지 않는다.

  static attribute에 대해서 일어난다.

- dynamic binding : execution time 도중에 bind 하거나 실행 과정 중에 변화가 생긴다.

  dynamic attribute에 대해서 일어난다.

 

3. Blocks 

Block은 문장들의 집합으로 자체적인 선언을 가질 수 있는 프로그램 단편을 이야기한다.

많이 사용하는 언어인 C, JAVA에서 {} 안에 묶인 내용들을 말한다.

Block 안에 block 이 있는 경우를 nested block이라고 한다.

이 Block들은 run time(=execution time)에 자동으로 stack에 할당된다.

 

4. Local Variable vs Global Variable

지역변수와 전역 변수에 대해서는 많이 들어보았을 것이다.

이를 구별하는 방법은 매우 간단하다.

Main 함수 밖에 위치하면 global variable이고, 그렇지 않으면 local variable이다. 하지만, 메인 함수 밖에 있는 함수 안에서 선언된 variable은 local variable이다. 

import java.util.*;


public class Main {
    int a;
    
    public static void main(String[] args) {
        int b = 1;
    }
    
    public static int getABS(int x) {
        int c = -1;
        return x > 0 ? x : c*x;
    }
}

위 예제의 3개 int variable a, b, c가 local variable인지 global variable인지 판단해보자.

- int a : a는 main 함수 밖에 있으므로 global variable이다.

- int b : b는 main 함수 내에 있으므로 local variable이다.

- int c : c는 main 함수 밖에 있지만, getABS라는 function 안에 선언되어 있으므로 lcoal variable이다.

앞으로, local variable과 global variable이 헷갈리는 일이 없기를 바란다.

** 지역 변수 : Dynamic allocation at run time. 실행 도중 해당 block에 도착하면 할당된다.

** 전역 변수 : Static allocation at compile time.

 

5. Named Constant

이름 상수란, 프로그램 전반에 걸쳐 고정된 값을 가지는 식별자를 말한다.

변수와 달리, 값이 변경될 수 없는 특성을 가진다.

이를 통해 판독성 및 프로그램의 신뢰성을 증진할 수 있다.

C에서는 #DEFINE MAX 100 이런 식으로 설정할 수 있고, java는 다음과 같이 설정할 수 있다.

public class Main {
    static final int MAX = 100;
    
    public static void main(String[] args) {
        MAX=10;
    }
}

위 코드가 과연 실행될까?

실행이 된다고 생각했다면, 이름 상수에 대한 이해를 못한 것이다.

이름 상수 MAX의 값은 바뀔 수 없기 때문에 위 코드는 실행될 수 없다.

즉, MAX라는 int는 프로그램의 실행부터 종료까지 100이라는 값만 가진다.

 

6. Visible

public class Main {
    public static int a = 10;

    public static void main(String[] args) {
        int a = 100;
        System.out.println(a);
        print();
    }

    public static void print() {
        System.out.println(a);
    }
}

Visible, invisible에 관한 내용은 무척 간단하다.

위 코드의 실행 결과는 어떨까?

먼저 main 함수 내의 local variable a가 존재하고, main 함수 밖에 global variable a가 존재하는 것을 확인하자.

이때 main 함수 내에서 System.out.println(a)는 main 함수 안의 local variable인 a=100;의 값이 출력된다.

즉, global variable과 local variable의 이름이 같을 때, global variable은 main이라는 함수 내에서 invisible 하게 된다.

반면, print()라는 함수에서의 a는 누가 될까? 

public static void print()라는 함수 안에는 a라는 variable이 존재하지 않기 때문에, global variable a=10;이 출력된다.

따라서 위 코드의 실행결과는 100 10 이 된다.

 

7. Type

- Basic Data Type : int, char, float, double

- Derived Data Type : array, pointer, structure, union

- Enumeration Data Type : enum

- Void Data Type : void

그리고, JAVA 기준 data type의 크기는 다음과 같다. (Byte 기준으로 작성하였다.)

논리 boolean 1Byte = 8bit true, false
문자 char 2Byte = 16bit 0~65535
정수 byte 1Byte = 8bit -128~127
정수 short 2Byte = 16bit -32,768~32,767
정수 int 4Byte = 32bit -2,147,483,648~2,147,483,647
정수 long 8Byte = 64bit -9,223,372,036,854,775,808~9,223,372,036,854,775,807
실수 float 4Byte = 32bit ±3.40282347E+38, ±1.40239846E-45
실수 double 8Byte = 64bit  -1.79769313486231570E308~+1.79769313486231570E308

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함