본문 바로가기

Java/기본 이론

[JAVA] Chapter 18. 변수의 스코프와 라이프 타임

 

1. 변수의 스코프와 라이프 타임 

변수의 스코프(영역)란 변수가 접근할 수 있는 유효 범위를 말한다.

일반적인 규칙은 변수가 선언된 블록내에서만 변수에 접근할 수 있다.

블록은 { }을 말하는데, Java에서 Class와 Method가 블록을 가진다.

 

쉽게 말해 스코프란 변수를 사용할 수 있는 영역이고, 스코프는 변수가 선언되는 영역에 따라 접근하는 방법이 다르다.

 

라이프 타임은 이러한 변수가 유효한 시간을 말하는데, 프로그램이 구동되는 동안 변수가 '값을 담고 있을 수 있는 주기'를 말한다.

라이프 타임은 변수의 종류에 따라 상이하기 때문에 각각의 차이를 이해하는 것이 중요하다. 

 

2. 변수의 종류: 선언 위치에 따른 분류 

변수는 선언한 위치에 따라 멤버변수와 지역 변수로 나뉜다.

멤버변수는 클래스 영역에 선언된 변수로 클래스 변수와 인스턴스 변수가 이에 속한다. 

 

class Samplescope
{
    int a, b; // 인스턴스 변수
    static int c; // 클래스 변수 
    
    void add(int x, int y) // a 와 b는 로컬 변수
	{
    	int sum = x +y; 
        System.out.print("Sumit = " + sum);
    }

    public static void main(String[] args)
    {
    	Sample ob = new Sample();
        ob.add(10,20);
    }
}

class Sample
{
	int num1;
	int num2;
	int add(int a, int b) 
	{
		int c = a + b;
		return c;
	}
}

 

2.1. 클래스 변수(Class Variables)

 

클래스 변수(Class Variables)는 클래스 내부에서 선언된 변수로 모든 블록 외부에서 선언되고 static으로 표시된 변수이다.

클래스 변수의 스코프는 클래스 전체에 해당하며, 프로그램이 끝나거나 클래스가 메모리에 로드되는 동안 유효하다. 

 

2.2. 인스턴스 변수(Instacne Variables)

 

인스턴스 변수(Instacne Variables)는 클래스 내부와 모든 메소드 및 블록 외부에서 선언된 변수를 말한다.

static 메서드를 제외한 클래스 전체를 소코프로 가진다.

객체가 메모리에 남아있을 때까지 유효하다. 

 

클래스 변수 인스턴스 변수
◍ 앞에 static이 붙은 변수로 인스턴스변수와 달리 값을 공유하는 변수이다. 

◍ 클래스가 메모리에 할당할 때 생성된다.(메모리에 1회만 할당된다.)

◍ 한 클래스의 모든 인스턴스들이 공통값을 가져야 할 때 클래스 변수로 선언한다. 

◍ 형태: 클래스이름.클래스변수명
◍ 각각의 인스턴스마다 다른 값을 가져야할 때 사용한다. 

◍ 인스턴스 생성시 생성된다.

 

2.3. 지역변수(Local Variables)

지역변수(Local Variables)는 인스턴스 및 클래스 변수가 아닌 모든 변수를 말한다.

스코프는 선언된 블록 내이며 컨트롤이 선언된 블록을 떠날 때까지 유효하다.

쉽게 말해 지역 변수는 메소드 내에서 선언되어 메소드 내에서만 사용이 가능한 변수를 말한다. 

 

3. 변수의 종류에 따른 이해

 Java는 객체 지향 프로그래밍으로 객체의 상태와 행동을 구체화하는 하며, 모든 데이터를 객체(object)로 취급한다.

이때 객체를 만들어 내기 위한 설계도가 class이고 class는 객체의 상태를 나타내는 field (class에 포함된 변수)와 객체의 행동을 나타내는 method로 구성된다. 

 

Java에서 class를 사용하기 위해서는 class 타입의 객체 선언을 해야 하며, class로부터 객체를 선언하는 과정이 바로 class의 인스턴스 화이다.

한마디로 Java는 class로부터 인스턴스인 ‘객체’를 생성하여 프로그램을 만드는 것이다. 

 

4. 변수에 따른 스코프와 라이프사이클

스코프(Scope)란 변수를 사용할 수 있는 범위를 말한다.

변수가 선언된 위치에 따라 변수의 종류가 달라지며, 이에 따라 변수의 스코프와 라이프사이클이 결정된다.

 

변수의 종류 선언 위치 스코프 라이프사이클
클래스변수 클래스 영역 클래스 전체 클래스가 메모리에 올라간 후 프로그램이 끝날 때 까지
인스턴스변수 클래스 영역 static 블록과 static 메서드를 제외한 클래스 전체 인스턴스가 생성 후 메모리에 살아있을 때 까지
로컬변수 메소드, 생성자, 초기화 블랙 내부 변수가 선언된 블록 내부 변수 선언 후 블록을 벗어날 때 까지 

 

class A {
    int instanceValue; //인스턴스 변수
    static int classValue;//클래스 변수
    (static, 공유 변수) 
    void method(){int localValue = 0; 
    //지역 변수
    }
}

 

5. 초기화 순서 

변수의 종류 초기화 순서
클래스 변수 기본 값 → 명시적 초기화 → 클래스 초기화 블록
인스턴스 변수 기본 값 → 명시적 초기화 → 인스턴스 초기화 블록 → 생성자