케네스로그

[Java] 변수의 스코프와 라이프타임 본문

Dev/Java

[Java] 변수의 스코프와 라이프타임

kenasdev 2022. 1. 30. 12:21
반응형

변수의 스코프

변수는 해당 변수가 선언된 위치에 따라 적용되는 범위가 달라지게 됩니다.

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

클래스 내부에 선언되는 변수멤버변수라고 합니다다. 여기서 static 키워드를 사용한 변수는 클래스 변수, static 키워드가 없는 변수를 인스턴스 변수라고 부릅니다. 메소드 내부에 위치한 변수는 해당 메소드에서만 사용할 수 있는 지역변수입니다.

 

 

  • 인스턴스 변수
    클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어집니다. 인스턴스 변수 값을 읽어오거나 저장하기 위해서는 먼저 인스턴스를 생성해야만 합니다.

 

  • 클래스 변수
    멘버변수에 static키워드를 붙힐 경우 클래스 변수가 되며, 한 클래스의 모든 인스턴스가 값을 공유합니다. 클래스 변수는 인스턴스를 생성하지 않고 클래스가 메모리에 올라갔을때 선언되기 때문에 인스턴스에서는 언제든 바로 접근해서 사용할 수 있습니다. 그렇기에 어디서나 접근 가능한 전역변수의 성격을 가집니다.
class LottoTicket {
	public static final LOTTO_PRICE = 1000;
	}

	public static void main(String[] args) {
		System.out.println("Lotto price is " + LottoTicket.LOTTO_PRICE);
	}
}

 

  • 지역 변수
    메소드 내에 선언되어 메소드 내에서만 사용 가능하며 메소드 종료와 함께 메모리에서 사라집니다. for문이나 while에서 사용되는 변수 또한 지역변수이며, 해당 블럭을 벗어나면 사용할 수 없습니다.

 

종류 선언위치 생성시기
클래스 변수 클래스 영역 ClassLoader에 의해 클래스가 초기화되고 프로그램 종료 시 까지 유지
인스턴스 변수 클래스 영역 인스턴스가 생성되고, 메모리에 상주하는 동안유지
지역 변수 클래스 영역 이외의 영역
(메소드 생성자, 초기화 블록 내부)
블록 영역 내에서만 유지

 

static 변수는 인스턴스 변수를 사용할 수 없다!

static변수는 클래스가 로드될 때 생성되며, 인스턴스 변수는 인스턴스가 생성될 때 만들어집니다. 따라서, static 변수가 인스턴스 변수의 값을 참조한다면, 오류가 발생할 수 있습니다.

public class App {
	private static int number = getNumber(); // 오류발생

	private int getNumber() {
		return 10;
	}
}

위의 예시에서 getNumber는 인스턴스가 생성된 이후에 사용이 가능합니다. 따라서, 클래스 변수인 number는 사용할 수 없습니다.

클래스 로드 → 클래스 변수 생성 → 인스턴스 생성 → 인스턴스 변수 생성

 

반응형